DirectXでキャプチャする

Windows

VC++(Win32)とDirectXを使ってキャプチャしたときのメモ。

環境

  • WindowsXP Pro SP3
  • Visual C++ 2008 SP1
  • DirectX SDK (June 2008)
  • Windows SDK(Microsoft Windows SDK 6.0A)
  • DirectX対応の(USB)カメラ

ソース

プロジェクトの設定

文字コード設定を行う。

  1. 「プロジェクト」→「プロパティ」→「構成プロパティ」→「全般」→「文字セット」
  2. 「マルチバイト文字セットに設定する」、又は「設定なし」に設定する。

dxtrans.hが存在しない件

Bitmapの保存にSampleGrabberを使うが、現在のDirectX SDKには「dxtrans.h」が無く、コンパイル出来ないので対策する。
「qedit.h」を以下のように編集する。
私の環境では
「C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\qedit.h」。
http://d.hatena.ne.jp/nokturnalmortum/20080901

/*
#include "dxtrans.h"
*/
#define __IDxtCompositor_INTERFACE_DEFINED__
#define __IDxtAlphaSetter_INTERFACE_DEFINED__
#define __IDxtJpeg_INTERFACE_DEFINED__
#define __IDxtKey_INTERFACE_DEFINED__

その他

・「GetCurrentBuffer」は2回呼び出す必要がある。
http://msdn.microsoft.com/ja-jp/library/cc369551.aspx
・DirectXの関数に渡すAVIファイル名(LPCOLESTR)はUnicodeなのでMultiByteToWideChar関数による変換が必要。
・上記に付随して、strlen関数の戻り値は終端文字を含まないので文字の長さを「1」増やして渡す。
・mbstowcs関数の場合はsetlocale関数を忘れないこと。
・MultiByteToWideChar関数(Win32 API)よりもmbstowcs関数の方が好きかも。
・AvgTimePerFrameは1フレームの平均処理時間をナノ秒で指定する。ゼロを指定したらWindowsが真っ青になった。
・「sn9c102」のデータシートが見つからないが(昔はあったのに・・・)、12~15fpsが限界っぽい。
・コントラスト、色相、彩度、ガンマ、鮮明度など、受信するビデオ信号の品質を調整する場合は「IAMVideoProcAmp」を使う。
・ズーム、パン、絞り、シャッター スピードなどのカメラ設定を制御する場合は「IAMCameraControl」を使う。

【中古】はじめての動画処理プログラミング Win 32 APIとDirectXで実装する動画 /CQ出版/土井滋貴(単行本)

Comments