我在通过RTSP传输H.264视频时遇到了一些问题。目标是将摄像机图像直播到RTSP客户端(理想情况下是最终的浏览器插件)。到目前为止,这个问题一直很顺利,除了一个问题:视频会在启动时滞后,每隔几秒就会断断续续,并且延迟时间约为4秒。这很糟糕。
我们的设置是使用x264(w / zerolatency& ultrafast)进行编码,并使用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插件将其嵌入到浏览器中,因此在那里工作的解决方案会更好。
答案 0 :(得分:11)
在root.ctrlc发布时,您可以使用sync = FALSE。但是,您可能会注意到发送方端的CPU使用量大幅增加。原因是sync = FALSE告诉接收器在收到缓冲区后立即将其推出。水槽驱动整个管道。因此,sync = FALSE将使管道对视频进行编码并尽快将其推送到UDP;它将使用100%的CPU。
你需要的是gstrtpjitterbuffer。它还会处理时间戳,这些时间戳在这里被打破。
示例发件人:
gst-launch-0.10 -v videotestsrc ! videorate ! video/x-raw-yuv, framerate=30/1 ! ffmpegcolorspace ! x264enc ! rtph264pay ! udpsink port=50000 host=<sender IP>
示例接收者:
gst-launch-0.10 udpsrc port=50000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000 , encoding-name=(string)H264 , payload=(int)96" ! gstrtpjitterbuffer ! rtph264depay ! ffdec_h264 ! ffmpegcolorspace ! videoscale ! "video/x-raw-yuv, width=320, height=240" ! xvimagesink
答案 1 :(得分:8)
您可以将“sync = false”添加到源gst管道。在Ubuntu 12.04上似乎删除了滞后和错误消息。
这是我在源上使用的命令:
gst-launch videotestsrc ! x264enc tune=zerolatency ! rtph264pay ! udpsink host=127.0.0.1 sync=false
这是我在接收器上使用的内容:
gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink
不幸的是,我不知道为什么会这样,甚至“sync = false”属性属于哪个组件(在源管道上)。
答案 2 :(得分:0)
我不知道这是多少,但是当我在没有将电池充电器连接到我的笔记本电脑的情况下运行我的管道时,它曾经向我发出同样的警告,当我插上电源时,请相信我工作。我认为这可能是因为旧的CMOS电池,它不能正常工作。因为它负责生成时钟。