Gstreamer rtpvp8depay无法解码流



我有两个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数据包被正确地分开,而使用这样的命名管道,正在写的数据包被"链接"(而不是正确地分开),因此gstreamer不知道读取多少字节来获得RTP数据包。

这是正确的吗?如果是,我该如何改变?

当通过命名管道时,RTP没有被正确打包。

  1. 不使用rtpvp8pay元素,直接以字节流的形式发送。

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

我的问题终于解决了。

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

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

相关内容

  • 没有找到相关文章

最新更新