USB Camera V4L2 视频录制——ubuntu(1)

来源:互联网 发布:javascript生成随机数 编辑:程序博客网 时间:2024/04/30 12:38

博主QQ:1356438802


本文工作平台: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是最终版!下面是我的源码结构


先明确一个知识点:

avi只是一个封装格式,里面的视频,可以是任何格式。avi mkv mp4都是封装格式,里面可以有视频流,音频流,字幕流。h264 MJPEG YUV是视频流编码格式。封装格式和视频流编码格式是两个不同的概念。所以avi视频文件里面的视频流可以是h264编码,也可以是MJPEG编码,也可以是YUV编码。
如上图同样是300帧的视频,同样是avi视频文件,视频流编码格式不同,大小差别太大。h264的压缩率真的很高很高!


我的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_MJPEGDQBUF后得到的帧数据可以直接用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文件播放器,调试的时候用的上。



0 0
原创粉丝点击