2014年7月3日木曜日

wpf : MediaPlayer/MediaElementでmp3とか色んなメディアを再生するときの罠

今、自分で使う適当なツールを作ってます。 それでMediaElementを使ってました。 mp4の動画ファイルを再生しながら試行錯誤して作ってきて9割くらいできたかな? ってところで試しにmp3の音楽を流そうとして失敗。 「これじゃ使えない」ってことで失敗した理由を調べてみました。

ネットで調べた内容では根本的な原因とか解決策は見つからず。 分からないなりにVisual Studio Expressでゴニョゴニョやっていたら原因判明。 音声のみのメディアを再生するときに MediaElement.ScrubbingEnabled = true になっていたら動きませんでした。

ScrubbingEnabledがtrueのとき、シーク操作時もMediaElementのレンダリングが更新されます。 mp3の場合は映像情報が無いのになんかのタイミングでレンダリングしようとして不具合って事ですかね?

結局、ファイル読み込み前に MediaElement.ScrubbingEnabled = false にして、MediaOpenedイベントでMediaElement.HasVideoを見て映像があったら MediaElement.ScrubbingEnabled = true を設定するよう修正して改善しました。 変なところでつまづいてしまった...


これ調べるのに使った小さなコードを整理して載せておきます。 簡単なメディアプレイヤーです。 マイクロソフトが公開しているコードによると、MediaElementクラスはMediaPlayerクラスの単なるラッパーのようです。 ってことでMediaPlayerクラスで作ってみました。

作った環境はこれ。

  • os : Windows7 64bit home
  • ide : Visual Studio Express 2012
  • framework : .NET Framework 4.5
  • 構成 : Any CPU(32bit優先)

  • MainWindow.xaml

  • MainWindow.xaml.cs