2017-04-27 37 views
1

我嘗試從shoutcast流獲取歌曲標題,但事件:MENewStream,MEEndOfStream,MESourceMetadataChanged從不觸發,沒有更新。Media Foundation .NET:如何從shoutcast獲得歌曲標題

這是我如何創建媒體來源:

hr = sourceResolver.CreateObjectFromURL(
    mediaURL, MFResolution.ByteStream, properties, out mediaStream 
); 
hr = sourceResolver.CreateObjectFromByteStream(
    mediaStream, mediaURL, MFResolution.MediaSource, properties, out objectType, out mediaSource 
); 

這就是我如何獲得元數據:

hr = MFExtern.MFGetService(
mediaSource, MFServices.MF_METADATA_PROVIDER_SERVICE, typeof(IMFMetadataProvider).GUID, out obj 
); 
IMFMetadataProvider metadataProvider = obj as IMFMetadataProvider; 
hr = mediaSource.CreatePresentationDescriptor(out descriptor); 
hr = metadataProvider.GetMFMetadata(descriptor, 0, 0, out metadata); 

,並在某處應用程序,我稱之爲:

Display(stream.Metadata); 

這僅返回這些:

"Bitrate"  : 128 
"Title"   : ...(station name) 
"WM/Genre"  : ... 
"WM/PromotionURL": ... 

問題是:我如何從Media Foundation .NET的shoutcast獲得更新,我需要實現哪些觸發上述事件的更新?

預先感謝您的寶貴時間和仁慈。

+2

我懷疑這是一個多層次的問題。我懷疑MF只能理解ID3並且僅適用於文件。此外,爲了讓您的數據流包含元數據,您需要告訴服務器注入數據,然後將其移交給解碼器。我不熟悉MF,所以不知道它是否有這種模式。請注意,在Icecast的情況下,首選的流容器是Ogg,它在處理上又有所不同。 – TBR

+2

存在使用的shoutcast與MF [這裏](https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/220b166e-b8f2-4a5a-b2bc-c3f9b6674a87)的詳細討論。來自MS的響應似乎是因爲icecast沒有像其他shoutcast服務器那樣發送預期的'ICY 200 OK',MF不能正確處理它。這篇文章有些過時(2010年),所以也許有一個更新的解決方案。 –

+1

@Mario您應該創建自己的代碼,將流中的帶內元數據解多路複用,然後將常規流發送到正在進行解碼的任何位置。 – Brad

回答

1

根據你的情況,這個問題有幾個答案。例如,

Windows 7的

  • 如果你正在連接的服務器使用ICY 200 OK將自己標識爲一個冰冷的服務器,你可以使用C#代碼像shoutcast.zip代碼here。添加對歌曲標題的支持對現有樣本來說是一個相當小的改變。
  • 如果您要連接的服務器可以通過發送Icy-Metadata: 1ICY 200 OK進行通信,那麼明確使用UrlMonSchemePlugin代替允許SourceResolver解析URL可以提供幫助。

注:如果服務器不能被說服與ICY 200 OK迴應(例如,如果它只是使用200 OK),沒有辦法說服MF自動解析標​​題爲你(雖然它可能做的解析你自己 - 也許是MFT?)。

事實上,如果一臺服務器在回覆200 OK後發送歌曲標題,MF會嘗試「播放」標題。這些嗶嗶聲/嗡嗡聲可能非常煩人(除了迪斯科音樂,因爲你怎麼說?)。

我想過嘗試創建這樣的MFT,但後來我意識到:

的Windows 8

而是「固定」 MF的允許指定icy-metaint提供歌曲名稱的任何流(一個看起來很小的修復),MS走了另一條路。

他們完全有損壞使用MF流式傳輸MPEG音頻的能力。

在W7上正常工作的相同程序現在給W8上的MF_E_BYTESTREAM_NOT_SEEKABLE錯誤。這看起來很奇怪,因爲這樣的流不可能在W7中找到,但顯然現在這是一個致命的錯誤。

可能有一些新的方法,MS希望人們使用,但我不知道它可能是什麼。


更新:

令我很煩惱所以,我創建了自己的方案處理程序(也寫在C#),這並沒有對Windows 8的工作。除了處理使用ICY 200 OK的數據流之外,該處理器還可以處理200 OK(以及其他一些功能)。並且,它支持(僅)足以尋求與W8的SourceResolver合作。所以(幾乎)相同的播放器應用程序適用於W7 & W8。

有幾個注意事項:

  1. 雖然樣品仍然適用於Windows 7,支持200 OK僅適用於Windows 8和(大概)後新方案的處理程序。
  2. 它需要MediaFoundation .Net的beta版本。

有一個預建版本的庫,使用.Net 4.5.2包含在ShoutCast-2015 sample中。庫源被檢入cvs

這不是「商業準備」的代碼,但它確實表明了基本概念。如果有人想讓它變得更好,那麼(評論)來源也包括在內。特別是,它不處理非ascii歌曲標題,我敢肯定,流處理可以更有效地避免音頻差距(或者失敗了,與MF溝通差距並更好地「緩衝」以避免下一個的差距)。

0

流URL已包含Artist和歌曲名稱的元數據(至少)。 所以你的實際來源是URL本身。

相關問題