2012-07-09 68 views
11

我在通过RTSP传输H.264视频时遇到了一些问题。我们的目标是将摄像头图像直播到RTSP客户端(最终是一个浏览器插件)。迄今为止,这一切都非常顺利,除了一个问题:视频将在启动时滞后,每隔几秒结束,并且延迟约4秒。这不好。Streaming RTP/RTSP:sync/timestamp problems

我们的设置是用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插件将其嵌入到浏览器中,因此,在那里工作的解决方案会更好。

回答

7

您可以将“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”属性(在源管道上)。

+0

谢谢你..同样的问题,但我已经在接收端给予“sync = false”,它为我工作。 – 2016-08-12 10:41:53

10

由于发布了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 
+0

+1,但是当我们使用gst-launch-0.10 -v'gstrtpbin name = rtpbin latency = 40 udpsrc caps =“..”port = 50000'时,你如何使用'gstrtpjitterbuffer',你能分享一下接收器部分吗?使用gstrtpbin使用? – YumYumYum 2013-11-18 17:19:46

+0

gsrtpbin已包含gstrtpjitterbuffer。至于命令行,我会尽力回复你。目前我无法尝试,因为我没有安装GStreamer 0.10。 (顺便说一句,你真的应该移动到1.0,这是强烈建议。) – 2014-02-18 13:28:11

+0

@dv_感谢您指向'gstrtpjitterbuffer'和'sink = false'的解释。你能否解释一下如何驱动管道(当'sync = true'时)? – joanpau 2015-05-06 19:52:22

0

我不知道有多少,这是真的,但是当我跑我没有管道将电池充电器连接到我的笔记本电脑,它曾经给我带来同样的警告,当我插上电源时,请相信我的工作。我认为这可能是因为旧的CMOS电池,这是不应该的,因为它应该是。因为它负责时钟产生。

+1

在这种情况下,我怀疑您的笔记本电脑有电源配置选项,以减少使用电池供电时的最大可用CPU功率。当你用充电器运行时,你可以获得100%的CPU,当你使用电池运行时,你会减少。因此“或这台电脑太慢”。 – KevinM 2014-05-26 07:56:28