我有两个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没有被正确打包。
-
不使用rtpvp8pay元素,直接以字节流的形式发送。
-
在GStreamer中使用另一个处理字节流格式的RTP元素,如rtpstreampay或rtpgdppay。(我相信rtpstreampay可能是GStreamer 1.0元素)
我没有通过管道管理字节流,但我设法使用AppSrc
来提供gst管道。
所以我的整个管道(可能对其他人有用)看起来像这样:appsrc -> rtpvp8depay -> vp8dec -> videoconvert -> videoscale -> appsink
(我在ArchLinux上使用Gstreamer1.0)。