ASF 스트림에 상호 제외 사용

ASF 콘텐츠는 상호 배타적인 여러 스트림을 포함할 수 있습니다. 이러한 스트림은 동시에 읽을 수 없지만 한 번에 하나만 읽습니다. 예를 들어 파일에는 다른 비트 속도로 인코딩된 동일한 콘텐츠를 포함하는 스트림 집합이 포함될 수 있습니다. 사용되는 스트림은 콘텐츠를 스트리밍하는 애플리케이션에서 사용할 수 있는 대역폭에 따라 결정됩니다. 헤더 개체의 일부인 ASF 상호 제외 개체는 상호 배타적인 스트림 그룹에 대한 정보를 저장합니다.

Media Foundation에서 IMFASFMutualExclusion 인터페이스를 노출하는 상호 제외 개체는 모든 ASF 상호 제외 개체에 대해 존재합니다. 프로필 개체는 모든 상호 제외 개체에 대한 참조를 보유합니다.

상호 제외 개체는 상호 배타적인 스트림 그룹에 대한 정보를 레코드로 저장합니다. 상호 제외 개체에는 복잡한 시나리오를 만드는 데 사용할 수 있는 여러 레코드가 있을 수 있습니다. 각 레코드에는 비트 전송률과 같은 상호 제외 유형에 따라 상호 제외 개체에 의해 유지 관리되는 다른 레코드의 스트림과 공존할 수 없는 하나 이상의 스트림이 포함되어 있습니다.

복잡한 상호 제외의 일반적인 예는 각 3개 언어의 다양한 비트 속도로 동일한 콘텐츠의 오디오 스트림 3개를 포함하는 파일입니다. 9개의 스트림 중 하나만 한 번에 재생해야 하지만 상호 배타적인 언어 및 비트 전송률이라는 두 가지 유형이 있습니다.

이 예제에서는 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

이 시나리오는 다음 4개의 상호 제외 개체를 사용하여 구현할 수 있습니다.

  • 첫 번째 상호 제외 개체에는 비트 전송률로 상호 배타적인 스트림 1, 2 및 3이 포함됩니다. 각 스트림에는 자체 레코드가 있습니다.
  • 두 번째 상호 제외 개체에는 비트 전송률로 상호 배타적인 스트림 4, 5 및 6이 포함됩니다. 각 스트림에는 자체 레코드가 있습니다.
  • 세 번째 상호 제외 개체에는 비트 전송률로 상호 배타적인 7, 8 및 9가 포함됩니다. 각 스트림에는 자체 레코드가 있습니다.
  • 네 번째 상호 제외 개체에는 스트림 1, 2 및 3을 포함하는 첫 번째 레코드인 3개의 레코드가 포함됩니다. 스트림 4, 5 및 6을 포함하는 두 번째 스트림 7, 8 및 9를 포함하는 세 번째 및 세 번째 이러한 레코드는 언어별로 상호 배타적입니다.

이러한 방식으로 만든 파일을 재생할 때 스트리밍 애플리케이션은 프레젠테이션 중간에 변경될 가능성이 적기 때문에 언어를 먼저 선택한 다음 비트 속도를 선택합니다.

상호 제외 개체 만들기 및 구성

다음 목록에는 상호 제외 개체를 구성하는 프로세스가 요약되어 있습니다.

  1. 상호 제외 개체를 만듭니다.
  2. 상호 제외 유형을 설정합니다.
  3. 레코드 및 연결된 스트림을 추가하여 상호 제외 개체를 구성합니다.
  4. 프로필에 상호 제외 개체를 추가합니다.

상호 제외 개체를 만들고 구성하려면

  1. IMFASFProfile::CreateMutualExclusion을 호출하여 빈 상호 제외 개체를 만듭니다.

  2. IMFASFMutualExclusion::SetType을 호출하여 상호 배타적 스트림의 조건을 설정합니다.

    스트림은 언어, 비트 전송률, 프레젠테이션 및 사용자 지정 기준에 따라 상호 배타적일 수 있습니다. 형식은 GUID로 표시됩니다. 이러한 상수 목록은 ASF 상호 제외 형식 GUID를 참조하세요.

  3. IMFASFMutualExclusion::AddRecord를 호출하여 상호 제외 개체에 레코드를 추가합니다.

    이 메서드는 빈 레코드를 추가하고 0부터 시작하는 레코드 인덱스를 할당합니다.

  4. IMFASFMutualExclusion::AddStreamForRecord를 호출하여 레코드 인덱스에 지정된 레코드에 스트림 번호를 추가합니다.

    각 레코드에는 하나 이상의 스트림이 포함됩니다. 레코드의 모든 스트림은 다른 모든 레코드의 모든 스트림에서 상호 배타적입니다. 레코드의 스트림 수를 가져오려면 레코드 인덱스를 지정하여 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 프로필