トランスコード API の使用
このトピックでは、トランスコード API を使用してメディア ファイルをエンコードする方法について説明します。
概要
トランスコード API を使用する前に、アプリケーションには次の情報が必要です。
- 再エンコードされる既存のメディア ファイルへのパスまたは URL。
- 出力ファイルの名前。
- MP4 や Advanced Streaming Format (ASF) などの出力ファイルのコンテナーの種類。
- エンコーディング形式。 この情報には、エンコードされたオーディオストリームとビデオストリームを記述するメディアの種類が含まれます。
トランスコード API を使用するために、アプリケーションは次の手順を実行します。
- ソース ファイルを読み取るメディア ソースを作成します。
- トランスコード プロファイルを作成します。 オーディオ ストリーム、ビデオ ストリーム、およびファイル コンテナーを記述する属性を追加します。
- トランスコード プロファイルを使用してエンコード トポロジを作成します。 (トポロジの詳細については、「トポロジ について」を参照してください)。
- メディア セッションでトポロジを設定します。
- メディア セッションを開始し、 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 インターフェイスへのポインターを返します。
エンコード セッションの実行
トポロジを作成したら、ファイルをエンコードする準備が整います。 この時点でプロファイルを破棄できます。
- MFCreateMediaSession を呼び出して、メディア セッションを作成します。
- IMFMediaSession::SetTopology を呼び出して、メディア セッションでトポロジを設定します。
- IMFMediaSession::Start を呼び出してエンコード セッションを開始します。
- MESessionEnded イベントを待機します。
- IMFMediaSession::Close を呼び出してメディア セッションを閉じます。
- MESessionClosed イベントを待機します。
- IMFMediaSource::Shutdown を呼び出します。
- IMFMediaSession::Shutdown を呼び出します。
エンコードに費やされた時間のほとんどは、手順 3 から 4 の間で発生します。
関連トピック