プログラマのつれづれなるままにプログラマのつれづれなるままに音宮志久が思ったことなどをネタにします。プログラムネタ・数学ネタがメインです。DirectShowを使う(1)DirectShowを使う(1)コメントを残すアクセス解析を見ていると、ときどきVMR9の項目を見に来ている人がいるのがわかるのですが・・・。何が目的なのかちょっと知りたいです。ま、その話題までがんばって持って行きたいと思います。DirectShowを使って再生、というのをやってみたいと思います。実際に再生の手順をやってみましょう。先に説明しておきますが、hrはHRESULT型の変数で、代入しているところはエラー処理を省いていますので必要に応じてエラーチェックをしてください。コード開始時は以下の仮定があるものとします。COMのライブラリは初期化済み(CoInitializeExを呼び出している)ウィンドウハンドルはhWndで記述され、メインウィンドウのハンドルを持っている内部文字列はすべてUNICODEで扱われている(ASCIIで扱っているときはUNICODEへの変換を行うこと)というわけで、コードです。m_lpMediaControl->Stop();//ビデオウィンドウを解放するm_lpVideoWindow->put_Visible(OAFALSE);m_lpVideoWindow->put_MessageDrain(NULL);m_lpVideoWindow->put_Owner(NULL);//各オブジェクトを解放するm_lpVideoWindow->Release();m_lpBasicVideo->Release();m_lpBasicAudio->Release();m_lpMediaSeeking->Release();m_lpMediaEventEx->Release();m_lpMediaControl->Release();m_lpGraphBuilder->Release();そのまんまです。コメントも何もありません。わかりづらいのがQueryInterfaceの部分で、「なぜこのインターフェイスが取得できるのか?」という疑問がつきまとうわけですが、これはこうなるので覚えてくれ、としかいいようがありません。RenderFileを行った後でIGraphBuilderから取得できるインターフェイスにはいろいろな種類があるのでこの場では説明できません。いうかありすぎて私もよく使うものしか覚えていません。それぞれのインターフェイスの説明はMSDNあたりで調べてみてください。大まかには以下のような感じです。グラフ(情報工学上のグラフのこと。この場合は各処理のつながり)を管理するオブジェクト。グラフの動作状態を管理するオブジェクト。グラフから与えられるイベント(再生が完了したといった情報)を管理する。メディアの再生位置を操作するオブジェクト。メディアがオーディオを持つときに使用できる音量管理オブジェクト。メディアがビデオを持つときのそのビデオの情報を管理するオブジェクト。メディアがビデオウィンドウ(ビデオ表示窓)を持つときに使用できるウィンドウを管理するオブジェクト。自分で別にレンダリングするとき(VMR9など)には使用されないちなみに、解放するときは初期化したものから逆順に解放するのが作法です。完全に正確に逆順でなくてもいいですが、IGraphBuilderは必ず最後に解放してください。ないと状態の管理がよくわからない状態となりますので。あと、COMの概念がよく出ているコードだと思います。CoCreateInstanceによって親となるCOMオブジェクトを生成しているQueryInterfaceによるインターフェイス要求を行うことで必要な機能を使用できるようにする戻り値はほとんどの処理でHRESULTとなるというものです。以降フィルタを作成するときにもよく出てくると思いますので覚えておきましょう。簡単に説明してみました。省きすぎて文章として成立していないような・・・。コメントをキャンセルメールアドレスが公開されることはありません。志久プログラムネタや思いついたり世間で話題になっている数学ネタを解説したりしています。プログラマとしては今年度(つまり2020年3月)までの復帰となるか、完全復帰となるか、別の仕事に戻るかは運と実力次第。ちなみに教育系のプログラムでもOKです。アクセスカウンタアクセス数:スポンサーリンク。