2017-04-27 2 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に慣れていないので、これにはモードがあるかどうかわかりません。アイスキャストの場合、好ましいストリームコンテナはOggであることに注意してください。 – TBR

+2

shoutcastをMF [here](https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/220b166e-b8f2-4a5a-b2bc-c3f9b6674a87)で使用する方法の詳細な説明があります。 MSからの応答は、他のshoutcastサーバが行うように、ICecastが予想される「ICY 200 OK」を送信していないため、MFが正しく処理しないことが原因です。その投稿は多少日付が付けられています(2010年)ので、おそらく最近の解決策があります。 –

+1

@Mario独自のコードを作成して、ストリームからインバンドのメタデータをデマルチプレクサにし、デコードを行っているすべてのものに通常のストリームを送信する必要があります。 – Brad

答えて

1

状況によっては、この質問に対する回答がいくつかあります。例えば、

のWindows 7

  • 接続先のサーバがICYサーバーとして自身を識別するためにICY 200 OKを使用している場合は、shoutcast.zipコードhereのようなC#コードを使用することができます。ソングタイトルのサポートを追加することは、既存のサンプルにはほんのわずかな変更です。
  • ICY 200 OKで接続するサーバーにIcy-Metadata: 1を送信すると、URLResolverにURLを解決させる代わりに明示的にUrlMonSchemePluginを使用すると、URLを解決できます。

注:サーバーがICY 200 OKで応答すると確信することができない場合は(それだけ200 OKを使用している場合など)、それを行うことは可能かもしれないが(自動的にタイトルを解析するMFを説得する方法はありません自分自身を解析する - おそらくMFTですか?)

実際、サーバーが200 OKと応答した後に曲のタイトルを送信すると、MFはそのタイトルを「再生」しようとします。これらのビープ音/ブザーは非常に迷惑になることがあります(ディスコの音楽を除いてどのように伝えることができますか?)。

は、私はそのようなMFTを作成しようと考えたが、その後、私は気づい:曲のタイトルを提供するために、icy-metaintを指定する任意の流れを許容するために

Windowsの代わりに「固定」MFの8

(一見小さな修正)、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が必要です。

ShoutCast-2015 sampleに含まれている.Net 4.5.2を使用して、ライブラリのビルド済みのバージョンがあります。ライブラリのソースはcvsにチェックされています。

これは「市販の」コードではありませんが、基本的な概念を示しています。そして誰かがそれをより良くしたいなら、(コメントされた)情報源が含まれています。特に、非アスキー曲のタイトルを扱うことはできません。ストリーム処理は、オーディオギャップを避けるために効率的であると確信しています(あるいは、MFとのギャップを伝え、 次にギャップを避けるために)。

0

ストリームURLには、既にアーティストと曲名のメタデータが含まれています(少なくとも)。 実際のソースはURLそのものです。

関連する問題