Uso de exclusión mutua para secuencias ASF
El contenido de ASF puede contener varias secuencias que se excluyen mutuamente. Estas secuencias no se pueden leer simultáneamente, pero solo se lee una de ellas a la vez. Por ejemplo, el archivo puede contener un conjunto de secuencias que incluye el mismo contenido codificado a una velocidad de bits diferente. La secuencia que se usa viene determinada por el ancho de banda disponible para la aplicación que transmite el contenido. El objeto de exclusión mutua de ASF, que forma parte del objeto Header, almacena información sobre el grupo de secuencias mutuamente excluyentes.
En Media Foundation, el objeto de exclusión mutua que expone la interfaz IMFASFMutualExclusion existe para cada objeto de exclusión mutua de ASF. El objeto de perfil contiene referencia a todos los objetos de exclusión mutua.
El objeto de exclusión mutua almacena información sobre el grupo de secuencias mutuamente excluyentes como registros. Un objeto de exclusión mutua puede tener varios registros que se pueden usar para crear escenarios complejos. Cada registro contiene uno o varios flujos que no pueden coexistir con los flujos de otro registro, mantenidos por el objeto de exclusión mutua, según el tipo de exclusión mutua, como la velocidad de bits.
Un ejemplo común de exclusión mutua compleja es un archivo que contiene tres secuencias de audio del mismo contenido a distintas velocidades de bits en cada uno de los tres idiomas. Solo se debe reproducir una de las nueve secuencias a la vez, pero hay dos tipos por los que son mutuamente excluyentes: idioma y velocidad de bits.
En este ejemplo, a los nueve flujos se les asignan los siguientes números de secuencia:
- 1 - Idioma 1, velocidad de bits 1 2 - Idioma 1, velocidad de bits 2 3 - Idioma 1, velocidad de bits 3 4 - Idioma 2, velocidad de bits 1 5 - Idioma 2, velocidad de bits 2 6 - Idioma 2, velocidad de bits 3 7 - Idioma 3, velocidad de bits 1 8 - Idioma 3, velocidad de bits 2 9 - Idioma 3, velocidad de bits 3
Este escenario se puede implementar mediante los cuatro objetos de exclusión mutua siguientes:
- El primer objeto de exclusión mutua incluye secuencias 1, 2 y 3, mutuamente excluyentes por velocidad de bits. Cada secuencia tiene su propio registro.
- El segundo objeto de exclusión mutua incluye secuencias 4, 5 y 6, mutuamente excluyentes por velocidad de bits. Cada secuencia tiene su propio registro.
- El tercer objeto de exclusión mutua incluye 7, 8 y 9, mutuamente excluyente por velocidad de bits. Cada secuencia tiene su propio registro.
- El cuarto objeto de exclusión mutua contiene tres registros, el primero incluye secuencias 1, 2 y 3; el segundo incluyendo secuencias 4, 5 y 6; y la tercera, incluidas las secuencias 7, 8 y 9. Estos registros son mutuamente excluyentes por idioma.
Al reproducir un archivo creado de esta manera, la aplicación de streaming selecciona primero el idioma porque es menos probable que cambie en medio de la presentación y, a continuación, seleccione una velocidad de bits.
Creación y configuración de objetos de exclusión mutua
En la lista siguiente se resume el proceso de configuración de un objeto de exclusión mutua:
- Cree un objeto de exclusión mutua.
- Establezca el tipo de exclusión mutua.
- Configure el objeto de exclusión mutua agregando registros y las secuencias asociadas.
- Agregue el objeto de exclusión mutua al perfil.
Para crear y configurar un objeto de exclusión mutua
Llame a IMFASFProfile::CreateMutualExclusion para crear un objeto de exclusión mutua vacío.
Llame a IMFASFMutualExclusion::SetType para establecer el criterio de la secuencia mutuamente excluyente.
Las secuencias pueden ser mutuamente excluyentes por idioma, velocidad de bits, presentación y criterios personalizados. El tipo se representa como UN GUID. Para obtener una lista de estas constantes, consulte GUID de tipo de exclusión mutua de ASF.
Llame a IMFASFMutualExclusion::AddRecord para agregar un registro al objeto de exclusión mutua.
Este método agrega un registro vacío y le asigna un índice de registro a partir de cero.
Llame a IMFASFMutualExclusion::AddStreamForRecord para agregar el número de secuencia al registro especificado por el índice de registro.
Cada registro incluye una o varias secuencias. Cada secuencia de un registro es mutuamente excluyente de todas las secuencias de todos los demás registros. Para obtener el número de secuencias de un registro, llame a IMFASFMutualExclusion::GetStreamsForRecord especificando el índice de registro.
Para quitar una secuencia del registro, llame a IMFASFMutualExclusion::RemoveStreamFromRecord y especifique el índice de registro y el número de secuencia.
Llame a IMFASFProfile::AddMutualExclusion para agregar el objeto de exclusión mutua configurado al perfil.
Enumerar objetos de exclusión mutua en un perfil
Si IMFASFProfile::AddMutualExclusion se realiza correctamente, asigna un índice al objeto especificado, empezando por cero.
Para enumerar los objetos de exclusión mutua asociados a un perfil, llame a IMFASFProfile::GetMutualExclusionCount y recorra la lista llamando a IMFASFProfile::GetMutualExclusion. Los índices de exclusión mutua son secuenciales y oscilan entre 0 y uno menor que el número de secuencias recuperadas por GetMutualExclusionCount.
Un objeto de exclusión mutua se quita del perfil llamando a IMFASFProfile::RemoveMutualExclusion. El perfil reasigna los índices de exclusión mutua para que sean secuenciales a partir de cero. Esto sobrescribe los índices almacenados previamente, que ya no son válidos después de llamar a este método. Esto libera los registros de flujo de exclusión mutua asociados.
Quitar registros en un objeto de exclusión mutua
Para quitar un registro de un objeto de exclusión mutua, llame a IMFASFMutualExclusion::RemoveRecord. Si este método se realiza correctamente, el objeto de exclusión mutua indexa los registros restantes para que sean secuenciales a partir de cero. La aplicación debe enumerar los registros para asegurarse del índice correcto para cada registro. Para ello, llame a IMFASFMutualExclusion::GetRecordCount y recorra los registros llamando a IMFASFMutualExclusion::GetStreamsForRecord.
Quitar el registro con el índice más alto no tiene ningún efecto en los demás índices.
Modificar un objeto de exclusión mutua
Para cambiar la configuración del objeto de exclusión mutua en el perfil, la aplicación debe reemplazar el objeto de exclusión mutua existente por otro objeto que contenga la nueva configuración.
Para cambiar la configuración del objeto de exclusión mutua en el perfil
Enumere los objetos de exclusión mutua del perfil para obtener el objeto que debe cambiarse.
Llame a IMFASFMutualExclusion::Clone para clonar el objeto de exclusión mutua.
Configure el objeto clonado según sea necesario.
Llame a IMFASFProfile::RemoveMutualExclusion para quitar el antiguo objeto de exclusión mutua del perfil.
Llame a IMFASFProfile::AddMutualExclusion para agregar el objeto de exclusión mutua actualizado al perfil.
Temas relacionados