Jac*_*ord 13 video streaming rtp gstreamer h.264
我在通过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
Run Code Online (Sandbox Code Playgroud)
收货机:
gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink
Run Code Online (Sandbox Code Playgroud)
您也可以在同一台计算机上运行这两者,只需将主机更改为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.
Run Code Online (Sandbox Code Playgroud)
我在互联网上看到的一个常见建议的"修复"是sync=false与xvimagesink 一起使用:
gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink sync=false
Run Code Online (Sandbox Code Playgroud)
即使使用我们的相机软件进行测试,视频也会以接近零的延迟播放.这对于测试非常有用,但对于部署并不是很有用,因为它不适用于Totem,VLC或其浏览器插件嵌入.
我想尝试从源头解决问题; 我怀疑x264或者RTP有效载荷在H.264流上缺少某种时间戳信息.有什么办法来修改源 GST管道,这样我就不会需要使用sync=false接收器上的?
如果那是不可能的,我怎么能告诉客户端(通过SDP或其他方式)不应该同步流?最终,我们使用各种VLC插件将其嵌入到浏览器中,因此在那里工作的解决方案会更好.
dv_*_*dv_ 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>
Run Code Online (Sandbox Code Playgroud)
示例接收器:
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
Run Code Online (Sandbox Code Playgroud)
您可以将"sync = false"添加到源gst管道.在Ubuntu 12.04上,似乎删除了滞后和错误消息.
这是我在源代码上使用的命令:
gst-launch videotestsrc ! x264enc tune=zerolatency ! rtph264pay ! udpsink host=127.0.0.1 sync=false
Run Code Online (Sandbox Code Playgroud)
这是我在接收器上使用的内容:
gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink
Run Code Online (Sandbox Code Playgroud)
不幸的是,我不知道为什么它可以工作,甚至不知道"sync = false"属性属于哪个组件(在源管道上).
| 归档时间: |
|
| 查看次数: |
23872 次 |
| 最近记录: |