我嘗試從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獲得更新,我需要實現哪些觸發上述事件的更新?
預先感謝您的寶貴時間和仁慈。
我懷疑這是一個多層次的問題。我懷疑MF只能理解ID3並且僅適用於文件。此外,爲了讓您的數據流包含元數據,您需要告訴服務器注入數據,然後將其移交給解碼器。我不熟悉MF,所以不知道它是否有這種模式。請注意,在Icecast的情況下,首選的流容器是Ogg,它在處理上又有所不同。 – TBR
存在使用的shoutcast與MF [這裏](https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/220b166e-b8f2-4a5a-b2bc-c3f9b6674a87)的詳細討論。來自MS的響應似乎是因爲icecast沒有像其他shoutcast服務器那樣發送預期的'ICY 200 OK',MF不能正確處理它。這篇文章有些過時(2010年),所以也許有一個更新的解決方案。 –
@Mario您應該創建自己的代碼,將流中的帶內元數據解多路複用,然後將常規流發送到正在進行解碼的任何位置。 – Brad