プロファイルおよびその他の ASF ファイル プロパティの構成
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
次の項目では、ASF ファイルの作成に関連するさまざまなタスクを実行する方法について説明します。 このトピックで説明するインターフェイスの一部は、Windows Media Format SDK のドキュメントに記載されています。
プロファイルの作成
ASF プロファイルの詳細については、Windows Media Format SDK を参照してください。基本的には、ビット レート、ストリームの数と種類、圧縮品質など、Windows Media Format ファイルの属性について説明します。 フィルターはプロファイルを使用して、書き込む Windows メディア形式ファイルの種類、設定する必要がある入力ピンの数、および受け入れられるメディアの種類を決定します。
カスタム プロファイルを作成するには、Windows Media Format SDK を直接使用して、 WMCreateProfileManager 関数を使用してプロファイル マネージャー オブジェクトを作成します。 次に、プロファイルを作成し、IConfigASFWriter::ConfigureFilterUsingProfile メソッドを使用して WM ASF ライターに渡します。 これは、Windows Media Audio および Video 9 シリーズ コーデックを使用するプロファイルでフィルターを構成する唯一の方法です。 これらのコーデックの以前のバージョンのシステム プロファイルは、 IConfigASFWriter::ConfigureFilterUsingProfileGuid メソッドを 使用して追加できます。
新しいプロファイルに追加の入力ピンが必要ない限り、フィルターの入力ピンの接続中にプロファイルをリセットできます。 たとえば、プロファイルを 1 入力のオーディオのみのプロファイルから 2 入力オーディオとビデオ プロファイルに変更すると、オーディオ ピンのみが再接続され、ビデオ ストリーム用の新しいピンは作成されません。
メタデータの追加
ファイルにメタデータを追加するには、 WM ASF ライター フィルターに 対して IWMHeaderInfo インターフェイスのクエリを実行します。 フィルターにプロファイルが指定されたら、 IWMHeaderInfo インターフェイス メソッドを使用してメタデータを書き込みます。
ファイルのインデックス作成
WM ASF ライターは、既定でテンポラルインデックス付きファイルを作成します。 フレーム インデックス付きファイルを作成するには、 IConfigAsfWriter::SetIndexMode メソッドを使用してすべてのインデックス作成を無効にしてから、ファイルを作成します。 完了したら、Windows Media Format SDK を直接使用して、ファイルのフレーム ベースのインデックスを作成します。
Two-Pass エンコード
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 を呼び出して、別の前処理の実行を試みる前にフィルターをリセットします。
フィルターを前処理モードから完全に除外する場合は、AM_CONFIGASFWRITER_PARAM_MULTIPASS パラメーターを FALSE に設定する必要があります。
重要
エンコードに使用されるプロファイルに基づいて前処理モードを有効にするのは、アプリケーションの責任です。 一部のプロファイルでは、2 パス エンコードが必要です。このようなプロファイルを使用してファイルをエンコードしようとして、AM_CONFIGASFWRITER_PARAM_MULTIPASSを TRUE に設定しないと、 EC_USERABORT エラーが発生します。 詳細については、Windows Media Format SDK のドキュメントを参照してください。
実行時のバッファー プロパティの取得と設定
一部のシナリオでは、たとえば、ファイルの書き込み時にキー フレームの挿入を強制する場合、アプリケーションで実行時に Windows メディア バッファーに関する情報を取得または設定する必要がある場合があります。 WM ASF リーダー フィルターと WM ASF ライター フィルターは両方とも、ファイルの読み取りまたはファイルの書き込み中に、アプリケーションが個々のメディア バッファーの INSSBuffer3 インターフェイスにアクセスできるようにするコールバック メカニズムをサポートします。 アプリケーションでは、このインターフェイスを使用して、特定のサンプルをキー フレームとして指定したり、SMPTE タイム コードを設定したり、インターレース設定を指定したり、任意の種類のプライベート データをストリームに追加したりできます。
IAMWMBufferPass インターフェイスを使用して、ビデオ ストリームを処理しているピンからのコールバックを登録します。 ピンは、バッファーごとに IAMWMBufferPassCallback::Notify メソッドを呼び出します。
四角形以外のピクセル
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 = S_OK; 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));
関連トピック