【问题标题】:gstreamer rtpvp8depay cannot decode streamgstreamer rtpvp8depay 无法解码流
【发布时间】:2014-07-02 12:18:22
【问题描述】:

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

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

【问题讨论】:

    标签: gstreamer rtp vp8


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您解释失败的原因。我现在要尝试这些,但我不明白为什么这会与 bytestream 一起工作:难道没有关于格式的事件较少的信息吗?它们不只是原始字节吗?此外,我的两个 GSTreamer 实例仅用于测试,我的实际应用程序不使用 GStreamer 作为发送者:数据包来自 Janus 网关,它们 采用 RTP / VP8 编码。我正在使用 GStreamer 对 RTP 进行解包并解码 VP8 以将数据发送到 OpenCV。那么原始字节流的东西仍然适用吗?非常感谢您的回答!
    • 如果传入的流是 RTP 打包流,那么在解码之前您将需要一个 RTP 解包器(可能还有一个抖动缓冲区来处理网络条件),并且字节流将不适用。我可能是错的,但我相信命名管道正在发送字节流,这是原始字节,会在错误的地方截断 RTP 数据包,因此您得到无效的 RTP 有效负载。
    【解决方案2】:

    我终于解决了我的问题。

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

    所以我的整个管道(可能对其他人有用)如下所示:appsrc -> rtpvp8depay -> vp8dec -> videoconvert -> videoscale -> appsink(我在 ArchLinux 上使用 Gstreamer1.0)。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 2020-03-05
      • 2023-04-01
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 2021-05-30
      • 1970-01-01
      相关资源
      最近更新 更多