我在通过 RTSP 流式传输 H.264 视频时遇到了一些问题。目标是将摄像机图像实时流式传输到 RTSP 客户端(理想情况下最终是浏览器插件)。到目前为止,这一直运行良好,除了一个问题:视频在启动时会滞后,每隔几秒就会卡顿,并且有大约 4 秒的延迟。这是不好的。
我们的设置是使用 x264(w/zerolatency 和超快)进行编码,并使用 ffmpeg 0.6.5 中的 libavformat 打包到 RTSP/RTP 中。为了进行测试,我在连接到 RTSP 服务器时使用带有 gst-launch 的 GStreamer 管道接收流。但是,当直接从另一个仅使用 RTP 的 GStreamer 实例进行流式传输时,我已经能够重现相同的问题。
发送机:
gst-launch videotestsrc ! x264enc tune=zerolatency ! rtph264pay ! udpsink host=10.89.6.3
收货机:
gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink
您也可以在同一台机器上同时运行它们,只需将发送方的主机更改为 127.0.0.1。在接收端,您应该注意到视频卡顿且通常表现不佳,以及控制台上的重复警告:
WARNING: from element /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0: A lot of buffers are being dropped.
Additional debug info:
gstbasesink.c(2875): gst_base_sink_is_too_late (): /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0:
There may be a timestamping problem, or this computer is too slow.
我在互联网上看到的一个普遍建议的“修复”是sync=false
与 xvimagesink 一起使用:
gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink sync=false
即使使用我们的相机软件进行测试,视频也会以接近零的延迟播放。这对于测试很有用,但对于部署不是很有用,因为它不适用于 Totem、VLC 或它们的浏览器插件嵌入。
我想尝试从源头解决问题;我怀疑 x264 或 RTP 有效负载上的 H.264 流上缺少某种时间戳信息。有什么方法可以修改源gst 管道,以便我不需要在接收器上使用sync=false
?
如果这不可能,我如何告诉客户端(通过 SDP 或其他方式)不应该同步流?最终,我们使用某种 VLC 插件将其嵌入到浏览器中,因此可以在那里工作的解决方案会更好。