プロファイルとその他のファイル プロパティの構成 (QASF)
次の項目では、ASF ファイルの作成に関連するさまざまなタスクを実行する方法について説明します。
プロファイルの作成 (QASF)
カスタム プロファイルを作成するには、Windows Media Format SDK を直接使用して、 WMCreateProfileManager 関数を使用してプロファイル マネージャー オブジェクトを作成します。 次に、プロファイルを作成し、IConfigASFWriter::ConfigureFilterUsingProfile メソッドを使用して WM ASF ライターに渡します。 これは、Windows Media Audio および Video 9 シリーズ コーデックを使用するプロファイルでフィルターを構成する唯一の方法です。 これらのコーデックの以前のバージョンのシステム プロファイルは、 IConfigASFWriter::ConfigureFilterUsingProfileGuid メソッドを 使用して追加できます。
メタデータの追加 (QASF)
ファイルにメタデータを追加するには、WM ASF ライターの IBaseFilter インターフェイスから QueryInterface を呼び出して、IWMHeaderInfo インターフェイスを取得します。 フィルターにプロファイルが指定されたら、 IWMHeaderInfo インターフェイス メソッドを使用してメタデータを書き込みます。
ファイルのインデックス作成 (QASF)
WM ASF ライターは、既定でテンポラルインデックス付きファイルを作成します。 フレーム インデックス付きファイルを作成するには、 IConfigAsfWriter::SetIndexMode メソッドを使用してすべてのインデックス作成を無効にしてから、ファイルを作成します。 完了したら、Windows Media Format SDK を直接使用して、ファイルのフレーム ベースのインデックスを作成します。
Two-Pass エンコード (QASF) の実行
2 パス エンコードは、バージョン 8 以降の Windows Media コーデックでのみサポートされています。 IConfigAsfWriter2::SetParam を呼び出し、dwParam パラメーターに AM_CONFIGASFWRITER_PARAM_MULTIPASSを指定し、dwParam1 パラメーターで TRUE を指定して、WM ASF ライターを前処理モードにします。
次に、フィルター グラフを実行します。 すべての前処理パスが完了すると (通常は 1 つの前処理パスのみが実行されます)、アプリケーションはフィルターから EC_PREPROCESS_COMPLETE イベントを受け取ります。 このイベントが受信されたら、 IMediaSeeking::SetPositions を使用してストリーム ポインターを先頭に戻し、フィルター グラフをもう一度実行します。 最後のパス (通常は 2 番目のパス) の後、アプリケーションはエンコード プロセスが完了したことを示す EC_COMPLETE イベントを受け取ります。 EC_PREPROCESS_COMPLETE イベントを受信する前に前処理パスが取り消された場合は、IConfigAsfWriter2::ResetMultiPassState を呼び出して、別の前処理の実行を試みる前にフィルターをリセットします。
フィルターを前処理モードから完全に除外する場合は、 IConfigAsfWriter::SetParam(AM_CONFIGASFWRITER_PARAM_MULTIPASS, FALSE) を呼び出す必要があります。
重要
エンコードに使用されるプロファイルに基づいて前処理モードを有効にするのは、アプリケーションの責任です。 一部のプロファイルでは、2 パス エンコードが必要です。このようなプロファイルを使用してファイルをエンコードしようとして、AM_CONFIGASFWRITER_PARAM_MULTIPASSを TRUE に設定しないと、EC_USERABORT エラーが発生します。 特定のプロファイルで 2 パス エンコードが必要かどうかを判断する方法の詳細については、「 Two-Pass エンコードの使用 」または 「可変ビット レート ストリームの書き込み」を参照してください。
実行時のバッファー プロパティの取得と設定 (QASF)
一部のシナリオでは、たとえば、ファイルの書き込み時にキー フレームの挿入を強制する場合、アプリケーションで実行時に Windows メディア バッファーに関する情報を取得または設定する必要がある場合があります。 WM ASF リーダー フィルターと WM ASF ライター フィルターは両方とも、ファイルの読み取りまたはファイルの書き込み中に、アプリケーションが個々のメディア バッファーの INSSBuffer3 インターフェイスにアクセスできるようにするコールバック メカニズムをサポートします。 アプリケーションでは、このインターフェイスを使用して、特定のサンプルをキー フレーム ( クリーンポイント) として指定して SMPTE タイム コードを設定したり、インターレース設定を指定したり、任意の種類のプライベート データをストリームに追加したりできます。
IAMWMBufferPass インターフェイスを使用して、ビデオ ストリームを処理しているピンからのコールバックを登録します。 ピンが IAMWMBufferPassCallback::Notify メソッドを呼び出すときは、バッファーのタイム スタンプを調べ、必要に応じて INSSBuffer3::SetProperty を呼び出して、バッファーの WM_SampleExtensionGUID_OutputCleanPoint プロパティを TRUE に設定します。
2 乗ピクセル以外のサポート (QASF)
WM ASF ライターは、ピクセル縦横比情報を出力する DV デコーダーなどのアップストリーム フィルターに接続します。 WM ASF ライターは、ファイル内のすべてのサンプルのデータ ユニット拡張機能としてこの情報を書き込みます。
WM ASF リーダーは、ファイル ヘッダーまたはサンプルのデータ ユニット拡張機能でピクセル縦横比情報を検出すると、出力ピンの最初の選択肢として VIDEOINFOHEADER2 メディアタイプを提供します。 ビデオの四角形の縦横比を記述する構造体の dwPictAspectRatioX メンバーと dwPictAspectRatioY メンバーは、ピクセルの縦横比を考慮して正しく調整されます。
インターレース形式の維持
テレビや DV カメラからインターレースされたビデオをキャプチャする場合は、エンコードされたファイルがテレビやその他のインターレースディスプレイデバイスで再生されることを期待する場合は、元のビデオを独立したフィールドとして保持することができます。 (コンピューター モニターはプログレッシブ スキャン デバイスです)。ビデオをインターレース解除し、テレビで再生するために再インターレースすると、データの損失が発生します。 ASF ファイルでは、インターレース情報は、前に説明した IAMWMBufferPassCallback メソッドを使用して、アプリケーションが各サンプルに適用するデータ ユニット拡張機能として格納されます。 元のインターレース設定を保持するファイルをエンコードするには、次の手順に従います。
- IAMWMBufferPassCallback をサポートするクラスを実装し、各サンプルのインターレース フラグを設定する Notify 関数を記述します。 この関数は、各サンプルを処理する前に WM ASF ライターによって呼び出されます。
// Set to WM_CT_TOP_FIELD_FIRST if that is your format.
BYTE flag = WM_CT_INTERLACED | WM_CT_BOTTOM_FIELD_FIRST;
HRESULT hr = pNSSBuffer3->SetProperty(WM_SampleExtensionGUID_ContentType, (void*) &flag, WM_SampleExtension_ContentType_Size);
- プロファイルをフィルターに渡す前に、プロファイルにデータ ユニット拡張機能を設定します。
hr = pWMStreamConfig2->AddDataUnitExtension( WM_SampleExtensionGUID_ContentType, WM_SampleExtension_ContentType_Size, NULL, 0 );
- プロファイルでフィルターを構成した後、WM ASF ライターから IWMWriterAdvanced2 インターフェイスを取得し 、SetInputSettings メソッドを呼び出します。
// Must do this first.
hr = pConfigAsfWriter2->ConfigureFilterUsingProfile(pProfile);
CComPtr<IServiceProvider> pProvider;
CComPtr<IWMWriterAdvanced2> pWMWA2;
hr = pConfigAsfWriter2->QueryInterface( __uuidof(IServiceProvider),
(void**)&pProvider);
if (SUCCEEDED(hr))
{
hr = pProvider->QueryService(IID_IWMWriterAdvanced2,
IID_IWMWriterAdvanced2,
(void**)&pWMWA2);
}
BOOL pValue = TRUE;
// Set the first parameter to your actual input number.
hr = pWMWA2->SetInputSetting(0, g_wszInterlacedCoding,
WMT_TYPE_BOOL, (BYTE*) &pValue, sizeof(WMT_TYPE_BOOL));