Condividi tramite


Uso dell'esclusione reciproca per i flussi ASF

Il contenuto ASF può contenere più flussi che si escludono a vicenda. Questi flussi non possono essere letti simultaneamente, ma solo uno di essi viene letto alla volta. Ad esempio, il file può contenere un set di flussi che include lo stesso contenuto codificato a una velocità di bit diversa. Il flusso usato è determinato dalla larghezza di banda disponibile per l'applicazione che trasmette il contenuto. L'oggetto di esclusione reciproca ASF, che fa parte dell'oggetto header, archivia le informazioni sul gruppo di flussi che si escludono a vicenda.

In Media Foundation l'oggetto di esclusione reciproca che espone l'interfaccia IMFASFMutualExclusion esiste per ogni oggetto di esclusione reciproca ASF. L'oggetto profilo contiene il riferimento a tutti gli oggetti di esclusione reciproca.

L'oggetto esclusione reciproca archivia le informazioni sul gruppo di flussi che si escludono a vicenda come record. Un oggetto di esclusione reciproca può avere più record che possono essere usati per creare scenari complessi. Ogni record contiene uno o più flussi che non possono coesistere con flussi in un altro record, gestiti dall'oggetto di esclusione reciproca, a seconda del tipo di esclusione reciproca, ad esempio la frequenza dei bit.

Un esempio comune di esclusione reciproca complessa è un file che contiene tre flussi audio dello stesso contenuto a varie velocità di bit in ognuna di tre lingue. Solo uno dei nove flussi deve essere riprodotto alla volta, ma ci sono due tipi in base ai quali si escludono a vicenda: lingua e velocità di bit.

Per questo esempio, ai nove flussi vengono assegnati i numeri di flusso seguenti:

1 - Lingua 1, velocità in bit 1 2 - Lingua 1, velocità di bit 2 3 - Lingua 1, velocità in bit 3 4 - Lingua 2, velocità in bit 1 5 - Lingua 2, velocità in bit 2 6 - Lingua 2, velocità in bit 3 7 - Lingua 3, velocità in bit 1 8 - Lingua 3, velocità in bit 2 9 - Lingua 3, velocità in bit 3, velocità in bit 3

Questo scenario può essere implementato usando i quattro oggetti di esclusione reciproca seguenti:

  • Il primo oggetto di esclusione reciproca include flussi 1, 2 e 3, che si escludono a vicenda in base alla velocità in bit. Ogni flusso ha un proprio record.
  • Il secondo oggetto di esclusione reciproca include flussi 4, 5 e 6, che si escludono a vicenda in base alla velocità in bit. Ogni flusso ha un proprio record.
  • Il terzo oggetto di esclusione reciproca include 7, 8 e 9, che si escludono a vicenda in base alla velocità in bit. Ogni flusso ha un proprio record.
  • Il quarto oggetto di esclusione reciproca contiene tre record, il primo include i flussi 1, 2 e 3; il secondo include flussi 4, 5 e 6; e il terzo include flussi 7, 8 e 9. Questi record si escludono a vicenda in base alla lingua.

Quando si riproduce un file creato in questo modo, l'applicazione di streaming seleziona prima la lingua perché è meno probabile che cambi al centro della presentazione e quindi selezioni una frequenza di bit.

Creazione e configurazione di oggetti di esclusione reciproca

L'elenco seguente riepiloga il processo di configurazione di un oggetto di esclusione reciproca:

  1. Creare un oggetto di esclusione reciproca.
  2. Impostare il tipo di esclusione reciproca.
  3. Configurare l'oggetto di esclusione reciproca aggiungendo record e flussi associati.
  4. Aggiungere l'oggetto di esclusione reciproca al profilo.

Per creare e configurare un oggetto di esclusione reciproca

  1. Chiamare IMFASFProfile::CreateMutualExclusion per creare un oggetto di esclusione reciproca vuoto.

  2. Chiamare IMFASFMutualExclusion::SetType per impostare il criterio del flusso che si escludono a vicenda.

    I flussi possono essere a vicenda esclusivi in base a linguaggio, velocità in bit, presentazione e criteri personalizzati. Il tipo è rappresentato come GUID. Per un elenco di queste costanti, vedere GUID del tipo di esclusione reciproca ASF.

  3. Chiamare IMFASFMutualExclusion::AddRecord per aggiungere un record all'oggetto di esclusione reciproca.

    Questo metodo aggiunge un record vuoto e lo assegna a un indice di record a partire da zero.

  4. Chiamare IMFASFMutualExclusion::AddStreamForRecord per aggiungere il numero di flusso al record specificato dall'indice del record.

    Ogni record include uno o più flussi. Ogni flusso in un record si escludono a vicenda tutti i flussi in ogni altro record. Per ottenere il numero di flussi in un record, chiamare IMFASFMutualExclusion::GetStreamsForRecord specificando l'indice del record.

    Per rimuovere un flusso dal record, chiamare IMFASFMutualExclusion::RemoveStreamFromRecord e specificare l'indice del record e il numero di flusso.

  5. Chiamare IMFASFProfile::AddMutualExclusion per aggiungere l'oggetto di esclusione reciproca configurato al profilo.

Enumerazione di oggetti di esclusione reciproca in un profilo

Se IMFASFProfile::AddMutualExclusion ha esito positivo, assegna un indice all'oggetto specificato, a partire da zero.

Per enumerare gli oggetti di esclusione reciproca associati a un profilo, chiamare IMFASFProfile::GetMutualExclusionCount e scorrere l'elenco chiamando IMFASFProfile::GetMutualExclusion. Gli indici di esclusione reciproca sono sequenziali e sono compresi tra 0 e uno minore del numero di flussi recuperati da GetMutualExclusionCount.

Un oggetto di esclusione reciproca viene rimosso dal profilo chiamando IMFASFProfile::RemoveMutualExclusion. Il profilo riassegna gli indici di esclusione reciproca in modo che siano sequenziali a partire da zero. In questo modo vengono sovrascritti gli indici archiviati in precedenza, che non sono più validi dopo aver chiamato questo metodo. In questo modo vengono rilasciati i record del flusso di esclusione reciproca associati.

Rimozione di record in un oggetto di esclusione reciproca

Per rimuovere un record da un oggetto di esclusione reciproca, chiamare IMFASFMutualExclusion::RemoveRecord. Se questo metodo ha esito positivo, l'oggetto di esclusione reciproca indicizza i record rimanenti in modo che siano sequenziali a partire da zero. L'applicazione deve enumerare i record per garantire l'indice corretto per ogni record. A tale scopo, chiamare IMFASFMutualExclusion::GetRecordCount e scorrere i record chiamando IMFASFMutualExclusion::GetStreamsForRecord.

La rimozione del record con l'indice più alto non ha alcun effetto sugli altri indici.

Modifica di un oggetto di esclusione reciproca

Per modificare la configurazione dell'oggetto di esclusione reciproca nel profilo, l'applicazione deve sostituire l'oggetto di esclusione reciproca esistente con un altro oggetto contenente le nuove impostazioni.

Per modificare la configurazione dell'oggetto di esclusione reciproca nel profilo

  1. Enumerare gli oggetti di esclusione reciproca nel profilo per ottenere l'oggetto che deve essere modificato.

  2. Chiamare IMFASFMutualExclusion::Clone per clonare l'oggetto di esclusione reciproca.

  3. Configurare l'oggetto clonato in base alle esigenze.

  4. Chiamare IMFASFProfile::RemoveMutualExclusion per rimuovere l'oggetto di esclusione reciproca precedente dal profilo.

  5. Chiamare IMFASFProfile::AddMutualExclusion per aggiungere l'oggetto di esclusione reciproca aggiornato al profilo.

Profilo ASF