我正在开发一个视频应用程序,但遇到UDP流式传输与TCP的问题。
当我使用下面的管道时,视频流可以接受。 (应用程序本身在python中,但管道基本上如下所示)
sender:
gst-launch-0.10 v4l2src ! video/x-raw-yuv,width=320,height=240 !
theoraenc ! oggmux ! tcpclientsink host=nnn.nnn.nnn.nnn port = 5000
receiver:
gst-launch-0.10 tcpserversrc host=nnn.nnn.nnn.nnn port=5000
! decodebin ! xvimagesink
但是,由于此应用程序要跨越/通过NAT执行,我需要UDP流式传输。 当我将tcpserversrc切换为“udpsrc port = 5000”并将tcpclientsink切换为“udpsink host = nnn.nnn.nnn.nnnn port = 5000”时,性能急剧下降到接收计算机每5秒获取一个帧的程度或者。 (即使两个流都在同一台机器上执行,也会发生这种情况)
发送管道生成以下内容(一次):
WARNING: from element /GstPipeline:pipeline0/GstUDPSink:udpsink0:
Internal data flow problem.
Additional debug info:
gstbasesink.c(3492): gst_base_sink_chain_unlocked (): /GstPipeline:pipeline0
/GstUDPSink:udpsink0:
Received buffer without a new-segment. Assuming timestamps start from 0.
...并且接收管道生成(每20秒左右):
WARNING: from element /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0:
A lot of buffers are being dropped.
Additional debug info:
gstbasesink.c(2739): gst_base_sink_is_too_late (): /GstPipeline:pipeline0
/GstXvImageSink:xvimagesink0:
There may be a timestamping problem, or this computer is too slow.
我已经阅读了文档和联机帮助页,摆弄了udpsink的各种参数,一切都没有好的效果。 任何人都可以指导我(无疑是显而易见的)我完全没有得到的东西吗? 在此先感谢:)
答案 0 :(得分:7)
我遇到了同样的问题。 尝试设置
sync=false
on
答案 1 :(得分:4)
我有类似的问题。我设法通过改变两件事来解决它(1)正如Fuxi提到sync = false
和(2)在解码端添加上限以匹配编码管道。对于例如在你的情况下,像gst-launch-0.10 tcpserversrc host=127.0.0.1 port=5000 ! decodebin ! video/x-raw-yuv,width=320,height=240 ! ffmpegcolorspace ! xvimagesink sync=false
这样的东西应该工作(它适用于我)。我建议您同时在管道中设置帧速率(服务器/客户端)。 我首先启动解码管道(服务器),然后启动编码管道(客户端),否则它会失败。
<强>更新强>
在适当的解码元素之间添加队列已经多次保存了我的尾巴。例如gst-launch-0.10 tcpserversrc host=127.0.0.1 port=5000 ! queue ! decodebin ! queue ! video/x-raw-yuv,width=320,height=240 ! ffmpegcolorspace ! xvimagesink sync=false
。同样, videorate 在某些情况下帮助了我。
答案 2 :(得分:0)
我正在使用这个命令,它就像一个魅力。
服务器端:
gst-launch v4l2src device=/dev/video1 ! ffenc_mpeg4 ! rtpmp4vpay send-config=true ! udpsink host=127.0.0.1 port=5000
客户方:
gst-launch udpsrc uri=udp://127.0.0.1:5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)MP4V-ES, profile-level-id=(string)1, config=(string)000001b001000001b58913000001000000012000c48d88007d0a041e1463000001b24c61766335322e3132332e30, payload=(int)96, ssrc=(uint)298758266, clock-base=(uint)3097828288, seqnum-base=(uint)63478" ! rtpmp4vdepay ! ffdec_mpeg4 ! autovideosink