0

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

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

4

2 回答 2

1

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

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

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

于 2014-07-04T01:27:21.693 回答
1

我终于解决了我的问题。

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

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

希望这可以帮助 !

于 2014-07-15T06:45:51.723 回答