共用方式為


使用 Transcode API

本主題描述如何使用轉碼 API 來編碼媒體檔案。

概觀

使用轉碼 API 之前,應用程式必須具有下列資訊片段:

  • 將重新編碼之現有媒體檔案的路徑或 URL。
  • 輸出檔的名稱。
  • 輸出檔案的容器類型,例如 MP4 或進階串流格式 (ASF) 。
  • 編碼格式。 此資訊包括描述編碼音訊和視訊串流的媒體類型。

若要使用轉碼 API,應用程式會執行下列步驟。

  1. 建立媒體來源以讀取來源檔案。
  2. 建立轉碼設定檔。 新增描述音訊資料流程、視訊資料流程和檔案容器的屬性。
  3. 使用轉碼設定檔來建立編碼拓撲。 (如需拓撲的詳細資訊,請參閱 關於拓撲。)
  4. 媒體會話上設定拓撲。
  5. 啟動媒體會話並等候 MESessionEnded 事件。

本主題的其餘部分會更詳細地描述這些步驟。

建立媒體來源

媒體來源是讀取和剖析來源檔案的物件。 若要建立媒體來源,請使用 來源解析程式。 您可以在 使用來源解析程式主題中找到範例程式碼。

建立轉碼設定檔

轉碼設定檔描述用來編碼輸出檔案的格式和設定。 轉碼設定檔包含三組屬性:

  • 音訊屬性:描述目標音訊格式和音訊編碼器設定。
  • 影片屬性:描述目標視訊格式和視訊編碼器設定。
  • 容器屬性:定義檔案容器的類型,以及一些全域編碼設定。

若要建立轉碼設定檔,請呼叫 MFCreateTranscodeProfile 函 式。 此函式會傳回 IMFTranscodeProfile 介面的指標。 初始設定檔物件是空的;它不包含任何屬性。 下一個步驟是新增定義設定檔的屬性。

音訊屬性

若要新增音訊資料流程的屬性,請呼叫 IMFTranscodeProfile::SetAudioAttributes。 這些屬性會指定音訊資料流程的編碼方式。 如果輸出檔案不包含音訊資料流程,請省略這些屬性。

音訊屬性分為兩個類別:

  • 指定編碼資料流程格式的屬性
  • 指定其他編碼參數的屬性。

格式屬性只是媒體類型屬性,如 音訊媒體類型一節中所述。 確切的格式屬性集取決於編碼器。 (請參閱 Media Foundation 中支援的媒體格式。) 以下是一般音訊格式屬性的清單:

Format 屬性 Description
MF_MT_SUBTYPE 子型別。 請參閱 音訊子類型 GUID
MF_MT_AUDIO_NUM_CHANNELS 音訊通道的數目。
MF_MT_AUDIO_SAMPLES_PER_SECOND 每秒的音訊樣本數目。
MF_MT_AUDIO_BLOCK_ALIGNMENT 區塊對齊方式。
MF_MT_AUDIO_AVG_BYTES_PER_SECOND 每秒的平均位元組數 (編碼的位元速率) 。

 

定義下列編碼參數。

編碼參數 Description
MF_TRANSCODE_DONOT_INSERT_ENCODER 防止轉碼 API 插入音訊資料流程的編碼器。
MF_TRANSCODE_ENCODINGPROFILE 指定裝置一致性範本。 (僅適用于 ASF files.)
MF_TRANSCODE_QUALITYVSSPEED 指定編碼品質與速度之間的取捨。

 

您必須設定格式屬性。 編碼參數是選擇性的。

尋找與編碼器相容的格式之一,就是呼叫 MFTranscodeGetAudioOutputAvailableTypes 函 式。 所需的編碼器是由子類型指定。 函式會傳回該編碼器的媒體類型集合。 您可以從清單中選取類型,並將屬性複製到設定檔。 如需使用此方法的範例程式碼,請參閱 教學課程:編碼 WMA 檔案

影片屬性

若要新增視訊串流的屬性,請呼叫 IMFTranscodeProfile::SetVideoAttributes。 這些屬性會指定影片串流編碼的方式。 如果輸出檔案不包含視訊串流,請省略這些屬性。

如同音訊屬性,視訊屬性分為兩個類別:

  • 指定編碼資料流程格式的屬性
  • 指定其他編碼參數的屬性。

格式屬性是媒體類型屬性,如 影片媒體類型一節中所述。 以下是一般視訊格式屬性的清單:

Format 屬性 Description
MF_MT_SUBTYPE 子型別。 請參閱 影片子類型 GUID
MF_MT_FRAME_RATE 畫面播放速率。
MF_MT_FRAME_SIZE 框架大小。
MF_MT_AVG_BITRATE 平均位元速率。
MF_MT_PIXEL_ASPECT_RATIO 圖元外觀比例。

 

定義下列編碼參數。

編碼參數 Description
MF_TRANSCODE_DONOT_INSERT_ENCODER 防止轉碼 API 插入視訊串流的編碼器。
MF_TRANSCODE_ENCODINGPROFILE 指定裝置一致性範本。 (僅適用于 ASF files.)
MF_TRANSCODE_QUALITYVSSPEED 指定編碼品質與速度之間的取捨。

 

您必須設定格式屬性。 編碼參數是選擇性的。

容器屬性

容器屬性會定義輸出檔案的檔案層級特性。 若要設定容器屬性,請呼叫 IMFTranscodeProfile::SetContainerAttributes。 已定義下列屬性。

屬性 Description
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 函式。 此函式會採用下列參數作為輸入:

函式會傳回 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

關於媒體會話