gstreamer rtpvp8depay无法解码流

时间:2014-07-02 12:18:22

标签: gstreamer rtp vp8

我有两个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数据包。

这是否正确,如果是,我该如何改变? 提前谢谢!

2 个答案:

答案 0 :(得分:1)

通过命名管道时,RTP未正确打包。你也可以,

  1. 直接通过字节流发送编码流,而不使用rtpvp8pay元素。

  2. 在GStreamer中使用另一个处理字节流格式的RTP元素,例如rtpstreampay或rtpgdppay。 (我相信rtpstreampay可能是GStreamer 1.0元素。)

答案 1 :(得分:1)

我终于解决了我的问题。

我没有通过管道管理字节流的事情,但我设法使用AppSrc来提供gst管道。

所以我的整个管道(可能对其他人有用)看起来像这样:appsrc -> rtpvp8depay -> vp8dec -> videoconvert -> videoscale -> appsink(我在ArchLinux上使用Gstreamer1.0)。

希望这有帮助!