C#WinFormsでオーディオを再生する

いくつか試したところの違いのメモ

●SmallBasicLibararyを使う
C#で音楽を再生する一番簡単な方法
http://d.hatena.ne.jp/chi-bd/20140216/1392534158

【雑感】
ものすごい簡単。Sound.Play(fileName)またはSound.PlayAndWait(fileName)でwaveだろうがmp3だろうが簡単に再生できる。
【問題点】
・マルチスレッド環境で複数の音楽ファイルを同時に再生する問題に弱い。PlayAndWaitすると再生が終了するまでスレッドがロックされてしまう(UIだと致命的)。PlayAndWaitをasyncで非同期ラップしてやると、再生が完了していない段階で再生ボタンを押すと、InvalidOperationExceptionが飛んで死ぬ。AutoResetEventやMutexを使って再生部分を並列化させないようにしても、同じファイルを再生しようとしたときに、再生が終了しても前のスレッドからオーディオファイルが解放されないバグ?があって死ぬ(内部実装がわからないけどMCIで再生したときにcloseしなかった場合の挙動に似ていた)。要はハマるとめちゃくちゃ沼る
・どうしても多重再生したいなら、プロセスを多重起動してコマンド引数でファイルを割り当ててやれば多重再生できる。ただし、再生完了時にプロセスを閉じてやらないとゴミプロセスがタスクマネージャーを圧迫するし、すぐプロセスが消えてしまうのでCoreAudio等を使っても事実上音量の調整ができない(そもそもSmallBasicのSoundに音量調整の機能がない)。

●MCIを使う
MIDI、MP3などの音楽ファイルを再生する
http://dobon.net/vb/dotnet/programing/playmidifile.html
C# - Play mp3 File using winmm.dll
https://www.youtube.com/watch?v=STNAOk_IiqE

【雑感】
レスポンスが早い。多重再生をしても特に問題がない。
【問題点】
waveファイルだと完璧に開けるけど、mp3ファイルは開けない場合がある:mciSendStringでopenしたときにエラーコード266が飛んでくる。原因はよくわからないけど、コーデックあたりが闇そう。配布用のアプリだとおま環連発であんまよくない。waveファイルに統一しちゃうなら最強なんだけどね。
※シングルスレッドの場合、open→playが終わったあと同一ファイルをplayすると再生されないみたい。Threadを新たに立てて、open→playを連発すれば多重再生できるけど、再生完了した部分がGCに回収されずに残る部分がある(再生ボタンを押しまくってメモリ使用量を見てると徐々に増えていく)。open→play→closeの過程をちゃんと踏めばこの問題は発生しない。IDisposableインターフェイスを実装させるのが賢いかもしれない。

●Windows Media Player Controlを使う
MIDI、MP3などの音楽ファイルを再生する
http://dobon.net/vb/dotnet/programing/playmidifile.html

【雑感】
メディアプレイヤーそのものを使ってるからダブルクリックで再生できるやつはなんでも開ける。音量調整も簡単。
【問題点】
初期化で若干立ち上がりが遅い場合がある(それはそう)

WMコントロールを追加すると、Interop.WMPLib.dllとAxInterop.WMPLib.dllが実行ファイルフォルダに追加されるけど、これがうざいなと思ったらdynamic型でCOMコンポーネントを初期化すればいいようです。詳しくはこれ↓

.NET FrameworkでWindows Media Player Controlを利用するもう一つの方法
http://qiita.com/fujieda/items/d8642eae891d096d4028


この3つを試した結果、やっぱりWindowsMediaPlayerが最強だなということになりました。デスクトップアプリのSEなんで遅延はそこまで気にしないので。シューティングゲームみたいにレイテンシーの小ささが要求される場合は、全てのSEをwavファイルで統一してMCIで読み込ませるのがベストかと。
スポンサーサイト
プロフィール

こしあん

Author:こしあん
(:3[____]
【TwitterID : koshian2】
【ほしい物リスト】http://goo.gl/bDtvG2

Twitter
カウンター
天気予報

-天気予報コム- -FC2-
カテゴリ
月別アーカイブ
最新記事
最新トラックバック
検索フォーム
リンク