Usando exclusão mútua para fluxos ASF
O conteúdo do ASF pode conter vários fluxos mutuamente exclusivos. Esses fluxos não podem ser lidos simultaneamente, mas apenas um deles é lido por vez. Por exemplo, o arquivo pode conter um conjunto de fluxos que inclui o mesmo conteúdo codificado a uma taxa de bits diferente. O fluxo usado é determinado pela largura de banda disponível para o aplicativo que transmite o conteúdo. O Objeto de Exclusão Mútua do ASF, que faz parte do Objeto Header, armazena informações sobre o grupo de fluxos mutuamente exclusivos.
No Media Foundation, o objeto de exclusão mútua que expõe a interface IMFASFMutualExclusion existe para cada Objeto de Exclusão Mútua do ASF. O objeto de perfil contém referência a todos os objetos de exclusão mútua.
O objeto de exclusão mútua armazena informações sobre o grupo de fluxos mutuamente exclusivos como registros. Um objeto de exclusão mútua pode ter vários registros que podem ser usados para criar cenários complexos. Cada registro contém um ou mais fluxos que não podem coexistir com fluxos em outro registro, mantidos pelo objeto de exclusão mútua, dependendo do tipo de exclusão mútua, como taxa de bits.
Um exemplo comum de exclusão mútua complexa é um arquivo que contém três fluxos de áudio do mesmo conteúdo em várias taxas de bits em cada um dos três idiomas. Apenas um dos nove fluxos deve ser reproduzido por vez, mas há dois tipos pelos quais eles são mutuamente exclusivos: linguagem e taxa de bits.
Para este exemplo, os nove fluxos recebem os seguintes números de fluxo:
- 1 – Idioma 1, taxa de bits 1 2 – Idioma 1, taxa de bits 2 3 – Idioma 1, taxa de bits 3 4 – Idioma 2, taxa de bits 1 5 – Idioma 2, taxa de bits 2 6 – Idioma 2, taxa de bits 3 7 – Idioma 3, taxa de bits 1 8 – Idioma 3, taxa de bits 2 9 – Idioma 3, taxa de bits 3
Esse cenário pode ser implementado usando os quatro seguintes objetos de exclusão mútua:
- O primeiro objeto de exclusão mútua inclui fluxos 1, 2 e 3, mutuamente exclusivos por taxa de bits. Cada fluxo tem seu próprio registro.
- O segundo objeto de exclusão mútua inclui fluxos 4, 5 e 6, mutuamente exclusivos por taxa de bits. Cada fluxo tem seu próprio registro.
- O terceiro objeto de exclusão mútua inclui 7, 8 e 9, mutuamente exclusivo por taxa de bits. Cada fluxo tem seu próprio registro.
- O quarto objeto de exclusão mútua contém três registros, o primeiro incluindo fluxos 1, 2 e 3; o segundo, incluindo os fluxos 4, 5 e 6; e o terceiro, incluindo os fluxos 7, 8 e 9. Esses registros são mutuamente exclusivos por linguagem.
Ao reproduzir um arquivo criado dessa forma, o aplicativo de streaming seleciona o idioma primeiro porque é menos provável que ele mude no meio da apresentação e, em seguida, seleciona uma taxa de bits.
Criação e configuração de objeto de exclusão mútua
A lista a seguir resume o processo de configuração de um objeto de exclusão mútua:
- Crie um objeto de exclusão mútua.
- Defina o tipo de exclusão mútua.
- Configure o objeto de exclusão mútua adicionando registros e os fluxos associados.
- Adicione o objeto de exclusão mútua ao perfil.
Para criar e configurar um objeto de exclusão mútua
Chame IMFASFProfile::CreateMutualExclusion para criar um objeto de exclusão mútua vazio.
Chame IMFASFMutualExclusion::SetType para definir o critério do fluxo mutuamente exclusivo.
Os fluxos podem ser mutuamente exclusivos por idioma, taxa de bits, apresentação e critérios personalizados. O tipo é representado como um GUID. Para obter uma lista dessas constantes, consulte GUIDs de tipo de exclusão mútua do ASF.
Chame IMFASFMutualExclusion::AddRecord para adicionar um registro ao objeto de exclusão mútua.
Esse método adiciona um registro vazio e atribui a ele um índice de registro começando com zero.
Chame IMFASFMutualExclusion::AddStreamForRecord para adicionar o número do fluxo ao registro especificado pelo índice de registro.
Cada registro inclui um ou mais fluxos. Cada fluxo em um registro é mutuamente exclusivo de todos os fluxos em todos os outros registros. Para obter o número de fluxos em um registro, chame IMFASFMutualExclusion::GetStreamsForRecord especificando o índice de registro.
Para remover um fluxo do registro, chame IMFASFMutualExclusion::RemoveStreamFromRecord e especifique o índice de registro e o número do fluxo.
Chame IMFASFProfile::AddMutualExclusion para adicionar o objeto de exclusão mútua configurado ao perfil.
Enumerando objetos de exclusão mútua em um perfil
Se IMFASFProfile::AddMutualExclusion for bem-sucedido, ele atribuirá um índice ao objeto especificado, começando em zero.
Para enumerar os objetos de exclusão mútua associados a um perfil, chame IMFASFProfile::GetMutualExclusionCount e faça loop pela lista chamando IMFASFProfile::GetMutualExclusion. Os índices de exclusão mútua são sequenciais e variam entre 0 e um a menos do que o número de fluxos recuperados por GetMutualExclusionCount.
Um objeto de exclusão mútua é removido do perfil chamando IMFASFProfile::RemoveMutualExclusion. O perfil reatribui os índices de exclusão mútua para que eles sejam sequenciais começando com zero. Isso substitui índices armazenados anteriormente, que não são mais válidos depois de chamar esse método. Isso libera os registros de fluxo de exclusão mútua associados.
Removendo registros em um objeto de exclusão mútua
Para remover um registro de um objeto de exclusão mútua, chame IMFASFMutualExclusion::RemoveRecord. Se esse método for bem-sucedido, o objeto de exclusão mútua indexa os registros restantes para que eles sejam sequenciais começando com zero. O aplicativo deve enumerar os registros para garantir o índice correto para cada registro. Para fazer isso, chame IMFASFMutualExclusion::GetRecordCount e faça um loop pelos registros chamando IMFASFMutualExclusion::GetStreamsForRecord.
Remover o registro com o índice mais alto não tem efeito sobre os outros índices.
Modificando um objeto de exclusão mútua
Para alterar a configuração do objeto de exclusão mútua no perfil, o aplicativo deve substituir o objeto de exclusão mútua existente por outro objeto que contenha as novas configurações.
Para alterar a configuração do objeto de exclusão mútua no perfil
Enumerar os objetos de exclusão mútua no perfil para obter o objeto que precisa ser alterado.
Chame IMFASFMutualExclusion::Clone para clonar o objeto de exclusão mútua.
Configure o objeto clonado conforme necessário.
Chame IMFASFProfile::RemoveMutualExclusion para remover o antigo objeto de exclusão mútua do perfil.
Chame IMFASFProfile::AddMutualExclusion para adicionar o objeto de exclusão mútua atualizado ao perfil.
Tópicos relacionados