我在使用RTSP流传输H.264视频时遇到了问题。目标是将摄像头图像实时流式传输到RTSP客户端(最终最好是浏览器插件)。到目前为止,这种方式一直运行得非常好,除了一个问题:视频会在启动时出现卡顿,每几秒钟就会卡顿一次,并且有约4秒的延迟。这很糟糕。
我们的设置是使用x264进行编码(带有零延迟和超快速度),并使用来自ffmpeg 0.6.5的libavformat打包成RTSP / RTP。测试时,我使用gst-launch连接到RTSP服务器接收流。
但是,当直接从另一个GStreamer实例进行RTP流传输时,我已经能够复制相同的问题。
发送机器:
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.
在互联网上广泛建议的一种“修复”方式是在xvimagesink中使用sync=false
:
gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink sync=false
视频将以几乎零延迟的方式播放,即使经过我们的相机软件测试也是如此。这对于测试很有用,但对于部署来说并不是很有用,因为它不能与Totem、VLC或它们的浏览器插件嵌入一起使用。我想尝试从源头解决这个问题;我怀疑x264在H.264流上缺少某种时间戳信息,或者可能是RTP负载上。有没有办法修改源gst管道,以便我不需要在接收端使用"sync=false"?
如果不可能,我该如何告诉客户端(通过SDP或其他方式)流不应该同步?最终,我们会使用某种VLC插件将其嵌入到浏览器中,因此适用于那里的解决方案甚至更好。
gstrtpbin name=rtpbin latency=40 udpsrc caps=".." port=50000
时,如何使用gstrtpjitterbuffer
?您能否分享在使用 gstrtpbin 时的接收器部分? - user285594gstrtpjitterbuffer
并解释了sink=false
的含义。你能否解释一下当sync=true
时,管道是如何驱动的? - joanpau