广播h264视频,而无需从Logitech C920摄像机进行转码



考虑到相机连接到较弱的BeagleBone Blue(处理器负载不超过30%)并且视频流通过wifi路由器传输到笔记本电脑,因此延迟不超过0.3秒。

最初,任务是将视频从机器人广播到大型计算机,而无需将处理器加载到机器人上并且没有延迟。 在对用于此任务的摄像机和程序进行谷歌搜索的过程中,发现在摄像机本身上有基于硬件的视频编码的摄像机 ,之后购买了Logitech C920摄像机。 然后开始进行测试和实验,在此过程中找到了两个没有转码的翻译选项。

在Ubuntu 16.04上检查了所有其他操作,第二个选项可能在Windows上有效

通过cvlc和v4l2从Logitech C920摄像机广播硬件编码的视频


clvc-服务器通过命令行从vlc广播视频。

硬件编码视频流


将pixelformat相机设置为H264

v4l2-ctl --device=/dev/video1 --set-fmt-video=width=800,height=600,pixelformat=1 

使用vlc测试H264,因此它不会重置设置:

 cvlc v4l2:///dev/video1 --demux h264 

如果尝试这样做,vlc将在播放之前重置设置:

 cvlc v4l2:///dev/video1:chroma=h264 

播放作品。 我们从相机获取H264流。 现在,让我们通过HTTP在网络上传递:

 cvlc v4l2:///dev/video1:chroma=h264:width=800:height=600 --sout '#standard{access=http,mux=ts,dst=localhost:8080,name=stream,mime=video/ts}' -vvv 

(在网络上,您需要使用本地设备的IP地址而不是本地主机)

接收器启动:

 mplayer http://localhost:8080/ 

事实证明,MPEG-TS允许mplayer在任何时间稍有延迟(可能正在等待关键帧或某秒)连接到流。

如果使用mux = avi,mime = video / avi,则需要在启动vlc时运行mplayer,否则mplayer将不会开始播放。

ffmpeg错误


  • 如果尝试使用ffmpeg而不是vlc播放,则可能会遇到此问题: ffmpeg.org/trac/ffmpeg/ticket/1387
  • 一旦运行ffmpeg,它将切换到“视频:rawvideo(YUY2 / 0x32595559)”
  • 当它接受MJPEG时,它不适用于H.264
  • 使用qv4l2时也会发生同样的事情:在H264模式下开始捕获实际上会为您提供YUY2视频窗口

播放硬件解码的视频


Mplayer可以播放帧缓冲,请确保X不起作用并输入:

 mplayer http://192.168.1.100:8080/ -fs -framedrop -vo fbdev 

如果需要,还可以在X窗口中播放:从命令行运行X:

 Xorg -retro &> /dev/zero 

大量的fbdev错误消息我们默默地放在/ dev / zero中

播放来自LAN vlc来源的视频流(请参见上文):

 DISPLAY=":0" mplayer http://192.168.1.100:8080/ -fs -framedrop 


树莓派


如果您在图片中遇到伪像,并且使用Raspberry Pi的流,请使用:

 cvlc v4l2:///dev/video0:chroma=h264 ... 

您可能需要更新固件:

 apt-get install rpi-update raspi-config rpi-update reboot 

通过cvlc和v4l2广播摘要


测试表明,Beaglebone Blue上的处理器负载不超过30%,这对于性能较弱的处理器而言非常好,但是尚不清楚如何将该视频推送到ROS中。

如果WiFi带宽不足,视频延迟会大大增加,从理论上讲,这可以通过从tcp切换到udp来解决,cvlc文档提到了通过udp广播的可能性。

通过Gstreamer从Logitech C920摄像机广播硬件编码的视频


在Gstreamer中支持此方法的原始开发人员文章。
在Ubuntu 16.04上安装gstreamer

 sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools sudo apt-get install libgstreamer-plugins-base1.0-dev 

uvch264src源代码允许您执行以下操作:


  • 同时捕获h264硬件编码的视频流和搜寻器视频流。
  • 配置硬件视频编码(比特率,关键帧等)

辅助取景器源是一个有趣的概念。 除了主要的H.264流之外,您还可以获得MJPG或YUV格式的低分辨率辅助流。 我不确定这是否是gstreamer相机,驱动程序或源代码块的功能,但是我希望它对我们的Beaglebone相机有用,只要该功能不使用太大的处理器就可以在原始图像和jpg之间转换。

以下是显示高分辨率H.264流和取景器流的管道的示例:

 gst-launch-1.0 -v -e uvch264src device=/dev/video0 name=src auto-start=true src.vfsrc ! queue ! video/x-raw,format=YUY2,width=320,height=240,framerate=10/1 ! xvimagesink sync=false src.vidsrc ! queue ! video/x-h264,width=1280,height=720,framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink sync=false 

H.264主流使用avdec_h264块进行解码,可通过gst-libav软件包进行访问, 请参阅oz9aec Wiki上的注释 。 如果不需要,取景器面板可以连接到假链接,但是我不认为可以将其禁用(您仍然可以禁用它)。 至少这是我正在阅读KaKaRoTo原始博客文章的印象。

当您看到可以为此源块配置的大量参数时,您可能会过载:

 gst-inspect-1.0 uvch264src 

uvch264src参数列表
工厂详细信息:
无排名(0)
长名称UVC H264来源
Klass来源/视频
说明UVC H264编码相机源
作者Youness Alaoui <youness.alaoui@collabora.co.uk>

插件详细信息:
名称uvch264
说明符合UVC的H264编码相机插件
文件名/usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstuvch264.so
版本1.8.3
许可证LGPL
源模块gst-plugins-bad
来源发布日期2016-08-19
二进制软件包GStreamer Bad Plugins(Ubuntu)
原始URL launchpad.net/distros/ubuntu/+source/gst-plugins-bad1.0

G对象
+ ---- GInitiallyUnown
+ ---- GstObject
+ ---- GstElement
+ ---- GstBin
+ ---- GstBaseCameraSrc
+ ---- GstUvcH264Src

已实现的接口:
Gstchildproxy

垫模板:
SRC模板:“ vidsrc”
可用性:始终
能力:
视频/ x-raw
格式:{I420,YV12,YUY2,UYVY,AYUV,RGBx,BGRx,xRGB,xBGR,RGBA,BGRA,ARGB,ABGR,RGB,BGR,Y41B,Y42B,YVYU,Y444,v210,v216,NV12,NV21,NV16 ,NV61,NV24,GRAY8,GRAY16_BE,GRAY16_LE,v308,RGB16,BGR16,RGB15,BGR15,UYVP,A420,RGB8P,YUV9,YVU9,IYU1,ARGB64,AYUV64,r210,I420_10LE,I420_22_10410410410B ,GBR,GBR_10LE,GBR_10BE,NV12_64Z32,A420_10LE,A420_10BE,A422_10LE,A422_10BE,A444_10LE,A444_10BE}
宽度:[1,2147483647]
高度:[1,2147483647]
帧率:[0/1,2147483647/1]
图片/ jpeg
宽度:[1,2147483647]
高度:[1,2147483647]
帧率:[0/1,2147483647/1]
视频/ x-h264
宽度:[1,2147483647]
高度:[1,2147483647]
帧率:[0/1,2147483647/1]
流格式:{byte-stream,avc}
对齐方式:au
配置文件:{高,主要,基线,受约束的基线}

SRC模板:“ imgsrc”
可用性:始终
能力:


SRC模板:“ vfsrc”
可用性:始终
能力:
视频/ x-raw
格式:{I420,YV12,YUY2,UYVY,AYUV,RGBx,BGRx,xRGB,xBGR,RGBA,BGRA,ARGB,ABGR,RGB,BGR,Y41B,Y42B,YVYU,Y444,v210,v216,NV12,NV21,NV16 ,NV61,NV24,GRAY8,GRAY16_BE,GRAY16_LE,v308,RGB16,BGR16,RGB15,BGR15,UYVP,A420,RGB8P,YUV9,YVU9,IYU1,ARGB64,AYUV64,r210,I420_10LE,I420_22_10410410410B ,GBR,GBR_10LE,GBR_10BE,NV12_64Z32,A420_10LE,A420_10BE,A422_10LE,A422_10BE,A444_10LE,A444_10BE}
宽度:[1,2147483647]
高度:[1,2147483647]
帧率:[0/1,2147483647/1]
图片/ jpeg
宽度:[1,2147483647]
高度:[1,2147483647]
帧率:[0/1,2147483647/1]

元素标志:
未设置标志

箱标志:
未设置标志

元素实现:
具有change_state()函数:0x7ff438f22ba0

元素没有时钟功能。
元素没有URI处理功能。

护垫:
Src:“ vfsrc”
Src:“ imgsrc”
SRC:“ vidsrc”

元素属性:
名称:对象的名称
标志:读,写
弦乐 默认值:“ uvch264src0”
parent:对象的父对象
标志:读,写
类型为“ GstObject”的对象
异步处理:bin将处理异步状态更改
标志:读,写
布尔值。 默认值:false
消息转发:转发所有子消息
标志:读,写
布尔值。 默认值:false
模式:捕获模式(静态图像捕获或视频录制)
标志:读,写
枚举“ GstCameraBin2Mode”默认值:2,“模式视频”
(1):模式图像-静止图像捕获(默认)
(2):模式视频-视频录制
zoom:数字缩放系数(例如1.5表示1.5倍)
标志:读,写
飘 范围:1-3.402823e + 38默认值:1
最大缩放:数字缩放系数(例如1.5表示1.5倍)
标志:可读
飘 范围:1-3.402823e + 38默认值:10
准备捕获:通知此元素已准备好开始另一个捕获
标志:可读
布尔值。 默认值:true
后预览:如果捕获的预览图像应发布到公交车上
标志:读,写
布尔值。 默认值:true
Preview-caps:要发布的预览图像的大写(NULL表示ANY)
标志:读,写
任何

预览过滤器:用于处理预览图像数据的自定义预览过滤器
标志:读,写
类型为“ GstElement”的对象
自动启动:进入暂停状态时自动开始捕获
标志:读,写
布尔值。 默认值:false
colorspace-name:colorspace元素的名称
标志:读,写,只能为NULL或READY
弦乐 默认值:“ videoconvert”
jpeg-decoder-name:jpeg解码器元素的名称
标志:读,写,只能为NULL或READY
弦乐 默认值:“ jpegdec”
num-clock-samples:为PTS同步收集的时钟样本数(-1 =无限)
标志:读,写,可以为NULL,READY,PAUSED或PLAYING
整数 范围:0-2147483647默认值:0
num-buffers:发送EOS之前要输出的缓冲区数(-1 =无限)
标志:读,写
整数 范围:-1-2147483647默认值:-1
设备:设备位置
标志:读,写
弦乐 默认值:“ / dev / video0”
device-name:设备名称
标志:可读
弦乐 默认值:“”
初始比特率:初始比特率(以位/秒为单位)(静态控制)
标志:读,写,只能为NULL或READY
无符号整数。 范围:0-4294967295默认值:3,000,000
切片单位:切片单位(静态控制)
标志:读,写,只能为NULL或READY
无符号整数。 范围:0-65535默认:4
slice-mode:定义slice-units属性的单位(静态控件)
标志:读,写,只能为NULL或READY
枚举“ UvcH264SliceMode”默认值:3,“切片/帧”
(0):已忽略-已忽略
(1):位/条-每条位
(2):MB /切片-每个切片MB
(3):切片/帧-每帧切片
iframe-period:IDR帧之间的时间(以毫秒为单位)(静态控制)
标志:读,写,只能为NULL或READY
无符号整数。 范围:0-65535默认:10000
用法类型:用法类型(静态控制)
标志:读,写,只能为NULL或READY
枚举“ UvcH264UsageType”默认值:1,“实时”
(1):实时-实时(视频会议)
(2):广播-广播
(3):存储-存储
(4):ucconfig0-UCConfig 0
(5):ucconfig1-UCConfig 1
(6):ucconfig2q-UCConfig 2Q
(7):ucconfig2s-UCConfig 2S
(8):ucconfig3-UCConfig 3
熵:熵(静态控制)
标志:读,写,只能为NULL或READY
枚举“ UvcH264Entropy”默认值:0,“ cavlc”
(0):cavlc-CAVLC
(1):cabac-CABAC
enable-sei:启用SEI图片计时(静态控制)
标志:读,写,只能为NULL或READY
布尔值。 默认值:false
num-reorder-frames:参考帧之间的B帧数(静态控制)
标志:读,写,只能为NULL或READY
无符号整数。 范围:0-255默认:0
预览翻转:非H.264流的水平翻转图像(静态控制)
标志:读,写,只能为NULL或READY
布尔值。 默认值:false
漏斗大小:漏斗大小的大小(以毫秒为单位)(静态控制)
标志:读,写,只能为NULL或READY
无符号整数。 范围:0-65535默认:1000
速率控制:速率控制模式(静态和动态控制)
标志:读,写,可以为NULL,READY,PAUSED或PLAYING
枚举“ UvcH264RateControl”默认值:1,“ cbr”
(1):cbr-恒定比特率
(2):vbr-可变比特率
(3):qp-恒定QP
固定帧率:固定帧率(静态和动态控制)
标志:读,写,可以为NULL,READY,PAUSED或PLAYING
布尔值。 默认值:false
max-mbps:每秒最大处理速率的宏块数
标志:可读
无符号整数。 范围:0-4294967295默认值:0
level-idc:级别IDC(动态控制)
标志:读,写,可以为NULL,READY,PAUSED或PLAYING
无符号整数。 范围:0-255默认:40
peak-bitrate:峰值比特率(以位/秒为单位)(动态控制)
标志:读,写,可以为NULL,READY,PAUSED或PLAYING
无符号整数。 范围:0-4294967295默认值:3,000,000
平均比特率:平均比特率(以位/秒为单位)(动态控制)
标志:读,写,可以为NULL,READY,PAUSED或PLAYING
无符号整数。 范围:0-4294967295默认值:3,000,000
min-iframe-qp:I帧的最小量化步长(动态控制)
标志:读,写,可以为NULL,READY,PAUSED或PLAYING
整数 范围:-127-127默认:10
max-iframe-qp:I帧的最小量化步长(动态控制)
标志:读,写,可以为NULL,READY,PAUSED或PLAYING
整数 范围:-127-127默认:46
min-pframe-qp:P帧的最小量化步长(动态控制)
标志:读,写,可以为NULL,READY,PAUSED或PLAYING
整数 范围:-127-127默认:10
max-pframe-qp:P帧的最小量化步长(动态控制)
标志:读,写,可以为NULL,READY,PAUSED或PLAYING
整数 范围:-127-127默认:46
min-bframe-qp:B帧的最小量化步长(动态控制)
标志:读,写,可以为NULL,READY,PAUSED或PLAYING
整数 范围:-127-127默认:10
max-bframe-qp:B帧的最小量化步长(动态控制)
标志:读,写,可以为NULL,READY,PAUSED或PLAYING
整数 范围:-127-127默认:46
ltr-buffer-size:长期参考帧总数(动态控制)
标志:读,写,可以为NULL,READY,PAUSED或PLAYING
整数 范围:0-255默认:0
ltr-encoder-control:设备可以控制的LTR帧数(动态控制)
标志:读,写,可以为NULL,READY,PAUSED或PLAYING
整数 范围:0-255默认:0

元素动作:
“获取枚举设置”:gboolean user_function(GstElement *对象,
gchararray arg0,
gpointer arg1,
gpointer arg2);
“获取布尔值设置”:gboolean user_function(GstElement *对象,
gchararray arg0,
gpointer arg1,
gpointer arg2);
“获取设置”:gboolean user_function(GstElement *对象,
gchararray arg0,
gpointer arg1,
gpointer arg2,
gpointer arg3);
“开始捕获”:void user_function(GstElement *对象);
“停止捕获”:void user_function(GstElement *对象);

其中许多参数可用于配置H.264压缩中的参数。 考虑到压缩是由相机内部的芯片执行的,这让我感到非常惊讶。 以下示例将默认数据速率从3 Mbps增加到5 Mbps,并将默认关键帧间隔从10秒减少到3秒:

 gst-launch-1.0 -v -e uvch264src initial-bitrate=5000000 average-bitrate=5000000 iframe-period=3000 device=/dev/video0 name=src auto-start=true src.vfsrc ! queue ! video/x-raw,format=YUY2,width=320,height=240,framerate=10/1 ! xvimagesink sync=false src.vidsrc ! queue ! video/x-h264,width=1280,height=720,framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink sync=false 

另一方面,没有用于调整网络摄像机常规参数的参数,例如对比度,亮度,焦点等。因此,要配置它们,我们仍然需要外部工具,例如v4l2.ctl或下一节。

v4l2src


看起来我们也可以使用旧的v4l2src来从Logitech C920捕获H.264编码的流:

 gst-launch-1.0 -v -e v4l2src device=/dev/video1 ! queue ! video/x-h264,width=1280,height=720,framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink sync=false 

这可能是由于gstreamer和V4L2的发展所致。 如果您不需要更改H.264压缩设置,则此选项看起来更简单,这使我们可以访问摄像机设置,例如亮度和对比度。 它还具有处于良好的插件包中的优点,该插件包将来可能会更好地保留。

通过Gstreamer进行网络广播


在接收计算机上,启动接收器:

 gst-launch-1.0 -v udpsrc port=6666 ! application/x-rtp, encoding-name=H264 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink 

在带有摄像头的设备上,我们开始传输硬件编码的视频:

 gst-launch-1.0 uvch264src name=src auto-start=true src.vidsrc ! video/x-h264,width=160,height=120,framerate=30/1 ! h264parse ! rtph264pay ! udpsink host=192.168.1.196 port=6666 

特别感谢Amomum帮助我编写此代码。

通过Gstreamer的视频广播延迟摘要


即使分辨率为1920 * 1080,Beaglebone Blue上的处理器负载也不会超过30%,并且视频延迟不会超过0.3秒。 是的,因为此版本中的视频是通过udp广播的,所以当丢包时,图片会落到下一个关键帧,但是我们可以对其进行配置,以便更频繁地发送关键帧。

ROS任务


现在仍然只有将接收到的视频推送到ROS中,如果有人可以提供帮助,请亲自撰写。

Source: https://habr.com/ru/post/zh-CN415567/


All Articles