開発備忘録

WPF(Xaml + C#)の話題を中心に.Net関連についてのブログです。

MediaPlayer でファイルオープン時のノイズ発生回避方法について

WPF でWAVE ファイルなどのメディアファイルを再生するとき、System.Windows.Media.MediaPlayer を使用していたのですが、複数ファイルを纏めてオープンしたときに何故か楽曲が少しだけ再生される現象が発生しました。
ここではその回避方法についてまとめています。

動作環境

実現したいこと

単純に複数の楽曲ファイルを予めロードすることで再生時のオーバーヘッドを軽減したい。
SoundPlayer クラス (System.Media) も試したのですが、「楽曲再生中に停止できない」「音量の調節機能が無い」ため、手っ取り早くMediaPlayer で実現することとなりました。

サンプルコード


起動すると以下の画面が表示されます。
f:id:iyemon018:20170816173912p:plain

問題点

C:\work\Musics フォルダに".wav" ファイルを10個程度配置してください。
上記のコードをビルド・実行すると起動時にノイズ・配置した楽曲ファイルが少しだけ再生されます。
環境に依存する可能性はありますが、目安としてCPU Core i7 3770 で10~20個だと発生します。

原因

コード上の原因箇所は↓↓ここ

                mediaPlayer.Open(new Uri(file));

Reference Source でコードを追いかけてみたのですが、原因箇所の特定には至っていません。
以下にもあるように、リソースへ埋め込むとこの問題は発生しなくなるそうです。
System.Windows.Media.MediaPlayer でOpenの時にノイズが入る

ただ、今回は外部リソースとしてファイルを読み込んでおく必要があったのでこの方法は使えません。

対策

結論から述べると「ノイズ、楽曲ファイルが少しだけ再生される」現象を回避することはできません。
なので、再生していても聞こえないようにしてしまいます。
変更箇所は以下にまとめています。
github.com

具体的には、

  1. MediaPlayer の生成時にミュートにする。
  2. MediaPlayer をオープンする。
  3. 再生時にミュートを解除する。

という手順で実行しています。

ミュートするという小細工はあまり美しくないのですが、手っ取り早いひとつの手段として検討するのもありかなと思います。

今回使用したソースコードはこちら↓↓↓
github.com