USB Camera V4L2 视频录制——ubuntu(1)
2016-08-04 15:16
239 查看
博主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是最终版!下面是我的源码结构
先明确一个知识点:
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_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文件播放器,调试的时候用的上。
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是最终版!下面是我的源码结构
先明确一个知识点:
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_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文件播放器,调试的时候用的上。
相关文章推荐
- Android多媒体学习十五:使用在内置的Camera录制视频
- linux下usb camera图像采集(V4l2)
- Android多媒体——(MidiaRecorder音频录制/视频播放surface/Soundpool提示音/调用系统摄像头camera)
- v4l2视频采集驱动框架(vfe, camera i2c driver,v4l2_subdev等之间的联系)
- Camera preview变形和MediaRecorder录制视频太短崩的问题
- 在Ubuntu下录制桌面视频
- Android系统自带的MediaRecorder结合Camera实现视频录制及播放功能。
- FFMPEG研究: ubuntu下录制/dev/video0/设备视频保存为mp4格式
- 用v4l2和framebuffer实现usb摄像头视频采集并显示
- Android使用MediaRecorder和Camera实现视频录制及播放功能整理
- linux下usb camera图像采集(V4l2)
- camera录制视频的缩略图获取原理心得分享
- camera录制的视频的缩略图的获取原理 android
- 09-15 Camera (摄像机),SoundPool(播放提示音等小音频),VideoView(播放视频),SurfaceView(播放视频),MediaRecorder(录制音频)
- Android多媒体学习十五:使用在内置的Camera录制视频
- 基于V4L2的视频驱动开发(1)---Camera
- 用v4l2和framebuffer实现usb摄像头视频采集并显示
- linux3.3 v4l2视频采集驱动框架(vfe, camera i2c driver,v4l2_subdev等之间的联系)
- Android mtk6572 Camera 录制更大视频文件的修改
- USB Camera V4L2 视频录制——Android(1)