如何使Raspivid跳过h264编码?(摆脱了5秒的延迟流视频)


11

当使用Pi和PI-Cam作为监控摄像头时,有成千上万的论坛和话题讨论如何摆脱5秒钟的延迟。许多教程展示了如何使用vlc通过RTP协议对图像进行编码和流传输,这会导致〜5秒的延迟。

据我说,原因是raspivid正在将流编码为H264,而VLC必须再次对其进行解码,然后将其重新编码为任何RTP。命令行如下所示:

raspivid -w 640 -h 480 -o - -t 0 |cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

第一部分告诉raspivid将视频流传输到标准输出:

raspivid -w 640 -h 480 -o - -t 0 

管道后面的部分告诉VLC进行拾取,并使用h264对其进行解码:

cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

这种多路复用和多路复用是相当多的资源!

我在github上找到了raspicam来源,并且我认为可以在encoder_buffer_callback方法中执行某些操作(当前在848行)以跳过编码。但是我不擅长c语言,也不熟悉视频编码,因此我不知道从哪里开始。

在Github上,我可以看到330个fork,但是它们似乎并不是专门针对raspicam的(而是针对整个userland项目)。我迷失了寻找去掉编码或实现更简单的东西(例如mjpeg)的fork的想法。

具备c和视频编解码器知识的人可以帮助我和其他专长的用户摆脱延迟吗?解决方案可能已经在其中一个分支中了,但是我花了数小时没有任何运气来寻找它。

ps我不是在寻找浏览器解决方案,但我最终希望将其流式传输到Synology,最好使用mjpeg流式传输(但不是通过网页,而是大多数商用ip-cam内置的标准mjpeg流)。第一步是摆脱h264的束缚。


那是一个非常彻底的调查。使用MJPEG是不可能的,因为(在我看的时候)内置的JPEG编码器没有库,软件也很垃圾。我使用高清自定义生成的nginx-rtmp(打包的FLV)设法获得了大约1s的延迟!pi使用了大约30%的CPU,但由于缺少时序帧并导致其FLV,VLC难以对其进行解码:(当我最终使它工作时,我的CCTV软件也使用了VLC接收器和1 720p流使用了40%的CPU,但是不稳定
Piotr Kula 2014年

@ppumkin我不认为MJPEG是不可能的。一旦H264消失了,我们就可以编码为我们想要的任何东西,而无需进行解码和重新编码的开销。实际上拥有H264确实是一种奢侈!只有我们应该能够将其关闭。就像在狭窄的抽水马桶中豪华的软垫软垫和镶有钻石的宝座一样,所以房间里没有其他东西(除了一些可以让我们上下跳一点的净空)...当您打开门时,您必须爬上在高高的扶手上,当您坐下时,腿没有空……
路易·萨默斯

是的,我明白您的意思。我花了几天的时间试图将MJPEG的质量提高到我的CCTV IP服务器。许多事情已经改变,但是由于没有API,因此不存在直接的硬件JPEG编码和流式传输管道。我知道的唯一方法是软件,而我发现的最佳解决方案是nginx-rtmp JPEG接收器。iPhone的HLS实际上效果很好,但是滞后了5s-10s :(
Piotr Kula 2014年

1
您可以尝试在Github项目中将这个问题提出给相机软件。您可能会得到一个解释,说明为什么很难做到这一点,但是如果其他人发现它有用,那么有人可能会实现它。
TomG

demux与解码不同...请检查一下
Flash Thunder

Answers:


5

那可能不是您想要的答案,但是我根本不建议您使用VLC流。

对于一个学校项目,我尝试了一些流媒体选项(也在RPi上!):

  • VLC
  • MJPEG
  • GStreamer

使用VLC和MJPEG(和其他一些不太知名的),我不得不延迟3到5秒..
使用的GStreamer,无延迟,并用最佳分辨率(和很多更多的选择)!
如果您有兴趣,可以在这里查看

如果您要使用它,这是我的管道:

raspivid -t 0 -w 640 -h 480 -fps 25 -b 1200000 -p 0,0,640,480 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=YOUR_IP port=YOUR_PORT

1
是的,我已经尝试过Gstreamer,它在流式传输到PC上时效果很好,但是在Synology DiskStation之类的第三方软件上效果不佳。看起来GStreamer只是重用了h264流,并在不对其进行解码的情况下环绕了流协议,这是一个很好的解决方案,但是不幸的是,对于少数用例而言。如果要在Android设备上查看视频流,则必须为其开发自己的应用程序。MJPEG得到了更广泛的支持,我确信可以将Raspivid更改为跳过不必要的编码,从而将其留给VLC左右。一定要感谢小费
Louis Somers 2014年

1
我也有一个Synology,但还没有尝试过GStreamer(我认为它的功能还不够强大)。顺便说一句,关于Android,您也可以在其中使用GStreamer!我正在将其用于我的项目,并且效果很好:)!
2014年

gstreamer的问题是它不包含timeframeinterval到帧数据中,并且不能作为接收器使用(即使添加了选项!) 6个月前,当我正在寻找saome CCTV节目时,..但是它从未可靠地工作过:(
Piotr Kula

@Val是的,确实有一个适用于Android的SDK,但Play商店中没有很多现成的播放器,它们支持gst-launch-1.0 -v tcpclientsrc host = 11.22.33.44 port = 1234等管道!gdpdepay!rtph264depay!avdec_h264!视频转换!autovideosink sync = false。对于iOS,可用空间更少。Synology是一个出色的集线器,支持大多数主流设备,可以进行运动检测,记录和通知,并且都可以直接使用(并且不会拉扯SD卡)。
2014年

您还在像这样使用吗?有新的U4VL驱动程序,但h264流到VLC的滞后问题仍然相同
Piotr Kula

0

自从我第一次提出这个问题以来,有些人就一直在为此进行努力,而到了此时,有几种选择(奇怪的是,还没有人回答这个问题)。我已经尝试过RaspberrIPCam并取得了一些成功,但是rtsp数据包似乎有一个非常短的TTL之类的东西。将Pi直接连接到PC旁的路由器上,它将可以正常工作。但是,一旦我将凸轮安装在需要的位置,并尝试使用两个路由器之间的两个路由器访问流,就不会出现图像。我检查了源代码,发现TTL设置为最大值。我从来没有完全弄清楚。

当前,我建议RaspberryIPCamera拥有一个不错的用户界面(请参见屏幕截图),甚至还有一个现成的SD卡图像。我已经尝试过SD卡,但是恢复为按此处所述进行手动安装非常成功(我当前的安装)。还提供了将其连接到Synology DiskStation的说明,并且在我的系统上可以正常使用。SD卡映像的问题是我无法将文件系统扩展到SD卡的全部范围(我还想在其上运行其他内容以通过GPIO引脚控制某些继电器)。

上面的解决方案使用UV4L项目的组件。此页面上的UV4L项目的文档还提到:

除其他外,它提供了一个Web界面,可以通过它以各种方式查看视频流,还提供了一个Control Page,该页面可以在与任何Video4Linux应用程序一起流传输时完全控制摄像机设置。

我还没有尝试过它(因为我不想弄乱我的当前设置)。


1
不确定这是否是您的问题,但是如果您要通过路由器发送多播RTSP通信,请确保已启用IGMP侦听,并确保您的PC并未阻止来自路由器的IGMP查询。否则,路由器将不会意识到您的PC正在尝试接收数据包,因此它将永远不会转发它们。
Malvineous
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.