やる気駆動型エンジニアの備忘録

WPF(XAML+C#)の話題を中心に.NET/Android/CI やたまに趣味に関するブログです

MediaPlayer でファイル再生時のエラー回避方法について

またもやWPF のMediaPlayer ネタです。
MediaPlayer のイベントにMediaFailed がありますが、このイベントで以下のようなメッセージが出力される場合があります。

HRESULT からの例外:0xC00D11BA

これはWindows Media Player が出力している例外メッセージです。
MediaPlayer.Play() を呼び出した後にこの例外がスローされるのであれば、多くの場合、以下の内容が原因とされています。

  • サウンド ドライバーが最新でない。
  • 再生ファイルのコーデックが不足している。

など

しかし、再生中にたまにこの例外がスローされる事があります。
そうなった場合、再度MediaPlayer.Play() を実行しても楽曲が再生されません。

残念ながら確実に発生するオペレーションの確立と原因の究明までには至っていないため、この現象の発生を止めることはできません。
今回は"この現象が発生してももう一度楽曲を再生できる"ような対象法をまとめます。

動作環境

対策

正しいかどうかは別として、"エラー発生後に楽曲ファイルを再読読み込み"することで回避は可能です。
エラーの発生するコードは以下の様なものとしましょう。

	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();

イマイチ発生原因がつかめていないのでモヤモヤは残るのですが、今のところはこれで対応できているので良しとします。