トランスコード API の使用

このトピックでは、トランスコード API を使用してメディア ファイルをエンコードする方法について説明します。

概要

トランスコード API を使用する前に、アプリケーションには次の情報が必要です。

  • 再エンコードされる既存のメディア ファイルへのパスまたは URL。
  • 出力ファイルの名前。
  • MP4 や Advanced Streaming Format (ASF) などの出力ファイルのコンテナーの種類。
  • エンコーディング形式。 この情報には、エンコードされたオーディオストリームとビデオストリームを記述するメディアの種類が含まれます。

トランスコード API を使用するために、アプリケーションは次の手順を実行します。

  1. ソース ファイルを読み取るメディア ソースを作成します。
  2. トランスコード プロファイルを作成します。 オーディオ ストリーム、ビデオ ストリーム、およびファイル コンテナーを記述する属性を追加します。
  3. トランスコード プロファイルを使用してエンコード トポロジを作成します。 (トポロジの詳細については、「トポロジ について」を参照してください)。
  4. メディア セッションでトポロジを設定します。
  5. メディア セッションを開始し、 MESessionEnded イベントを 待機します。

このトピックの残りの部分では、これらの手順について詳しく説明します。

メディア ソースの作成

メディア ソースは、ソース ファイルを読み取って解析するオブジェクトです。 メディア ソースを作成するには、 ソース リゾルバーを使用します。 コード例については、「 ソース リゾルバーの使用」を参照してください。

トランスコード プロファイルの作成

トランスコード プロファイルは、出力ファイルのエンコードに使用される形式と設定を記述します。 トランスコード プロファイルには、次の 3 つの属性セットが含まれています。

  • オーディオ属性: 対象のオーディオ形式とオーディオ エンコーダーの設定について説明します。
  • ビデオ属性: ターゲット ビデオ形式とビデオ エンコーダーの設定について説明します。
  • コンテナー属性: ファイル コンテナーの種類と、一部のグローバル エンコード設定を定義します。

トランスコード プロファイルを作成するには、 MFCreateTranscodeProfile 関数を呼び出します。 この関数は、 IMFTranscodeProfile インターフェイスへのポインターを返します。 初期プロファイル オブジェクトが空です。属性は含まれない。 次の手順では、プロファイルを定義する属性を追加します。

オーディオ属性

オーディオ ストリームの属性を追加するには、 IMFTranscodeProfile::SetAudioAttributes を呼び出します。 これらの属性は、オーディオ ストリームのエンコード方法を指定します。 出力ファイルにオーディオ ストリームが含まれていない場合は、これらの属性を省略します。

オーディオ属性は、次の 2 つのカテゴリに分類されます。

  • エンコードされたストリームの形式を指定する属性
  • 他のエンコード パラメーターを指定する属性。

「オーディオ メディアの種類」セクションで説明されているように、書式属性は単に メディアタイプの属性です。 形式属性の正確なセットは、エンコーダーによって異なります。 ( Media Foundation でサポートされているメディア形式に関するページを参照してください)。一般的なオーディオ形式属性の一覧を次に示します。

Format 属性 説明
MF_MT_SUBTYPE サブタイプ。 オーディオ サブタイプ GUID に関するページを参照してください。
MF_MT_AUDIO_NUM_CHANNELS オーディオ チャネルの数。
MF_MT_AUDIO_SAMPLES_PER_SECOND 1 秒あたりのオーディオ サンプルの数。
MF_MT_AUDIO_BLOCK_ALIGNMENT ブロックの配置。
MF_MT_AUDIO_AVG_BYTES_PER_SECOND 1 秒あたりの平均バイト数 (エンコードされたビット レート)。

 

次のエンコード パラメーターが定義されています。

Encoding パラメーター 説明
MF_TRANSCODE_DONOT_INSERT_ENCODER トランスコード API がオーディオ ストリームのエンコーダーを挿入できないようにします。
MF_TRANSCODE_ENCODINGPROFILE デバイス準拠テンプレートを指定します。 (ASF ファイルにのみ適用されます)。
MF_TRANSCODE_QUALITYVSSPEED エンコード品質と速度のトレードオフを指定します。

 

書式属性を設定する必要があります。 エンコード パラメーターは省略可能です。

エンコーダーと互換性のある形式を見つける方法の 1 つは、 MFTranscodeGetAudioOutputAvailableTypes 関数を 呼び出す方法です。 目的のエンコーダーはサブタイプによって指定されます。 関数は、そのエンコーダーのメディア型のコレクションを返します。 一覧から種類を選択し、属性をプロファイルにコピーできます。 この方法を使用するコード例については、「 チュートリアル: WMA ファイルのエンコード」を参照してください。

ビデオ属性

ビデオ ストリームの属性を追加するには、 IMFTranscodeProfile::SetVideoAttributes を呼び出します。 これらの属性は、ビデオ ストリームのエンコード方法を指定します。 出力ファイルにビデオ ストリームが含まれていない場合は、これらの属性を省略します。

オーディオ属性と同様に、ビデオ属性は次の 2 つのカテゴリに分類されます。

  • エンコードされたストリームの形式を指定する属性
  • 他のエンコード パラメーターを指定する属性。

「ビデオ メディアの種類」セクションで説明されているように、フォーマット属性は メディアタイプの属性です。 一般的なビデオ形式の属性の一覧を次に示します。

Format 属性 説明
MF_MT_SUBTYPE サブタイプ。 「ビデオ サブタイプ GUID」を参照してください。
MF_MT_FRAME_RATE フレーム レート。
MF_MT_FRAME_SIZE フレーム サイズ。
MF_MT_AVG_BITRATE 平均ビット レート。
MF_MT_PIXEL_ASPECT_RATIO ピクセル縦横比。

 

次のエンコード パラメーターが定義されています。

Encoding パラメーター 説明
MF_TRANSCODE_DONOT_INSERT_ENCODER トランスコード API がビデオ ストリームのエンコーダーを挿入できないようにします。
MF_TRANSCODE_ENCODINGPROFILE デバイス準拠テンプレートを指定します。 (ASF ファイルにのみ適用されます)。
MF_TRANSCODE_QUALITYVSSPEED エンコード品質と速度のトレードオフを指定します。

 

書式属性を設定する必要があります。 エンコード パラメーターは省略可能です。

コンテナー属性

コンテナー属性は、出力ファイルのファイル レベルの特性を定義します。 コンテナー属性を設定するには、 IMFTranscodeProfile::SetContainerAttributes を呼び出します。 次の属性が定義されています。

属性 説明
MF_TRANSCODE_ADJUST_PROFILE トランスコード トポロジに使用するストリーム設定を定義します。 入力ソース設定を使用するか、カスタム ストリーム属性を使用するようにフラグを設定できます。
MF_TRANSCODE_CONTAINERTYPE MP4 や ASF などの出力ファイルのファイル形式を指定します。 この値に基づいて、適切なメディア シンクがトポロジに追加されます。
MF_TRANSCODE_SKIP_METADATA_TRANSFER ソースのメタデータを出力ファイルにコピーするかどうかを指定します。
MF_TRANSCODE_TOPOLOGYMODE コード変換中にハードウェア ベースのコーデックを使用できるかどうかを指定します。
MFT_FIELDOFUSE_UNLOCK_Attribute フィールドオブユース制限があるコーデックのロックを解除します。 詳細については、「 使用制限のフィールド」を参照してください。

 

MF_TRANSCODE_CONTAINERTYPE属性が必要です。 その他のコンテナー属性は省略可能です。

トランスコード トポロジの作成

トランスコード トポロジは、メディア ソース、適切なコーデック、メディア シンクを含む部分トポロジです。 トランスコード トポロジを作成するには、 MFCreateTranscodeTopology 関数を呼び出します。 この関数は、次のパラメーターを入力として受け取ります。

  • メディア ソースの IMFMediaSource インターフェイスへのポインター。
  • 出力ファイルの名前。
  • トランスコード プロファイルの IMFTranscodeProfile インターフェイスへのポインター。

関数は、 IMFTopology インターフェイスへのポインターを返します。

エンコード セッションの実行

トポロジを作成したら、ファイルをエンコードする準備が整います。 この時点でプロファイルを破棄できます。

  1. MFCreateMediaSession を呼び出して、メディア セッションを作成します。
  2. IMFMediaSession::SetTopology を呼び出して、メディア セッションでトポロジを設定します。
  3. IMFMediaSession::Start を呼び出してエンコード セッションを開始します。
  4. MESessionEnded イベントを待機します。
  5. IMFMediaSession::Close を呼び出してメディア セッションを閉じます。
  6. MESessionClosed イベントを待機します。
  7. IMFMediaSource::Shutdown を呼び出します。
  8. IMFMediaSession::Shutdown を呼び出します。

エンコードに費やされた時間のほとんどは、手順 3 から 4 の間で発生します。

トランスコード API

メディア セッションについて