首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流式RTP/RTSP:同步/时间戳问题

流式RTP/RTSP:同步/时间戳问题
EN

Stack Overflow用户
提问于 2012-07-09 14:57:00
回答 3查看 30.6K关注 1票数 13

我在RTSP上播放H.264视频有一些困难。其目标是将摄像机图像实时流到RTSP客户端(理想情况下,最终是一个浏览器插件)。到目前为止,它一直运行得很好,除了一个问题:视频在启动时就会滞后,每隔几秒钟就会结巴一次,并且有大约4秒的延迟。这很糟糕。

我们的设置是使用x264 (w/零和超快)进行编码,并使用ffmpeg 0.6.5中的libavformat打包到RTSP/RTP中。为了进行测试,在连接到RTSP服务器时,我正在接收带有gst启动的GStreamer管道的流。但是,当直接从另一个GStreamer实例仅用RTP流时,我已经能够重现相同的问题。

发送机:

代码语言:javascript
复制
gst-launch videotestsrc ! x264enc tune=zerolatency ! rtph264pay ! udpsink host=10.89.6.3

接收机:

代码语言:javascript
复制
gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink

您也可以在同一台计算机上运行这两台计算机,只需将主机更改为发送方的127.0.0.1。在接收端,您应该注意到口吃和通常表现不佳的视频,以及控制台上的多次警告:

代码语言:javascript
复制
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

代码语言:javascript
复制
gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink sync=false

然后,即使用我们的相机软件测试,视频也会以接近零延迟的速度播放。这对于测试是有用的,但对于部署却不是很有用,因为它不能使用Totem、VLC或他们的浏览器插件嵌入。

我想尝试在源端解决这个问题;我怀疑x264的H.264流或者RTP负载上缺少某种时间戳信息。是否有任何方法来修改源gst管道,使我做而不是需要在接收器上使用sync=false

如果这是不可能的,我如何告诉客户端(通过SDP或其他方式)不应该同步流?最终,我们会使用VLC插件将其嵌入到浏览器中,这样,在那里工作的解决方案就会更好。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-12 23:00:18

可以将"sync=false“添加到源gst管道中。在Ubuntu12.04上,这似乎消除了滞后和错误消息。

下面是我在源代码上使用的命令:

代码语言:javascript
复制
gst-launch videotestsrc ! x264enc tune=zerolatency ! rtph264pay ! udpsink host=127.0.0.1 sync=false

这是我在听筒上使用的东西:

代码语言:javascript
复制
gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink

不幸的是,我不知道为什么工作,甚至不知道"sync=false“属性属于哪个组件(在源管道上)。

票数 9
EN

Stack Overflow用户

发布于 2012-08-02 23:09:46

正如root.ctrlc发布的,您可以使用sync=FALSE。但是,您可能会注意到发送端CPU使用量的大幅增加。原因是sync=FALSE告诉接收器在接收到缓冲区后立即推出缓冲区。水槽驱动着整个管道。因此,sync=FALSE将使管道编码视频并尽可能快地将其推送到UDP;它将使用100%的CPU。

您需要的是gstrtpjitterbuffer。它还负责处理时间戳,这些时间戳在这里被破坏了。

示例发件人:

代码语言:javascript
复制
gst-launch-0.10 -v videotestsrc ! videorate ! video/x-raw-yuv, framerate=30/1 ! ffmpegcolorspace ! x264enc ! rtph264pay ! udpsink port=50000 host=<sender IP>

示例接收器:

代码语言:javascript
复制
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
票数 11
EN

Stack Overflow用户

发布于 2014-03-17 18:08:17

我不知道这有多少是真的,但是当我不把电池充电器连接到我的笔记本电脑的时候,它会向我发出同样的警告,当我插上电源的时候,相信它成功了。我认为这可能是因为旧的CMOS电池,它没有正常工作。因为它负责时钟的产生。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11397655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档