5時間でMedia Foundation Interfacesをとりあえず使いこなしてアプリに実装する心得

 使える機能がありながら、捨て子状態だったDirectShowを本気で捨てるためにMicrosoftWindows7(アップデートによってはVistaからも)から組み込んできたライブラリ。マルチメディアや、それまでハック的な方法で行われていた機能を統括して扱える。例によってインターフェイスとそれにまつわる関数等が山ほどあるわけだが、決して正面から格闘してはいけない。
 WindowsSDKにある「Samples→multimedia->mediafoundation」とかいったディレクトリ以下にサンプルを見て、目的の機能とそれにまつわる実装で使いかたを覚える。MFPlayer2とビデオサムネイル作成サンプルあたりがいいだろう。UIの実装部分等は全力で無視して、Media Foundationのインターフェイスが使われているところだけを見る。Microsoftのサンプルには珍しく、非常にわかりやすい実装になっているので、機能別にインターフェイスをどう使うかつかみやすい。
 COM初心者はMicrosoftのCOM作法の洗礼があるだろうが、昔ではないので以下の2点に気をつける。

 COMの思想やら何やらにこだわってはいけない。こういうものだということを念頭に実装の流れを体で覚える(基本的な言語仕様とかは抑えているという前提)。

 細かくリファレンスを読むのは後。サンプルを見て真似して実装すれば大体うまく動くように出来ている。やる前はこれがわかりづらいのがCOMの特徴だが、そこは脳にわかったつもりフィルターをかけて気にしない様にしてみるのがコツ。

 しかしMFPlayer2に使われているインターフェイスAPIは「Deprecated」扱いになっており、現在はMedia Sessionインターフェイスで行うのがMicrosoft様の作法の様だ。Windows Vistaから8に至るまでによくぞここまでフラフラとインターフェイスの設計を変えてくれたものだと相変わらずのMicrosoftの方針を堪能しているところだが、マルチメディア周りは特に改悪が激しい。使えないわけではないが、主流から外されるということなので、あえて使う気は起きないし、MFPlayインターフェイスはあまり使いやすくもないようだ。そしてなによりWeb上での情報がものすごく乏しい。DirectShowもドキュメントが非常に少ないことはよく知られていると思うが、Media Foundationはサンプルが最上のドキュメントかも。ただし、Media FoundationではH.264やMP4コンテナなどのサポートをAPIで行うようになったため、DireectShowのようにサードパーティ製スプリッターライブラリなどをCOMサーバーとしてインストールするなどといったことはしなくて良くなるのがメリット。実際、動画の再生ぐらいを行う処理は非常に簡単に実装でき、MFCなどとの兼ね合いも良く、高速である。

 DirectShowが捨て子状態だと最初に記述はしたが、独自のフィルター実装やサードパーティ製フィルタの使い回しを覚えることで、柔軟に実装できるため、今だにプレイヤーソフトなどではメインで使われているし、ソースフィルタデバイスドライバなどの実装には欠かせない。こういった事情があるからか、DirectShowに置き換えるためにMedia Foundationがあるなどと記述しておきながら、DirectShowのサポートはやめる気配がない。Enhanced Video Rendererはstrmiids.libとリンクしており、これはDirectShowから使われてきたライブラリであることから、DirectShowの部品がないとMedia Foundationも成り立たないという作りに見える。