青島のしま〜Blue Islands〜


DirectX Tips

Viewcast Ospreyシリーズで,DirectShow経由でキャプチャする

Osprey-210を使ってキャプチャ使用としたときに,
少し苦労したのでメモしておきます.

普通のUSBカメラやDVカメラの映像をGraphEditで取り込む場合は,
「Video Capture Sources」から,デバイス用のフィルタをソースフィルタとして扱って,プレビューピンやキャプチャーピンから出てくるストリームを使えばいいわけですが,Ospreyの場合はそれだけでは使えません.

Ospreyの場合は,
「WDM ストリームクロスバーデバイス」から
「Osprey Crossbar」というフィルタを選択して使います.
これの出力を普段の「Video Capture Sources」のフィルタにつなげます.
こうすることでキャプチャできます.

Viewcast Osprey-440のバグ?

GraphEditで,Osprey-440でキャプチャ↓映像をVideoRendererやVMR9で表示しようとしてもなぜか表示されない.
FileWriterで保存すると,しっかり保存はされている.
VideoRendererは2つあるが,下のほうのVideoRendererを使うとなぜかしっかり表示される(これが解決法?).

Canopus MTVX-WHFをDirectShow経由で使う(未解決)

・MTVX-WHFは2系統のキャプチャができるわけですが,
 Feather等の専用アプリ以外でも2系統のキャプチャデバイスとして使えるかどうか?
 という疑問をチェックしてみました.
 結果は,×です.
 WindowsMediaエンコーダや,DirectShowのGraphEditで調べてみたところ,
 キャプチャデバイスは1つしか見えてなく,1系統しか取れないようです.
 つまりAVIキャプチャ機能は1つしかできないということですね.
 #ここで,未解決事項.
  1系統の入力はキャプチャできるはずなんですが,
  なぜか,画面が黒くて入力ソースが見えないという現象に陥っています.
  何が悪いんだろう...

DirectShowのインストール(DirectX SDKでは入らない)

DirectX 9.0 SDK Update (April 2005) 以降,DirectShow 関連のコンポーネントが除去されました.
では,どうすればよいかというと,
Platform SDK (April 2005 - Windows Server 2003 SP1) をインストールすればOKです.
つまり,DirectXではなくなって,Playtform SDKに含まれるようになったということです.

http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en

ここから PSDK-x86.exe をダウンロードして実行.
Web経由のインストールなのでけっこう時間がかかります.
#DirectShow以外のコンポーネントをインストールしないようにしておくと早く終わります.
GraphEditもちゃんと含まれていました.(ショートカットはなかったですが)
「C:\Program Files\Microsoft Platform SDK\Bin\graphedt.exe」

コンパイルエラー

以下のコンパイルエラーが出る場合
error LNK2019:未解決の外部シンボル
"long __stdcall ATL::AtlWinModuleInit(struct ATL::_ATL_WIN_MODULE70 *)"
(?AtlWinModuleInit@ATL@@YGJPAU_ATL_WIN_MODULE70@1@@Z) が関数
"public: __thiscall ATL::CAtlWinModule::CAtlWinModule(void)"
(??0CAtlWinModule@ATL@@QAE@XZ) で参照されました。
プロジェクトの設定で,
「リンカ」の「追加の依存ファイル」に,
atlsd.lib(Debug) atls.lib(Release)を追加する
#これは,VS.NET2003限定らしい.
#ソースフィルタ開発(CSource,CSourceStreamを継承したフィルタ)でこのエラーがよく出てくるようです.

DirectShowで追っかけ再生

ストリームバッファエンジンというのを使えばできるらしい
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/directx9_c/directx/htm/usingthestreambufferengine.asp

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/directx9_c/directx/htm/streambufferenginefilters.asp

DbgLogの使い方

DirectShowのデバッグの手法として,
・DbgBreak
・DbgLog
などのデバッグ用マクロがありますが,
DbgBreakは固定テキストしかつかえなく(変数は使えない)
DbgLogはprintf形式が使えるので便利です.

手っ取り早く使う方法

1.RegEditで,
  HKEY_LOCAL_MACHINE\SOFTWARE\Debug\HDDVDNavigator.ax
  の LogToFile の値を log.txt (好きなファイル名でOK)に設定する

2.プログラムソースで,次のように書く
    DbgLog((LOG_CUSTOM1, 0, "Hogehoge:%d", value ));

3.フィルタを実行
これで,log.txt(たぶん.grfファイルと同じディレクトリ)に
デバッグ出力されます.
スレッドIDとクロック(たぶん)もわかるので,便利です.

詳細説明

・レベルについて
 DbgLogの第2引数に,ログレベルというのがあります.
 これは,ログレベルを変更することで,
 どこまで出力するかを変えることができるようになっています.

 例:
  ・HKEY_LOCAL_MACHINE\SOFTWARE\Debug\HDDVDNavigator.ax の 
   CUSTOM1 の値を 0から3に変更
  ・DbgLog((LOG_CUSTOM1, 2, "Hogehoge:%d", value ));// ←出力される
  ・DbgLog((LOG_CUSTOM1, 3, "Hogehoge:%d", value ));// ←出力される
  ・DbgLog((LOG_CUSTOM1, 4, "Hogehoge:%d", value ));// ←出力されない
 つまり,レジストリにあるキーの値以下ならば,出力されます.

・ログの種類について
 DbgLogの第1引数に,メッセージタイプというのがあります.
 これは,TRACE用メッセージなのか,ERRORメッセージなのか,
 などの意味を示します.
 CUSTOM1というのをすでに使っていますが,これもその一つで,
 これはユーザ定義メッセージとして使えるものです.
 これらそれぞれに対してログレベルが設定できるようになっています.

 例:
  ・HKEY_LOCAL_MACHINE\SOFTWARE\Debug\HDDVDNavigator.ax の 
   TRACE,ERROR,CUSTOM1など...

・その他
 BaseClassesのCSourceなどにも,DbgLogが使われているので,
 HKEY_LOCAL_MACHINE\SOFTWARE\Debug\HDDVDNavigator.ax の
 TRACE の値を 0から3に変更したりすると
 CSourceクラスのほうの実行状況がログに取れます.

CoInitializeEx()がエラーになる(見つからなくて未解決になる)

プロジェクト設定で,プリプロセッサの設定を変更したら直ります.たぶん.


作成日: 2006年02月28日02時38日50秒
更新履歴
2008年07月22日 2008年02月08日 2008年02月06日 2008年02月05日 2007年10月25日 2006年12月20日 2006年12月19日 2006年12月05日 2006年09月20日 2006年06月18日 2006年06月12日 2006年04月22日 2006年03月30日 2006年02月28日 2006年02月23日 2006年02月18日 2006年01月13日 2005年12月21日