使 GStreamer 管道丢弃错误的缓冲区

Make GStreamer pipeline drop erroneous buffers

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

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

我很想花时间向 GDP 插件发出 plugin/make 拉取请求,这些插件只会丢弃错误的缓冲区,而不是使用 GST_FLOW_ERROR.

暂停管道

如有任何建议,我们将不胜感激。理想情况下,它也可以容忍任一管道 crashing/restarting。 (该插件还希望 Caps 过滤器信息是发送的第一个缓冲区,在我的情况下我不需要发送,因为我有一个固定的目的并且可以 hard-code 两端知道期望什么。这只是如果接收方重新启动并且发送方已经发送数据,但接收方不会收到数据,因为它正在等待发送方已发送的 Caps 数据,则会出现问题。)

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

让我知道它是否有效!