ビデオ機能
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
IAMStreamConfig::GetStreamCaps メソッドは、AM_MEDIA_TYPEとVIDEO_STREAM_CONFIG_CAPS構造体のペアの配列にビデオ機能を提供します。 これを使用すると、以下で説明するように、ピンでサポートされているすべての形式と解像度を公開できます。
GetStreamCaps のオーディオ関連の例については、「オーディオ機能」を参照してください。
キャプチャ カードで、160 x 120 ピクセルから 320 x 240 ピクセルまでのすべての解像度で JPEG 形式がサポートされているとします。 サポートされている解像度の違いは、サポートされている各解像度から 1 ピクセルを加算または減算して、次にサポートされている解像度を取得するため、この場合は 1 つです。 サポートされている解像度のこの違いは、粒度と呼ばれます。
カードが 640 x 480 のサイズもサポートするとします。 次に、この 1 つの解像度と上記の解像度範囲 (160 x 120 ピクセルから 320 x 240 ピクセルの間のすべてのサイズ) を示します。
また、160 x 120 から 320 x 240 の解像度で 24 ビットカラー RGB 形式をサポートし、粒度は 8 であるとします。 次の図は、この場合の有効なサイズの一部を示しています。
別の言い方をして、より多くの解決策を一覧表示するために、有効な解決策の一覧を次に示します。
- 160 x 120
- 168 x 120
- 168 x 128
- 176 x 128
- 176 x 136
- ...追加の解像度 ...
- 312 x 232
- 320 x 240
GetStreamCaps を使用して、メディアの種類が 320 x 240 JPEG (既定または優先サイズの場合) と最小機能 160 x 120、最大機能 320 x 240、粒度 1 を提供することで、これらの色の形式とディメンションの機能を公開します。 GetStreamCaps を使用して公開する次のペアは、メディアの種類が 640 x 480 JPEG で、最低 640 x 480、最大 640 x 480、粒度が 0 です。 3 番目のペアには、320 x 240 のメディア タイプ、最小機能が 160 x 120 の 24 ビット RGB、最大機能 320 x 240、粒度 8 が含まれます。 この方法では、カードがサポートする可能性があるほぼすべての形式と機能を公開できます。 指定する圧縮形式を知る必要があるアプリケーションは、すべてのペアを取得し、メディアの種類のすべての一意のサブタイプの一覧を作成できます。
フィルターは、 VIDEOINFOHEADER 構造体の rcSource メンバーと rcTarget メンバーから、それぞれメディアの種類のソースとターゲットの四角形を取得します。 フィルターは、ソース四角形とターゲット四角形をサポートする必要はありません。
IAMStreamConfig ドキュメント全体で説明されているトリミング四角形は、出力ピンの VIDEOINFOHEADER 構造体の rcSource 四角形と同じです。
IAMStreamConfig ドキュメント全体で説明されている出力四角形は、出力ピンの BITMAPINFOHEADER 構造の biWidth メンバーと biHeight メンバーと同じです (「AVI ファイル形式の DV データ」を参照)。
フィルターの出力ピンが空でないソースとターゲットの四角形を持つメディアの種類に接続されている場合は、入力形式のソース サブレクトグルを出力形式のターゲット サブrectangleに拡張するためにフィルターが必要です。 ソース サブrectangle は、 VIDEO_STREAM_CONFIG_CAPS 構造体の InputSize メンバーに格納されます。
たとえば、次のビデオ 圧縮シナリオを考えてみましょう。入力イメージは RGB 形式で、サイズは 160 x 120 ピクセルです。 ソース四角形の左上隅は座標 (20,20) で、右下隅は (30,30) です。 出力イメージのサイズは MPEG 形式で、サイズは 320 x 240 です。 ターゲット四角形の左上隅は (0,0) で、右下隅は (100,100) です。 この場合、フィルターは 160 x 120 RGB ソース ビットマップの 10 x 10 個を取り、320 x 240 ビットマップの上位 100 x 100 領域を埋め、残りの 320 x 240 ビットマップはそのままにする必要があります。 次の図は、このシナリオを示しています。
フィルターはこれをサポートしていない可能性があり、 rcSource と rcTarget が空ではないメディアの種類との接続に失敗する可能性があります。
VIDEOINFOHEADER 構造体は、フィルターのデータ レート機能に関する情報を公開します。 たとえば、出力ピンを特定のメディアの種類で次のフィルターに接続したとします (直接、または CMediaType::SetFormat 関数によって渡されたメディアの種類を使用)。 そのメディアの種類の VIDEOINFOHEADER 形式構造の dwBitRate メンバーを見て、ビデオを圧縮する必要があるデータレートを確認します。 VIDEOINFOHEADER 構造体の AvgTimePerFrame メンバーのフレームあたりの時間の単位数に dwBitRate メンバーのデータ レートを掛け、10,000,000 (1 秒あたりの単位数) で除算すると、各フレームのバイト数を確認できます。 小さいサイズのフレームを作成できますが、大きなフレームは作成できません。 ビデオ コンプレッサーまたはキャプチャ フィルターのフレーム レートを決定するには、出力ピンのメディア の種類から AvgTimePerFrame を使用します。