エンコーダーでのメディアの種類のネゴシエーション

Microsoft Media Foundation では、エンコーダーは、1 つの入力と 1 つの出力を持つ Media Foundation 変換 (MFT) として実装されます。 エンコード セッションの前に、エンコーダーは、入力として受信するストリームの特性と、出力として生成するストリームの形式を認識する必要があります。 エンコーダーを介してデータを渡す前に、入出力メディアの種類と関連する特性を設定する必要があります。 適切な メディア・タイプ GUID を指定して入出力フォーマットを指定し、出力メディア・タイプに関連する メディア・タイプ属性 を設定して出力ストリームの特性を設定する必要があります。 新しくインスタンス化されたエンコーダーには、メディアの種類が設定されていません。

入力メディアの種類は、PCM オーディオや RGB ビデオなどの非圧縮形式です。 エンコーダーで使用される形式の種類は、 VIDEOINFOHEADER および WAVEFORMATEX 構造体によって記述される形式に制限されます。 これらの構造の詳細については、Windows SDK のドキュメントを参照してください。Media Foundation には、形式構造からメディア型を作成するためのヘルパー関数が用意されています。 たとえば、 MFInitMediaTypeFromVideoInfoHeader 関数は VIDEOINFOHEADER 構造体からビデオの種類を初期化し、 MFInitMediaTypeFromWaveFormatEx 関数は WAVEFORMATEX または WAVEFORMATEXTENSIBLE 構造体からビデオの種類を初期化します。 詳細については、「 メディアの種類の変換」を参照してください。 エンコーダーで入力メディアの種類を設定するには、 IMFTransform::SetInputType を呼び出します。

出力メディアの種類は、最終的なソース ストリームまたはファイルで使用される圧縮形式です。 使用可能な出力メディアの種類は、入力メディアの種類を設定した後でのみ設定できます。 エンコーダーがMF_E_NO_MORE_TYPESを返すまで、ループ内で IMFTransform::GetOutputAvailableType を呼び出すことで、サポートされている出力の種類を取得できます。 イテレーションごとに型インデックスをインクリメントします。 適切なメディアの種類が見つかると、 IMFTransform::SetOutputType を呼び出して出力メディアの種類を設定します。

出力メディアの種類を選択する際の決定要因は、エンコードの種類とエンコード要件によって異なります。 たとえば、CBR でエンコードされたオーディオ ストリームの場合、入力に一致し、ターゲット値にできるだけ近いビット レートを持つメディアの種類を見つける必要があります。

CBR 以外のエンコード モードを使用する場合は、モードを設定してから、そのモードの出力の種類を列挙する必要があります。エンコーダーは、モード セットに応じてサポートされている出力の種類を変更するためです。 エンコード モードを制御するプロパティは 、MFPKEY_VBRENABLED され 、MFPKEY_PASSESUSEDされます。 たとえば、VBR 品質エンコードの出力の種類を列挙する場合、メディアの種類は、使用する品質値によって異なります。 これらのプロパティの設定については、「 エンコード プロパティ」を参照してください。

エンコーダー MFT のインスタンス化

Windows Media Encoders