MediaPlayer でファイル再生時のエラー回避方法について
またもやWPF のMediaPlayer ネタです。
MediaPlayer のイベントにMediaFailed がありますが、このイベントで以下のようなメッセージが出力される場合があります。
HRESULT からの例外:0xC00D11BA
これはWindows Media Player が出力している例外メッセージです。
MediaPlayer.Play() を呼び出した後にこの例外がスローされるのであれば、多くの場合、以下の内容が原因とされています。
- サウンド ドライバーが最新でない。
- 再生ファイルのコーデックが不足している。
など
しかし、再生中にたまにこの例外がスローされる事があります。
そうなった場合、再度MediaPlayer.Play() を実行しても楽曲が再生されません。
残念ながら確実に発生するオペレーションの確立と原因の究明までには至っていないため、この現象の発生を止めることはできません。
今回は"この現象が発生してももう一度楽曲を再生できる"ような対象法をまとめます。
動作環境
- OS : Windows10
- Visual Studio : 2015 Enterprise
- 言語 : C#
- GUI アーキテクチャ : WPF
対策
正しいかどうかは別として、"エラー発生後に楽曲ファイルを再読読み込み"することで回避は可能です。
エラーの発生するコードは以下の様なものとしましょう。
var mediaPlayer = new MediaPlayer(); mediaPlayer.MediaFailed += (sender, e) => { // HRESULT からの例外:0xC00D11BA // というエラーメッセージが出力される。 Console.WriteLine(e.ErrorException); }; mediaPlayer.Open(new Uri(@"Resources\sample.wav")); mediaPlayer.Play();
これをこう変えます。
var mediaPlayer = new MediaPlayer(); mediaPlayer.MediaFailed += (sender, e) => { // HRESULT からの例外:0xC00D11BA // というエラーメッセージが出力される。 Console.WriteLine(e.ErrorException); mediaPlayer.Close(); mediaPlayer = null; mediaPlayer = new MediaPlayer(); mediaPlayer.Open(new Uri(@"Resources\sample.wav")); }; mediaPlayer.Open(new Uri(@"Resources\sample.wav")); mediaPlayer.Play();
イマイチ発生原因がつかめていないのでモヤモヤは残るのですが、今のところはこれで対応できているので良しとします。