ubuntu中USB摄像头gstreamer方式图像采集、显示、录像及回放功能设计——(1)


背景

最近由于项目需求,需要在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以及主机的性能。

 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代码就是基于命令行的功能复现,在接下来会再进行介绍。

扫描二维码关注公众号,回复: 14668701 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_32196869/article/details/124495493