博主QQ:1356438802
QQ群:473383394——UVC&OpenCV47
本文工作平台:Ubuntu 12.04 + x264-lib-v120
前面研究了大半年的OpenCV开源库,其实也是断断续续的研究哈,本来是要做USB Camera图像识别的。但是公司有个项目要做USB Camera视频录制,所以先看了下OpenCV对于USB Camera录像的支持,在windows平台是可以的《win7_64bits下QT使用openCV库(3)》,在Ubuntu也是可以的《我的Ubuntu安装使用openCV记录(3)——for QT》,在Android上就不行《我的Opencv4Android添加V4L2支持的移植记录(3)》,需要FFMPEG的支持,而前面我已经研究过了FFMPEG,其在Android上的运行效率不乐观。所以我就打消了用OpenCV来做USB Camera录像的念头!
于是我很不情愿的去从基层做起,我真的很不想去重复造*,FFMPEG多么好的视频编码库,还内置了V4L2读写,很可惜Android平台太弱了,支撑不起来!那么我就自己用V4L2-API去读取数据帧,自己解码,编码压缩,写入视频文件喽!
下载:http://download.csdn.net/detail/luoyouren/9595096
其中uvc_avilib_3是最终版!下面是我的源码结构
先明确一个知识点:
我的USB Camera支持YUV和MJPEG两种视频格式读取,所以我可以做很多实验:
1. 对于luo_YUYV.avi
a. 可以V4L2数据读取格式设置为V4L2_PIX_FMT_YUYV(422),DQBUF后得到的帧数据可以直接用avilib写入文件,这样也是可以播放的。
b. 也可以V4L2数据读取格式设置为V4L2_PIX_FMT_MJPEG,DQBUF后得到的帧数据,jpeg_decode解码成YUV422格式后,再写入文件。
2. 对于luo_MJPEG.avi,V4L2数据读取格式设置为V4L2_PIX_FMT_MJPEG,DQBUF后得到的帧数据可以直接用avilib写入文件,就可以播放。
3.对于luo_h264.avi
a. 可以V4L2数据读取格式设置为V4L2_PIX_FMT_YUYV(422),DQBUF后得到的帧数据,用compress_frame压缩成h264(实际上里面先把YUV422转换成了YUV420P,这是h264需要的源数据格式),再用avilib写入文件,可以播放。
b. 也可以V4L2数据读取格式设置为V4L2_PIX_FMT_MJPEG,DQBUF后得到的帧数据,jpeg_decode解码成YUV422格式后,继续用compress_frame压缩成h264,最后用avilib写入文件,就可以播放。
我这里的h264编码用的是x264开源库,Ubuntu可以直接apt-get install安装,不过h264encoder.c这个文件我是抄的别人的,暂时来看压缩录制效果没有问题。如果大家用了我的代码在Ubuntu平台压缩录制有问题,请告知我!
PS:
1. 另外几个文件夹的源码是我对某些单独的模块进行调试,比如jpeg_decode / h264encoder / avilib,像这种多模块的程序调试,最好心不要那么大,一点一点往前拱,总能达到目标!
2. 附上YUV播放器和h264文件播放器,调试的时候用的上。