ビデオ 画像サンプルの作成
[このページに関連付けられている機能である Windows Media Format 11 SDK は、従来の機能です。 ソース リーダーとシンク ライターに置き換わりました。 ソース リーダーとシンク ライターは、Windows 10とWindows 11用に最適化されています。 Microsoft では、可能であれば、新しいコードで Windows Media Format 11 SDK ではなくソース リーダーとシンク ライターを使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
ビデオ イメージ ストリームは、一連の静止画像を含むビデオです。 画像はフレーム内で移動でき、各イメージは次のイメージにブレンドできます。 ビデオ イメージ ストリームは、Windows Media Video 9 Image v2 コーデックを使用してエンコードされます。 出力ビデオは、Windows Media Video 9 コーデックによって作成されたビデオと似ています。
ビデオ イメージ ストリームを含むプロファイルを作成するには、「コーデック からのストリーム構成情報の取得」の説明に従ってビデオ コーデックを列挙することから始めます。 WMMEDIASUBTYPE_WVP2 サブタイプをサポートするコーデックを検索します。
ライター オブジェクトにプロファイルを設定したら、 IWMWriter::GetInputProps を呼び出して、Video Image 入力ストリームのメディア プロパティを取得します。 IWMMediaProps::GetMediaType を呼び出してメディア プロパティ オブジェクトからメディアの種類を取得し、サブタイプを WMMEDIASUBTYPE_VIDEOIMAGE に変更します。 ビデオの幅と高さは、ストリームに追加する画像を含めるために必要な最大サイズに設定する必要があります。 次に、変更された入力の種類 で IWMMediaProps::SetMediaType を呼び出します。 これで、ライター オブジェクトへのサンプルの送信を開始する準備ができました。
各サンプルは 、WMT_VIDEOIMAGE_SAMPLE2 構造体で始まる必要があります。 さらに、サンプルにはビットマップ イメージが含まれる場合があります。 画像は、最初に表示されるフレームのサンプルにのみアタッチされます。 そのイメージを使用するすべての追加フレームには、構造体内の情報のみが必要です。 入力ビットマップは、RGB、ピクセルあたり 24 ビットとして書式設定する必要があります。
ビットマップ ファイルはイメージ データを格納し、イメージの各行のデータが 4 で割り切れるバイト数を受け取るようにします。 (これはビットマップのストライドと呼ばれます)。これにより、ビデオのすべての行が DWORD 境界に強制的に開始されるため、コピーの効率が高くなります。 イメージ行が 4 で均等に割り切れない場合、行は 4 バイトの次に高い倍数に埋め込まれます。 画像データを添付するときは、各行のデータの末尾に存在するパディングを削除する必要があります。
Windows Media Video 9 Image v2 コーデックは、一度に最大 2 つのイメージをメモリに保持します。 これらのイメージは、前のイメージと現在のイメージと呼ばれます。 各イメージには、フレーム内でのイメージの表示方法を決定する 、WMT_VIDEOIMAGE_SAMPLE2 構造体にメンバーのセットがあります。 イメージを追加するには、WMT_VIDEOIMAGE_SAMPLE2 の dwControlFlags メンバーを WMT_VIDEOIMAGE_SAMPLE_INPUT_FRAME に設定します。 入力フレームをコーデックに渡すと、そのイメージが現在のイメージになります。 前のサンプルの現在の画像だったイメージは通常、前の画像になり、前のサンプルの前の画像だったイメージは破棄されます。 bKeepPrevImage メンバーを TRUE に設定することで、以前のイメージを保持するようにコーデックを構成できます。 その場合、前のサンプルの現在のイメージだったイメージは破棄されます。
ビデオ イメージ フレームの基本的な構成は、画像ごとに 2 つの要素 (関心領域とブレンド係数) によって決定されます。 イメージの対象領域は、原点、幅、高さによって定義されます。 対象領域によって記述された画像の一部が出力フレームを埋めます。 対象領域が出力フレームとは異なるサイズの場合、コーデックによってサイズが変更されます。 イメージのブレンド係数によって、2 つのイメージのブレンドが決まります。 現在の画像と前の画像のブレンド係数は合計 1.0 である必要があります。 たとえば、 fCurrBlendCoef が 0.5 に設定され、 fPrevBlendCoef が 0.5 に設定されている場合、出力フレームは両方のイメージの対象領域の等しいブレンドで構成されます。
画像の対象領域を操作することで、パンとズームの効果を作成できます。 ブレンド係数を使用すると、画像間でクロスフェード (ディゾルブ) できます。 これらの効果に加えて、定義済みの切り替えのいずれかを使用して、より複雑なフレームを作成できます。 使用可能な画面切り替えは、このドキュメントの 「ビデオ イメージの切り替え 」セクションで説明されています。 画面切り替えを使用する場合は、各フレームを構成する必要があります。 これを行う最も簡単な方法は、完全な効果を得るために WMT_VIDEOIMAGE_SAMPLE2 構造体のメンバーを段階的に変更する関数を作成することです。
デフォメーションに設定する値の詳細については、「 WMT_VIDEOIMAGE_SAMPLE2」を参照してください。
メモ ビデオ イメージ ストリームを含むファイルにオーディオを含める場合は、圧縮されていないオーディオ入力を使用する必要があります。 Video Image ストリームと既存の圧縮オーディオ ストリームを組み合わせるには、オーディオを圧縮解除し、サンプルを非圧縮で渡す必要があります。 Video Image ストリームを作成するときに圧縮されたサンプルをライターに渡すと、エラーが発生し、ビデオからサンプルが削除されます。
また、オーディオ ストリームのない圧縮されたビデオ イメージ ファイルには、1 つの ASF パケットに非常に小さい高度に圧縮されたビデオ フレームがいくつか含まれる可能性があり、以前のバージョンのWindows メディア プレーヤーで再生エクスペリエンスが低下する可能性があります。 この問題を回避するには、ファイルにサイレント オーディオ ストリームを挿入することをお勧めしますが、ファイル サイズも大きくなります。
関連トピック