使用 Transcode API
本主題描述如何使用轉碼 API 來編碼媒體檔案。
概述
使用轉碼 API 之前,應用程式必須具有下列資訊:
- 將重新編碼之現有媒體檔案的路徑或URL。
- 輸出檔的名稱。
- 輸出檔案的容器類型,例如 MP4 或進階串流格式 (ASF)。
- 編碼格式。 這項資訊包括描述編碼音訊和視訊串流的媒體類型。
若要使用轉碼 API,應用程式會執行下列步驟。
- 建立媒體來源以讀取來源檔案。
- 建立轉碼設定檔。 新增描述音訊串流、視訊串流和檔案容器的屬性。
- 使用轉碼設定檔來建立編碼拓撲。 (如需拓撲的詳細資訊,請參閱 關於拓撲。
- 在 媒體會話中設定的拓撲。
- 啟動媒體會話,並等候 MESessionEnded 事件。
本主題的其餘部分會更詳細地說明這些步驟。
建立媒體來源
媒體來源是讀取和剖析來源檔案的物件。 若要建立媒體來源,請使用 Source Resolver。 您可以在 使用來源解析程式主題中找到範例程式碼。
建立轉碼配置檔
轉碼設定檔 描述用來編碼輸出檔案的格式和設定。 轉碼設定檔包含三組屬性:
- 音訊屬性:描述目標音訊格式和音訊編碼器設定。
- 影片屬性:描述目標視訊格式和視訊編碼器設定。
- 容器屬性:定義檔案容器的類型,以及一些全域編碼設定。
若要建立轉碼配置檔,請呼叫 MFCreateTranscodeProfile 函式。 此函式會傳回指向 IMFTranscodeProfile介面的指標。 初始設定檔對像是空的;不包含任何屬性。 下一個步驟是新增定義設定檔的屬性。
音訊屬性
若要新增音訊數據流的屬性,請呼叫 IMFTranscodeProfile::SetAudioAttributes。 這些屬性會指定音訊數據流的編碼方式。 如果輸出檔案不包含音訊數據流,請省略這些屬性。
音訊屬性分為兩個類別:
- 指定編碼數據流格式的屬性
- 指定其他編碼參數的屬性。
格式屬性只是媒體類型屬性,如音訊媒體類型 一節所述。 格式屬性的確切集合取決於編碼器。 (請參閱媒體基礎 支援的媒體格式。以下是一般音訊格式屬性的清單:
Format 屬性 | 描述 |
---|---|
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 | 每秒的平均位元組數(編碼的比特率)。 |
定義下列編碼參數。
編碼參數 | 描述 |
---|---|
MF_TRANSCODE_DONOT_INSERT_ENCODER | 防止轉碼 API 為音訊流插入編碼器。 |
MF_TRANSCODE_ENCODINGPROFILE | 指定裝置一致性範本。 (僅適用於 ASF 檔案。) |
MF_TRANSCODE_QUALITYVSSPEED | 指定編碼品質與速度之間的取捨。 |
您必須設定格式屬性。 編碼參數是選擇性的。
尋找與編碼器相容的格式的其中一種方式,就是呼叫 MFTranscodeGetAudioOutputAvailableTypes 函式。 所需的編碼器是由子類型指定。 函式會傳回該編碼器的媒體類型集合。 您可以從清單中選取類型,並將屬性複製到設定檔。 如需使用此方法的範例程式代碼,請參閱 教學課程:編碼 WMA 檔案。
影片屬性
若要新增視訊串流的屬性,請呼叫 IMFTranscodeProfile::SetVideoAttributes。 這些屬性會指定影片串流編碼的方式。 如果輸出檔案不包含視訊串流,請省略這些屬性。
和音訊屬性一樣,視訊屬性分為兩個類別:
- 指定編碼數據流格式的屬性
- 指定其他編碼參數的屬性。
格式屬性是媒體類型屬性,如 視訊媒體類型一節所述。 以下是一般影片格式屬性的清單:
格式屬性 | 描述 |
---|---|
MF_MT_SUBTYPE | 子類型。 請參閱 視訊子類型 GUID (全域唯一識別碼)。 |
MF_MT_FRAME_RATE | 幀速率。 |
MF_MT_FRAME_SIZE | 框架大小。 |
MF_MT_AVG_BITRATE | 平均比特率。 |
MF_MT_PIXEL_ASPECT_RATIO | 像素縱橫比。 |
定義下列編碼參數。
編碼參數 | 描述 |
---|---|
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 之間進行編碼。
相關主題