背景
最近由于项目需求,需要在X86平台及ARM平台中进行USB摄像头视频的采集、显示、录像及回放功能,尝试了许多方式来进行,比如openCV库,mplayer库的方式,虽然它们都能够进行USB摄像头的采集显示,但是实现需求方面总是存在各种问题:(1)性能不行,图像采集的分辨率很低或帧率很低,图像丢帧问题比较严重;(2)不能实现流畅的一边录像一边显示,在1920*1080分辨率延迟最大在200左右,在(也有可能是自己的技术问题,有大神可以分享下实现方法)。最终我还是选择了在linux中使用起来比便的gstreamer库进行学习研究,发现其能很好的满足我们的需求,接下来我来分享下其中主要内容。
一、USB摄像头图像格式
目前USB接口的摄像头还是比较常见的,我用的是一款HK的1080P高清摄像头,USB摄像头采用UVC协议来进行数据传输的,具体的这个我也研究不深。我们主要需要注意的是USB摄像头的传输图像数据格式,一般是MJPG与YUV数据格式,MJPG压缩格式数据一般更容易满足USB传输需求,而YUV数据原始流数据传输,数量量太大很难在USB上实时传输。接下来介绍USB摄像头图像格式分析工具及方法。
1.安装v4l2-ctl库
sudo apt install v4l-utils
2.找到挂载节点
使用如下命令,会查找到所有视频设备节点,其中/dev/video0是我们主要所需要用到的。
v4l2-ctl --list-devices
3.图像格式分析
使用如下命令,可以看到USB摄像机的支持的所有视频格式信息,可以看到其支持MJPG与YUV两种格式,每种格式有对应支持的分辨率、帧率信息。
v4l2-ctl -d /dev/video0 --list-formats-ext --all
二、Gstreamer 简介
gstreamer是一种多媒体库,GStreamer采用基于插件(plugin)和管道(pipeline)的体系结构,其内部提供了许多组件,可以按照我们需要的功能在我们设计的管道中添加我们需要的组件,然后进行连接起来,最后就可以控制这个管道的工作,具体原理可以自己查找下相关资料。
gstreamer使用手册:
https://gstreamer.freedesktop.org/documentation/tutorials/index.html?gi-language=c
gstreamer的安装方法可以参考: https://blog.csdn.net/qq_32196869/article/details/124278298?spm=1001.2014.3001.5501
三、Gstreamer 命令行
1.显示MJPG格式,1280*720@30fps视频
gst-launch-1.0 v4l2src device=/dev/video0 ! image/jpeg,width=1280,height=720,framerate=30/1 ! jpegdec ! videoconvert ! xvimagesink
2.显示YUV格式,1280*720@15fps视频,容易卡顿
备注:这个性能主要看USB接口是2.0还是3.0、YUV传输图像fps以及主机的性能。文章来源:https://www.toymoban.com/news/detail-400660.html
gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,format=YUY2,width=1280,height=720,framerate=15/1 ! videorate ! videoscale ! videoconvert ! xvimagesink
3. 显示MJPG格式,1280*720@30fps视频并同时抓拍(通过回调函数的方式)
gst-lanuch-1.0 v4l2src device=/dev/video0 ! image/jpeg,width=1280,height=720 ! jpegdec ! tee name=srctee srctee. ! queue2 ! xvimagesink srctee. ! queue2 ! videoconvert ! capsfilter video/x-raw,format=RGB ! fsink
4.显示MJPG格式,1280*720@30fps视频并同时抓拍(通过回调函数的方式),此外并进行录像功能
gst-launch-1.0 v4l2src device=/dev/video0 ! image/jpeg,width=1280,height=720 ! jpegdec ! videoconvert ! tee name=srctee srctee. ! queue2 ! xvimagesink srctee. ! queue2 ! x264enc threads=4 sliced-threads=TRUE tune=zerolatency ! matroskamux ! filesink location = output.mp4 srctee. ! queue2 ! videoconvert ! video/x-raw,format=RGB ! fakesink
5.回放录像的视频(该命令不能直接执行,而是代码中实现的基本原理)
gst-launch-1.0 filesrc location=test.mp4 ! qtdemux ! queue ! avdec_h264 ! videoconvert ! xvimagesink
总结
以上介绍了Gstreamer使用的背景及需求,以及通过Gstreamer实现显示、录像、截图、回放功能的实现中的命令行,gstreamer代码就是基于命令行的功能复现,在接下来会再进行介绍。文章来源地址https://www.toymoban.com/news/detail-400660.html
到了这里,关于ubuntu中USB摄像头gstreamer方式图像采集、显示、录像及回放功能设计——(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!