高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

C#でメディアファイル再生

 突然ですが、C#でメディアファイルを再生しようと思います。まあ、この辺はDelphiのほうが有利なのかもしれませんが、いちおう…(^_^;)どうも、C#だと、裏技的なこともクリーンな処理ですませられるので、気分がいいんです(DelphiだとWM_ERASEBKGND&WM_RESIZE&WM_MOVEをオーバーライドしないといけない背景描画も、こっちではOnPaintBackGroundをオーバーライドし、SetStyleで座標変更時に再描画するように設定するだけで済むし)。ややこしい処理アルゴリズムもフレームワーク任せで済みますし。

 さて、C#にはメディアファイルを再生する機能はありませんので、interopサービスを使ってAPIを呼び出すかどうかしなければいけません。わたしが知ってるのはVB時代にやった、MCISendStringだけですが…。大していい機能もないのに、あれを思い出すのも面倒。別の方法を調べてみます。
結果、見つかったのは下記二つ。

  • WindowsMediaPlayerのCOMオブジェクトを呼び出して使用(WMP9以上が必要?)
  • DirectShowを呼び出して使用(Quartz.dllというものが必要*1 )

 DirectShow――Quartz.dllを使うと、interopは免れません(その辺はサンプルコードがあるようですが…)、MIDIでMicrosoftSynthesizerを使える(多分)ので、それもいいですが、とりあえず今回は、WMPを使う方にします。
 ただ、この方法はどうも資料が少なくて少なくて…。VB.NET Tips 音楽関係 検索対象が日本のみだと、資料といえる資料はここくらいです。Microsoftのページも、「使ってみてはいかがでしょう?」みたいなことだけで、リファレンスは全然だったし。


 情報がほとんどないので、手探りですが、感じとしてはあちらのページにあるのと同じように操作できます。SharpDevelopではCOMオブジェクトをツールボックスに入れられないので、WMPLib.WindowsMediaPlayerClassを使用してください。
ほか、今のところあちらのページに書いてないことといえば…。

  • 再生状態をコードで判断するにはplayStateプロパティが便利です(WMPPlayState列挙型で処理できる)。今のところ分かった限りでは…
    • wmppsUndefined…何も曲をセットしてない状態。多くのプロパティが参照できないようなので注意(エラーになります)。
    • wmppsTransitioning…再生準備中。URLをセットしてから実際に再生開始されるまで。
    • wmppsPlaying…再生中
    • wmppsPaused…ポーズ中
    • wmppsStopped…停止中。再生が終わってもこの状態
  • イベントはかなりの数定義されている。_WMPOCXEvents_???型のイベントが発生するので、アセンブリビューアでイベント型を確認して書く(ここはSharpDevelopの強みかも)。

 再生位置等は、duration(String), currentPosition(String)で得られるはずですが…。エラーになります。いつ呼び出せば大丈夫なのか、そのあたりはまだ調査中。
結構謎の部分が多そうです。
でも、Misuzilla.orgでは、ちゃんとこれを使ったメディアプレイヤーが公開されている(今はDirectShowを使ってるらしいです)ので、がんばればきっと…。
今日中に満足に再生するところまでいくでしょうか?さもないと気分転換じゃ済まなくなるな…。

*1:C:\Windows\System32にDirectXとセットで(?)インストールされるのだと思います?