2

我有一个应用程序,它接收来自 Windows 媒体服务器的流式音频,内容类型为application/x-mms-framed. 应用程序在将流传递到 gstreamer 管道之前从数据中删除框架,例如:

 gst-launch fdsrc ! asfdemux ! fakesink

(当然,通常管道通常会包括 WMA 解码器和其他东西 - 这只是说明问题所需的最低要求)。

我可以从调试输出中看到,第二个数据包的 ASF 解析出错了:它试图以超出实际开始位置 +3 个字节的偏移量来读取它。

来自调试输出的一些数据:

  • 初始标头数据包(帧流中的 $H)为 5027 字节,似乎已正确解析。最小数据包大小为 1567。
  • 以下每个数据包(帧流中的 $D)包含 1564 个字节。

我认为问题在于 ASF 解复用器对每个数据包使用固定的最小数据包大小值 1567,即使它识别出实际数据包包含的数据较少。它将额外的 3 个字节视为隐式填充并(有效地)跳过它们,而不是减少要消耗的数据包大小。

这可能是因为我的代码以某种方式简单地剥离了框架也需要传递实际的框架大小。也许有一种方法可以使用 gstreamer 的缓冲区传递机制来做到这一点,在这种情况下,我需要编写一个 gstreamer 插件来进行解帧。这样的插件会转换application/x-mms-framed-> video/x-ms-asf。我希望找到一个可以做到这一点的现有插件,但到目前为止还没有成功。

我是在正确的轨道上还是这只是 ASF 解复用器中的一个错误(我怀疑不是因为我实际上尝试了 3 个不同的 ASF 解复用器插件)?

4

1 回答 1

0

我肯定会建议编写一个插件。它有点像锅炉板,但更可靠的方法。缓冲区对象有一个 GST_BUFFER_SIZE 字段来告诉大小。

于 2012-03-02T09:58:11.017 回答