使用 Transcode API
本主題描述如何使用轉碼 API 來編碼媒體檔案。
概觀
使用轉碼 API 之前,應用程式必須具有下列資訊片段:
- 將重新編碼之現有媒體檔案的路徑或 URL。
- 輸出檔的名稱。
- 輸出檔案的容器類型,例如 MP4 或進階串流格式 (ASF) 。
- 編碼格式。 此資訊包括描述編碼音訊和視訊串流的媒體類型。
若要使用轉碼 API,應用程式會執行下列步驟。
- 建立媒體來源以讀取來源檔案。
- 建立轉碼設定檔。 新增描述音訊資料流程、視訊資料流程和檔案容器的屬性。
- 使用轉碼設定檔來建立編碼拓撲。 (如需拓撲的詳細資訊,請參閱 關於拓撲。)
- 在 媒體會話上設定拓撲。
- 啟動媒體會話並等候 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 函式。 此函式會採用下列參數作為輸入:
- 媒體來源之 IMFMediaSource 介面的指標。
- 輸出檔的名稱。
- 轉碼設定檔之 IMFTranscodeProfile 介面的指標。
函式會傳回 IMFTopology 介面的指標。
執行編碼會話
建立拓撲之後,您就可以開始編碼檔案。 此時您可以捨棄設定檔。
- 呼叫 MFCreateMediaSession 以建立媒體會話。
- 呼叫 IMFMediaSession::SetTopology 以在媒體會話上設定拓撲。
- 呼叫 IMFMediaSession::Start 以 啟動編碼會話。
- 等候 MESessionEnded 事件。
- 呼叫 IMFMediaSession::Close 以關閉媒體會話。
- 等候 MESessionClosed 事件。
- 呼叫 IMFMediaSource::Shutdown。
- 呼叫 IMFMediaSession::Shutdown。
大部分花費在編碼時間的步驟 3 到 4 之間。
相關主題