« あんまり用途ない? マルチビデオストリーム | メイン | WMVは辛そう »

2005年08月21日

吉里吉里 ムービー拡張日誌2:: ASF/WMV/WMAについて調べる

    

VMR9のサンプルを眺めていてなんとなく、ASF/WMV/WMAが気になった。
PlayWndASFってサンプルをビルドしようとすると
Windows Media Format SDK 7.1.1をインストールして、WMStub.LIBをSamples\C++\DirectShow\Commonへコピーしろと出た。
でも、いまさら7.1.1って、と思いWindows Media SDK コンポーネントを見て、Windows Media Format 9 シリーズ SDKをダウンロード。
それ以上だとXP限定になってしまうので、Win98 SE以降となる9にした。

WMF9 SDKのサンプルのDSPlayをビルドしようとしたら次のようなエラーが出た。
error LNK2019:未解決の外部シンボル "long __stdcall ATL::AtlWinModuleInit( …
error LNK2001: 外部シンボル ""class ATL::CAtlBaseModule ATl:: …

検索するとこのページで同じことが書いてあった。
解決策は「atls.lib か atlsd.lib をリンクするといいそうだ.これは VS .NET 2003 限定みたい.」とのこと。
やってみるとうまくいって再生も出来た。

次にDirectX9 SDKのPlayWndASFをビルドしようとするが、WMStub.LIBはない。調べると、これはもう必要なくなったとか。ただし、DRMを使う時は何かあるよう。
ま、使わないからそこは無視。
インクルードファイルとライブラリファイルのパスを通してビルドするがリンクエラーが大量に出る。
LIBCMTDを無視するように設定する。
が、まだWMCreateCertificateがないというエラーが残っている。
どうもDRM用っぽいので、その部分のコードをコメントアウト。
そこを通ったら毎回失敗するようにした。
これでやっとビルドが通って、wmvファイルの再生も出来た。
が、サンプルではWM ASF Reader Filterを使用している。
これと同じような働きをするフィルターを作らないとしたら結構大変だなー

少し調べるとWM ASF Reader FilterからIWMReaderAdvanced2インターフェイスを取得し、IWMReaderAdvanced2::OpenStreamを使うことでIStream経由でデータを読めそう。
でも、OpenStreamにはIWMReaderCallbackインターフェイスを渡す必要がある。
ReadFromStreamサンプルでIWMReaderCallbackの実装のサンプルがあるけど、OnSampleの中身は空っぽ。あなたのコードをここに追加してと書いてあるだけ。
これで動くんだろうか?
ま、やってみるか。



投稿者 Takenori : 2005年08月21日 23:06




comments powered by Disqus
Total : Today : Yesterday : なかのひと