サンプルを書き込むには
[このページに関連付けられている機能である Windows Media Format 11 SDK は、従来の機能です。 ソース リーダーとシンク ライターに置き換わりました。 ソース リーダーとシンク ライターは、Windows 10とWindows 11用に最適化されています。 Microsoft では、可能であれば、新しいコードで Windows Media Format 11 SDK ではなくソース リーダーとシンク ライターを使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
書き込むファイルの入力を特定して構成したら、ライターへのサンプルの受け渡しを開始できます。 可能であれば、プレゼンテーション時の順序でサンプルを渡して、書き込みプロセスをより効率的にする必要があります。
サンプルを渡す前に、 IWMWriter::BeginWriting を呼び出してライターを受け入れるように設定する必要があります。
サンプルをライターに渡すには、次の手順を実行します。
- IWMWriter::AllocateSample を呼び出して、バッファーを割り当て、INSSBuffer インターフェイスへのポインターを取得します。
- INSSBuffer::GetBuffer を呼び出して、手順 1 で作成したバッファーのアドレスを取得します。
- サンプル データをバッファーの場所にコピーし、渡されたサンプルが割り当てられたバッファーに収まるようにします。 任意のメモリ コピー関数を使用して、データをコピーできます。 一般的な選択肢は memcpy であり、標準の C ランタイム ライブラリに含まれています。
- INSSBuffer::SetLength を呼び出して、サンプルの実際のサイズを反映するようにバッファーで使用されるデータの量を更新します。
- IWMWriter::WriteSample メソッドを使用して、入力番号とサンプル時間と共にバッファー インターフェイスをライターに渡します。 入力のすべてのオーディオ サンプルはコンテンツの同じ継続時間を表すので、サンプル期間を実行中の合計に追加することで、サンプル時間を把握できます。 ビデオの場合は、フレーム レートに基づいて時間を計算する必要があります。
WriteSample は 非同期的に動作し、アプリケーションがメソッドを再度呼び出す準備が整う前に、バッファーからのデータの書き込みを完了しない可能性があります。 したがって、 WriteSample の呼び出しごとに AllocateSample を 1 回呼び出す必要があります。 ただし、WriteSample を呼び出した直後に INSSBuffer インターフェイスを解放できます。
サンプルの受け渡しが完了したら、 IWMWriter::EndWriting を呼び出します。
メモ ファイル内のすべてのストリームのサンプルが、相互に同期してライターに渡すことが重要です。 つまり、可能な限り、 IWMWriterAdvanced::SetSyncTolerance で指定された同期許容範囲内で、プレゼンテーション時の順序でサンプルをライターに渡す必要があります。 データが 1 秒以下の単位で各ストリームに配信されると、最適な結果が得られます。
ストリームもほぼ同時に終了する必要があります。 たとえば、45 秒のオーディオ ストリームと 50 秒のビデオ ストリームを含むファイルを書き込むべきではありません。 このようなファイルを変更されていない入力でエンコードすると、ストリームの末尾にあるオーディオ データの一部が削除されます (短いストリームであっても)。 ファイル エンコードを機能させるには、オーディオ入力に 5 秒の無音を追加して、あるストリームが別のストリームの数秒前に終了しないようにする必要があります。 テキスト ストリームやイメージ ストリームなどの断続的なサンプルを含むストリーム型をこの方法で埋め込む必要はありません。 スクリプト コマンド ストリームも、これらのすべてのルールに従う必要があります。
関連トピック