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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Ubuntu