サードパーティ製コーデックを使用して ASF ファイルを作成するには

[このページに関連付けられている機能である Windows Media Format 11 SDK は、レガシ機能です。 これは、ソース リーダーシンク ライターによって置き換えられます。 ソース リーダーシンク ライターは、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、Windows Media Format 11 SDK ではなくソース リーダーシンク ライターを使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

Windows Media Format SDK を使用して、任意のコーデックでエンコードされたデジタル メディアを含む ASF ファイルを作成できます。 この SDK に含まれているコーデック以外のコーデックを使用する場合は、次の手順を実行する必要があります。

  1. 目的のコーデックを使用してコンテンツをエンコードします。
  2. 手順 1 で使用したコーデックでエンコードされたコンテンツを識別するための GUID 値を検索または作成します。
  3. 新しいプロファイルを作成するか、エンコードされたコンテンツで使用する既存のプロファイルを変更します。
    • 適切なメジャーの種類を使用して、エンコードされたコンテンツのストリームを作成します。 主要なメディアの種類の詳細については、「 メディアの種類」を参照してください。 手順 2 で識別された GUID をメディア サブタイプとして使用します。
    • ストリームのビット レートとバッファー ウィンドウを、バッファー オーバーフローが発生しない値に設定します。 エンコード時にコーデックからこれらの値を取得できる必要があります。 SDK ランタイム コンポーネントは、ビットレート/バッファー ウィンドウ値をチェックし、必要に応じてサンプルをドロップして、指定されたデータをこれらの値に適合させます。 値を正しく設定しないと、ファイルが正しくストリーミングされず、再生が低下します。
    • ビデオ ストリームの場合は、WMVIDEOINFOHEADER 構造体に含まれる BITMAPINFOHEADER 構造体の biCompression メンバーを、コンテンツの適切な FOURCC 値に設定する必要があります。 この値は、サブタイプ GUID の最初の 4 バイトと等しい必要があります。 たとえば、 biCompression が MAKEFOURCC('T','E','S','T')=0x54455354の場合、サブタイプ GUID は 54455354-XXXX-XXXX-XXXX-XXXXXXXXXXXX のように開始されます。
  4. ライター オブジェクトを作成し、前の手順で作成したプロファイルを読み込みます。 ファイルの書き込みの詳細については、「 ASF ファイルの書き込み」を参照してください。
  5. ファイルの入力をループ処理し、通常と同様に、それぞれに入力プロパティを割り当てます。 入力の詳細については、「入力 の操作」を参照してください。 サード パーティ製コーデックでエンコードされたストリームの場合は、IWMWriter::BeginWriting を呼び出す前に、IWMInputMediaProps インターフェイス ポインターを NULL に設定します。
  6. 前の手順で作成した新しいプロファイルを使用して、ファイルを書き込みます。 IWMWriter::WriteSample の代わりに IWMWriterAdvanced::WriteStreamSample を使用して、圧縮されたサンプルを渡します。 ビデオの場合は、 dwFlags パラメーターとして WM_SF_CLEANPOINTを渡すことによって、キー フレームであるサンプルを指定する必要があります。

サード パーティ製コーデックでエンコードされたストリームを処理および圧縮解除するには、圧縮ストリームのサンプルを読む必要があります。 読み取りアプリケーションでは、ストリームのサンプル展開も処理する必要があります。

MPEG-2 ストリームを ASF に配置する

注意

このトピックは、WINDOWS Media Format SDK を使用して MPEG-2 (または B フレームを使用する他の圧縮形式) を ASF ファイル コンテナーに格納するアプリケーションに適用されます。

 

ライター オブジェクトでは、すべての入力サンプルにタイム スタンプが必要であり、各入力サンプルのプレゼンテーション時間が、その前のサンプルよりも後にあることを前提としています。 ほぼすべての非圧縮ビデオと一部の圧縮ビデオ ストリームは、これらの条件を満たしていますが、MPEG-2 ストリームは満たされません。 MPEG-2 では、すべてのサンプルにタイムスタンプが設定されているわけではありません。B フレームが存在する場合、サンプルのデコード順序はレンダリング順序と同じではありません。 ライター オブジェクトは、順序が正しいサンプルを検出すると、それらを "正しい" 順序に再配置します。 そのため、MPEG-2 ストリームをネイティブ (デコードされていない) ASF コンテナーに格納するには、次の手順を実行する必要があります。

ファイルを書き込む場合:

  1. サンプルの実際の MPEG タイムスタンプの開始時刻と停止時刻の値を含む構造体を保持する各入力サンプルに、固定サイズのデータ ユニット拡張機能 (DUE) を追加します。 サンプルにタイムスタンプがない場合は、これらの値に -1 を使用します。
  2. ライター オブジェクトに、常に増加している入力タイムスタンプを指定して、サンプルを受信とまったく同じ順序でファイルに書き込むようにします。 ダミーのタイムスタンプは、時間の経過と同時に平均した実際のプレゼンテーション時間にほぼ対応している必要があります。 ダミーのタイム スタンプはシークタイムラインを形成するため、リアルタイム スタンプを基準にして分岐すると、ファイルに対するシーク操作によって予期しない結果が生成されます。 ただし、サンプル時間間のジッターの量が限られていると、シーク操作に深刻な影響はありません。

ファイルを読み取るとき:

  • ファイルから読み取ったサンプルごとに、DUE を調べます。 0 以上の開始時刻が含まれている場合は、デコーダーに配信される前に、その値を出力サンプルのタイム スタンプにコピーします。 出力サンプルの他のすべてのタイム スタンプを NULL に設定 します。 DirectShow では、これは IMediaSample::SetTime(NULL,NULL) を呼び出すことによって行われます。

コンテンツのバッファリング

IWMWriter インターフェイス

IWMWriterAdvanced インターフェイス

非同期リーダーを使用して圧縮されたサンプルを配信するには

同期リーダーを使用してストリーム サンプルを取得するには

WMVIDEOINFOHEADER

プロファイルの操作

ASF ファイルの書き込み