2011-06-17 140 views
2

我有一个应用程序从内容类型为application/x-mms-framed的Windows Media Server接收流式音频。该应用程序将删除数据成帧的流通到gstreamer的管道等之前:使用gstreamer解码实时WMA/MMS流

gst-launch fdsrc ! asfdemux ! fakesink 

(当然,通常的管道将通常包括一个WMA解码器和其他的东西 - 这仅仅是为了说明所需要的最小问题)。

我可以从该ASF解析与第二数据包出错的调试输出中看到:它试图用超越它实际上是从哪里开始+3字节偏移读取它。

从调试输出某些数据:

  • 初始标头包($ H从成帧的流)是5027个字节,并且似乎是正确分析。最小包大小为1567.
  • 以下每个数据包(来自成帧流的$ D)都包含1564个字节。

我认为问题在于ASF分流器对每个数据包都使用固定的min-packet-size值1567,尽管它认识到实际数据包包含的数据较少。它将额外的3个字节视为隐式填充,并(有效)跳过它们,而不是减小要使用的数据包大小。

这可能是因为我的代码,它只是不知何故条框还需要通过实际的帧大小。也许有一种使用gstreamer的缓冲区传递机制的方法,在这种情况下,我需要编写一个gstreamer插件来完成非帧化。这样的插件将转换为application/x-mms-framed - >video/x-ms-asf。我希望找到一个现有的插件,可以做到这一点,但迄今为止没有成功。

我在正确的轨道上或者这只是在ASF分路器(我怀疑不是我其实已经尝试了3个不同的ASF流分离器插件)的错误吗?

+0

我开发了一个补丁,`asfdemux`插件添加必要的支持。它可以在[https://bugzilla.gnome.org/show_bug.cgi?id=652946]找到。 – awy 2011-06-23 15:56:58

回答

0

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