ASF ストリームに対する相互除外の使用

ASF コンテンツには、相互に排他的な複数のストリームを含めることができます。 これらのストリームは同時に読み取ることはできませんが、一度に読み取られるストリームは 1 つだけです。 たとえば、ファイルには、異なるビット レートでエンコードされた同じコンテンツを含むストリームのセットを含めることができます。 使用されるストリームは、コンテンツをストリーミングするアプリケーションで使用できる帯域幅によって決まります。 ヘッダー オブジェクトの一部である ASF 相互除外オブジェクトは、相互に排他的なストリームのグループに関する情報を格納します。

Media Foundation では、IMFASFMutualExclusion インターフェイスを公開する相互除外オブジェクトは、ASF 相互排他オブジェクトごとに存在します。 プロファイル オブジェクトは、すべての相互除外オブジェクトへの参照を保持します。

相互排他オブジェクトは、相互排他ストリームのグループに関する情報をレコードとして格納します。 相互除外オブジェクトには、複雑なシナリオを作成するために使用できる複数のレコードを含めることができます。 各レコードには、ビット レートなどの相互除外の種類に応じて、相互除外オブジェクトによって維持される、別のレコード内のストリームと共存できない 1 つ以上のストリームが含まれています。

複雑な相互除外の一般的な例は、3 つの言語ごとにさまざまなビット レートで同じコンテンツの 3 つのオーディオ ストリームを含むファイルです。 一度に再生する必要があるストリームは 9 つのうち 1 つだけですが、言語とビット レートの 2 種類があります。

この例では、9 つのストリームに次のストリーム番号が割り当てられます。

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、ビット レート 3

このシナリオは、次の 4 つの相互除外オブジェクトを使用して実装できます。

  • 最初の相互除外オブジェクトには、ストリーム 1、2、および 3 が含まれており、ビット レートによって相互に排他的です。 各ストリームには、独自のレコードがあります。
  • 2 番目の相互除外オブジェクトには、ストリーム 4、5、および 6 が含まれており、ビット レートによって相互に排他的です。 各ストリームには、独自のレコードがあります。
  • 3 番目の相互除外オブジェクトには、ビット レートによって相互に排他的な 7、8、および 9 が含まれます。 各ストリームには、独自のレコードがあります。
  • 4 番目の相互除外オブジェクトには、ストリーム 1、2、3 を含む 3 つのレコードが含まれます。ストリーム 4、5、6 を含む 2 つ目。ストリーム 7、8、および 9 を含む 3 つ目。 これらのレコードは言語によって相互に排他的です。

この方法で作成されたファイルを再生する場合、ストリーミング アプリケーションは、プレゼンテーションの途中で変更される可能性が低いため、最初に言語を選択し、ビット レートを選択します。

相互排他オブジェクトの作成と構成

次の一覧は、相互除外オブジェクトを構成するプロセスをまとめたものです。

  1. 相互除外オブジェクトを作成します。
  2. 相互除外の種類を設定します。
  3. レコードと関連するストリームを追加して、相互除外オブジェクトを構成します。
  4. 相互除外オブジェクトをプロファイルに追加します。

相互除外オブジェクトを作成して構成するには

  1. 空の相互除外オブジェクトを作成するには、 IMFASFProfile::CreateMutualExclusion を呼び出します。

  2. IMFASFMutualExclusion::SetType を呼び出して、相互に排他的なストリームの条件を設定します。

    ストリームは、言語、ビット レート、プレゼンテーション、およびカスタム条件によって相互に排他的にすることができます。 型は GUID として表されます。 これらの定数の一覧については、「 ASF 相互除外タイプ GUID」を参照してください。

  3. IMFASFMutualExclusion::AddRecord を呼び出して、相互除外オブジェクトにレコードを追加します。

    このメソッドは空のレコードを追加し、0 から始まるレコード インデックスを割り当てます。

  4. IMFASFMutualExclusion::AddStreamForRecord を呼び出して、レコード インデックスで指定されたレコードにストリーム番号を追加します。

    各レコードには、1 つ以上のストリームが含まれます。 レコード内のすべてのストリームは、他のすべてのレコード内のすべてのストリームと相互に排他的です。 レコード内のストリームの数を取得するには、レコード インデックスを指定して IMFASFMutualExclusion::GetStreamsForRecord を呼び出します。

    レコードからストリームを削除するには、 IMFASFMutualExclusion::RemoveStreamFromRecord を呼び出し、レコード インデックスとストリーム番号を指定します。

  5. IMFASFProfile::AddMutualExclusion を呼び出して、構成された相互除外オブジェクトをプロファイルに追加します。

プロファイル内の相互除外オブジェクトの列挙

IMFASFProfile::AddMutualExclusion が成功すると、指定したオブジェクトにインデックスが割り当てられ、0 から始まります。

プロファイルに関連付けられている相互除外オブジェクトを列挙するには、 IMFASFProfile::GetMutualExclusionCount を 呼び出し、 IMFASFProfile::GetMutualExclusion を呼び出してリストをループします。 相互除外インデックスはシーケンシャルであり、 GetMutualExclusionCount によって取得されたストリームの数より 0 から 1 未満の範囲です。

相互除外オブジェクトは、 IMFASFProfile::RemoveMutualExclusion を呼び出すことによってプロファイルから削除されます。 プロファイルは、相互除外インデックスを再割り当てして、0 から始まる順番になるようにします。 これにより、以前に格納されたインデックスが上書きされます。これは、このメソッドを呼び出した後で無効になります。 これにより、関連付けられている相互除外ストリーム レコードが解放されます。

相互排他オブジェクト内のレコードの削除

相互排他オブジェクトからレコードを削除するには、 IMFASFMutualExclusion::RemoveRecord を呼び出します。 このメソッドが成功した場合、相互除外オブジェクトは残りのレコードのインデックスを作成し、0 から始まる連続レコードになるようにします。 アプリケーションでは、各レコードの正しいインデックスを確保するために、レコードを列挙する必要があります。 そのためには、 IMFASFMutualExclusion::GetRecordCount を呼び出し、 IMFASFMutualExclusion::GetStreamsForRecord を呼び出してレコードをループします。

インデックスが最も高いレコードを削除しても、他のインデックスには影響しません。

相互排他オブジェクトの変更

プロファイル内の相互除外オブジェクトの構成を変更するには、アプリケーションで既存の相互除外オブジェクトを、新しい設定を含む別のオブジェクトに置き換える必要があります。

プロファイル内の相互除外オブジェクトの構成を変更するには

  1. プロファイル内の相互除外オブジェクトを列挙して、変更する必要があるオブジェクトを取得します。

  2. IMFASFMutualExclusion::Clone を呼び出して、相互除外オブジェクトを複製します。

  3. 必要に応じて、複製されたオブジェクトを構成します。

  4. IMFASFProfile::RemoveMutualExclusion を呼び出して、プロファイルから古い相互除外オブジェクトを削除します。

  5. IMFASFProfile::AddMutualExclusion を呼び出して、更新された相互除外オブジェクトをプロファイルに追加します。

ASF プロファイル