使用gstreamer解码实时WMA / MMS流

时间:2011-06-17 10:22:11

标签: gstreamer asf

我有一个应用程序,它从内容类型为application/x-mms-framed的Windows Media Server接收流式音频。应用程序在将流传递到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分路器插件)?

1 个答案:

答案 0 :(得分:0)

我肯定建议写一个插件。它有点锅炉电镀,但更坚固的方法。缓冲区对象有一个GST_BUFFER_SIZE字段来告诉大小。