建立和設定 ASF 數據流
每個 ASF 檔案都包含一或多個數據流。 ASF Profile 物件代表 ASF 數據流的集合。 針對 ASF 編碼,您必須建立並設定您想要編碼的數據流。
應用程式可以使用 ASF 設定檔物件執行下列工作:
- 新增或移除數據流。
- 取得數據流的組態設定。
- 設定承載延伸模組。
- 新增、移除或修改 ASF 互斥物件。
本主題包含下列各節。
建立新的數據流
ASF 設定檔對象必須包含至少一個 ASF 資料流的組態設定。 每個數據流都會以 數據流組態 物件表示,此物件會 公開 IMFASFStreamConfig 介面。 數據流組態物件中的資訊會對應至 ASF 檔案標頭中的 Stream Properties 物件和 Extended Stream Properties Objects。 (請參閱 ASF 檔案結構。)
若要將資料流新增至 ASF 設定檔,請執行下列步驟:
- 建立空的數據流組態物件。
- 根據應用程式的需求設定數據流。
- 將數據流新增至配置檔。
若要建立配置文件的數據流,請呼叫 IMFASFProfile::CreateStream 來建立空的數據流組態物件,並在ppIStream 參數中接收指標。 CreateStream 必須知道要建立的數據流類型。 ASF 檔案中使用的最常見數據流類型是音訊和視訊串流。 在媒體基礎中,數據流類型是由公開IMFMediaType介面的媒體類型物件表示。 媒體類型的主要類型會定義數位媒體串流類別,例如音訊或視訊。 子類型會定義主要型別的格式。 CreateStream 所設定的初始媒體類型可以使用蒸汽組態對象來變更。 若要擷取數據流的媒體類型,請呼叫 IMFASFStreamConfig::GetMediaType 或擷取主要類型呼叫 IMFASFStreamConfig::GetStreamType。 您可以呼叫 IMFASFStreamConfig::SetMediaType,將數據流的初始媒體類型取代為新的設定媒體類型。
如果應用程式透過呼叫 MFCreateASFProfileFromPresentationDescriptor,從有效的簡報描述元建立配置檔。 函式會自動設定每個數據流的數據流組態物件,並在配置檔上設定它們。 數據流媒體類型是根據與簡報描述元相關聯的數據流描述元來設定。
指派數據流編號
所有類型的數據流都必須指派數據流編號。 數據流編號不需要循序,但必須介於 1 到 127 的範圍內。 若要指派數據流號碼,請呼叫 IMFASFStreamConfig::SetStreamNumber。 若要取得數據流號碼呼叫,IMFASFStreamConfig::GetStreamNumber。
注意
數據流編號與數據流索引不同,您在使用 IMFASFProfile::GetStream 取得設定檔中的串流時會用到。 數據流索引是由配置檔物件指派給數據流的數位。 串流索引的範圍介於 0 到 1 之間,小於 IMFASFProfile::GetStreamCount 所擷取的數據流數目。 您也可以呼叫 IMFASFProfile::GetStreamByNumber,依數據流號碼從配置檔取得數據流。
設定流失值區值
代表數據流的每個數據流組態對象都必須有相關聯的流失值區參數、比特率和緩衝區視窗值。
透過 MF_ASFSTREAMCONFIG_LEAKYBUCKET1 屬性和 MF_ASFSTREAMCONFIG_LEAKYBUCKET2 屬性,應用程式可以使用這些值。 對於檔案編碼,實際值取決於編碼的類型,並由編碼器決定。 如果您已經有已設定的編碼器,而且已在編碼器上設定輸出類型,應用程式必須查詢編碼器是否有流失值區參數,並在這些屬性中設定值。
如果您使用管線層元件並設定 ASF 媒體接收的數據流,很可能您沒有設定的編碼器。 在此情況下,您必須查詢編碼器媒體后類型交涉,並在 ASF 媒體接收之屬性存放區的 MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET 屬性中設定更新的值。 編碼屬性存放區是透過與配置文件相關聯之 ContentInfo 物件的 擷取。 更新的值會自動反映在數據流的流失值區屬性值中。 如需有關流失貯體以及如何從編碼器取得流失貯體值的一般資訊,請參閱 流失貯體緩衝區模型。
Payload Extensions
數據流的媒體數據會新增至 ASF 資料物件做為 ASF 多任務器媒體範例。 這些媒體範例可以包含承載延伸模組數據:SMPTE 時間程式代碼數據、非平方像素外觀比例、範例持續時間,以及範例包含它時,影片主要畫面格。 如需支援的承載擴充功能類型清單,請參閱 ASF 承載延伸模組 GUID。
數據流必須設定為接受承載擴充功能,以便在取樣產生期間,多任務器可以將補充數據新增至該數據流的每個樣本。
若要取得數據流上設定的承載延伸模組總數,請呼叫 IMFASFStreamConfig::GetPayloadExtensionCount,然後呼叫 IMFASFStreamConfig::GetPayloadExtension 來列舉清單。 若要新增數據流的承載延伸模組,請呼叫 IMFASFStreamConfig::AddPayloadExtension。 這會將補充數據新增至針對數據流產生的個別媒體範例。
若要移除與數據流相關聯的現有承載延伸模組,請呼叫 IMFASFStreamConfig::RemoveAllPayloadExtensions。
將數據流新增至配置檔
設定數據流之後,呼叫 IMFASFProfile::SetStream 將數據流新增至配置檔。
若要移除配置檔中的現有數據流,請呼叫 IMFASFProfile::RemoveStream。
設定的配置文件必須在 ContentInfo 物件上設定,方法是呼叫 IMFASFContentInfo::SetProfile。 如果變更現有的數據流,您必須將它再次新增至配置檔,並在 ContentInfo 物件上設定設定檔。
相關主題