我有两个GStreamer实例:发送者和接收者。我想要流式传输RTP / VP8视频。如果我通过UDP流式传输,它可以正常工作,如下所示:
gst-launch-0.10 -v videotestsrc ! vp8enc ! rtpvp8pay ! udpsink host=127.0.0.1 port=9001
gst-launch-0.10 udpsrc port=9001 caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)VP8-DRAFT-IETF-01, payload=(int)96" ! rtpvp8depay ! vp8dec ! ffmpegcolorspace ! autovideosink
工作正常。但是,当我尝试通过以下方式传输FIFO /命名管道(使用mkfifo()完成):
gst-launch-0.10 -v videotestsrc ! vp8enc ! rtpvp8pay ! filesink location = myPipe
gst-launch-0.10 filesrc location = myPipe ! capsfilter caps = application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)VP8-DRAFT-IETF-01, payload=(int)96 ! rtpvp8depay ! vp8dec ! ffmpegcolorspace ! autovideosink
它失败了,我的接收器连续输出:
WARNING: from element /GstPipeline:pipeline0/GstRtpVP8Depay:rtpvp8depay0: Could not decode stream.
Additional debug info:
gstbasertpdepayload.c(387): gst_base_rtp_depayload_chain (): /GstPipeline:pipeline0/GstRtpVP8Depay:rtpvp8depay0:
Received invalid RTP payload, dropping
我想我读到了某个地方(但是再也找不到),因为当使用UDP时,RTP数据包被正确分开,而使用这样的命名管道时,正在写入的数据包被“链接”(< strong> not 正确分离)因此gstreamer不知道要读取多少字节来获取RTP数据包。
这是否正确,如果是,我该如何改变? 提前谢谢!
答案 0 :(得分:1)
通过命名管道时,RTP未正确打包。你也可以,
直接通过字节流发送编码流,而不使用rtpvp8pay元素。
在GStreamer中使用另一个处理字节流格式的RTP元素,例如rtpstreampay或rtpgdppay。 (我相信rtpstreampay可能是GStreamer 1.0元素。)
答案 1 :(得分:1)
我终于解决了我的问题。
我没有通过管道管理字节流的事情,但我设法使用AppSrc
来提供gst管道。
所以我的整个管道(可能对其他人有用)看起来像这样:appsrc -> rtpvp8depay -> vp8dec -> videoconvert -> videoscale -> appsink
(我在ArchLinux上使用Gstreamer1.0)。
希望这有帮助!