2011-06-17 138 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字段來告訴大小。