【问题标题】:Make GStreamer pipeline drop erroneous buffers使 GStreamer 管道丢弃错误的缓冲区
【发布时间】:2026-01-29 22:50:01
【问题描述】:

我的管道在中间分裂,通过不可靠的连接发送。如果我不考虑它们,这会导致一些缓冲区出现位错误,这些错误会破坏管道。为了解决这个问题,我有一个appsink,它解析缓冲区的关键信息(时间戳、持续时间、数据和数据大小),将它们序列化,然后使用 CRC 通过不可靠的通道发送。如果接收流水线从不可靠通道读取缓冲区并使用 CRC 检测到位错误,则删除该缓冲区。除了一些临时的视觉伪影之外,大多数解码器都能够从丢弃的缓冲区中恢复正常。

是否有自动执行此操作的 GStreamer 插件?我研究了 GDPPay 和 GDPDepay 插件,它们似乎满足了我的需求,因为它们的缓冲区序列化并包含 CRC 的标头和有效负载,但是插件假设数据是通过可靠的通道发送的(为什么这个假设和包含 CRC,我不知道)。

我很想花时间制作插件/向 GDP 插件发出拉取请求,这些插件只会丢弃坏缓冲区,而不是使用 GST_FLOW_ERROR 暂停管道。

任何建议将不胜感激。理想情况下,它也可以容忍管道崩溃/重启。 (该插件还希望 Caps 过滤器信息是第一个发送的缓冲区,在我的情况下,我不需要发送,因为我有一个固定的目的,并且可以硬编码两端以知道会发生什么。这只是一个问题如果receiver重启,sender已经在发送数据,但是receiver不会收到数据,因为它正在等待sender已经发送的Caps数据。)

【问题讨论】:

    标签: gstreamer crc gstreamer-1.0


    【解决方案1】:

    当遇到类似问题时(但针对GstEvents),我使用了GstProbe。您可能需要为GST_PAD_PROBE_TYPE_BUFFER 安装它,并为不满足您条件的缓冲区返回GST_PAD_PROBE_DROP。它比定义插件更容易,而且更容易修改(GstProbe 可以从代码中创建和处理,因此更改放置逻辑更容易)。警告:我还没有为缓冲区做过,但它应该是可行的。

    让我知道它是否有效!

    【讨论】:

    • 感谢您的建议!我刚刚阅读了 GstProbes,如果我要重新做事,这肯定是要走的路。鉴于我的工作范围有限,我只是坚持使用 hacky 的外部 CRC 解决方案,但未来肯定会牢记 GstProbes。