Share via


使用 ASF 資料流程的互斥

ASF 內容可以包含多個互斥的資料流程。 這些資料流程無法同時讀取,但一次只能讀取其中一個資料流程。 例如,檔案可以包含一組資料流程,其中包含以不同位元速率編碼的相同內容。 所使用的資料流程取決於串流內容之應用程式可用的頻寬。 ASF 相互排除物件是 Header 物件的一部分,會儲存互斥資料流程群組的相關資訊。

在媒體 基礎中, 公開 IMFASFMutualExclusion 介面的每個 ASF 相互排除物件都存在。 設定檔物件會保存所有互斥物件的參考。

相互排除物件會將互斥資料流程群組的相關資訊儲存為記錄。 相互排除物件可以有多個記錄,可用來建立複雜的案例。 每個記錄都包含一或多個資料流程,這些資料流程無法與另一筆記錄中的資料流程共存,由相互排除物件維護,視相互排除的類型而定,例如位元速率。

複雜互斥的常見範例是一個檔案,其中包含三種不同語言中相同內容的三個音訊資料流程。 一次只能播放九個數據流的其中一個,但有兩種類型互斥:語言和位元速率。

在此範例中,九個數據流會指派下列資料流程編號:

1 - 語言 1, 位元速率 1 2 - 語言 1, 位元速率 2 3 - 語言 1, 位元速率 3 4 - 語言 2, 位元速率 1 5 - 語言 2, 位元速率 2 6 - 語言 2, 位元速率 3 7 - 語言 3, 位元速率 1 8 - 語言 3, 位元速率 2 9 - 語言 3, 位元速率 3

您可以使用下列四個互斥物件來實作此案例:

  • 第一個互斥物件包含資料流程 1、2 和 3,以位速率互斥。 每個資料流程都有自己的記錄。
  • 第二個互斥物件包含資料流程 4、5 和 6,以位速率互斥。 每個資料流程都有自己的記錄。
  • 第三個互斥物件包括 7、8 和 9,以位速率互斥。 每個資料流程都有自己的記錄。
  • 第四個互斥物件包含三筆記錄,第一筆包含資料流程 1、2 和 3;第二個,包括資料流程 4、5 和 6;和第三個,包括資料流程 7、8 和 9。 這些記錄會依語言互斥。

以這種方式播放建立的檔案時,串流應用程式會先選取語言,因為它不太可能在簡報中間變更,然後選取位元速率。

相互排除物件建立和設定

下列清單摘要說明設定相互排除物件的程式:

  1. 建立相互排除物件。
  2. 設定互斥的類型。
  3. 藉由新增記錄和相關聯的資料流程來設定互斥物件。
  4. 將相互排除物件新增至設定檔。

若要建立和設定互斥物件

  1. 呼叫 IMFASFProfile::CreateMutualExclusion 來建立空的互斥物件。

  2. 呼叫 IMFASFMutualExclusion::SetType 以設定互斥資料流程的準則。

    資料流程可以透過語言、位元速率、呈現和自訂準則互斥。 此類型會以 GUID 表示。 如需這些常數的清單,請參閱 ASF 相互排除類型 GUID

  3. 呼叫 IMFASFMutualExclusion::AddRecord ,將記錄新增至互斥物件。

    這個方法會新增空的記錄,並將其指派為從零開始的記錄索引。

  4. 呼叫 IMFASFMutualExclusion::AddStreamForRecord ,將資料流程號碼新增至記錄索引所指定的記錄。

    每個記錄都包含一或多個資料流程。 記錄中的每個資料流程互斥于所有其他記錄中的所有資料流程。 若要取得記錄中的資料流程數目,請指定記錄索引來呼叫 IMFASFMutualExclusion::GetStreamsForRecord

    若要從記錄中移除資料流程,請呼叫 IMFASFMutualExclusion::RemoveStreamFromRecord 並指定記錄索引和資料流程編號。

  5. 呼叫 IMFASFProfile::AddMutualExclusion ,將設定的互斥物件新增至設定檔。

列舉設定檔中的互斥物件

如果 IMFASFProfile::AddMutualExclusion 成功,它會將索引指派給指定的物件,從零開始。

若要列舉與設定檔相關聯的互斥物件,請呼叫 IMFASFProfile::GetMutualExclusionCount 並呼叫 IMFASFProfile::GetMutualExclusion 來迴圈查看清單。 相互排除索引是循序的,範圍介於 0 到 1 之間,小於 GetMutualExclusionCount所擷取的資料流程數目。

藉由呼叫 IMFASFProfile::RemoveMutualExclusion,從設定檔中移除互斥物件。 設定檔會重新指派相互排除索引,使其循序從零開始。 這會覆寫先前儲存的索引,在呼叫此方法之後不再有效。 這會釋放相關聯的相互排除資料流程記錄。

移除相互排除物件中的記錄

若要從相互排除物件中移除記錄,請呼叫 IMFASFMutualExclusion::RemoveRecord。 如果這個方法成功,則相互排除物件會編制其餘記錄的索引,讓它們循序從零開始。 應用程式應該列舉記錄,以確保每個記錄的正確索引。 若要這樣做,請呼叫 IMFASFMutualExclusion::GetRecordCount ,並藉由呼叫 IMFASFMutualExclusion::GetStreamsForRecord來迴圈查看記錄。

移除具有最高索引的記錄不會影響其他索引。

修改相互排除物件

若要變更設定檔中相互排除物件的組態,應用程式必須將現有的互斥物件取代為包含新設定的另一個物件。

變更設定檔中相互排除物件的組態

  1. 列舉設定檔中的互斥物件,以取得需要變更的物件。

  2. 呼叫 IMFASFMutualExclusion::Clone 以複製相互排除物件。

  3. 視需要設定複製的物件。

  4. 呼叫 IMFASFProfile::RemoveMutualExclusion ,從設定檔中移除舊的互斥物件。

  5. 呼叫 IMFASFProfile::AddMutualExclusion ,將更新的相互排除物件新增至設定檔。

ASF 設定檔