Media Foundation: concetti essenziali

Se non si ha esperienza con i supporti digitali, questo argomento presenta alcuni concetti che è necessario comprendere prima di scrivere un'applicazione Media Foundation.

Flussi

Un flusso è una sequenza di dati multimediali con un tipo uniforme. I tipi più comuni sono audio e video, ma un flusso può contenere quasi qualsiasi tipo di dati, tra cui testo, comandi di script e immagini ancora. Il termine flusso in questa documentazione non implica il recapito in una rete. Un file multimediale destinato alla riproduzione locale contiene anche flussi.

In genere, un file multimediale contiene un singolo flusso audio o esattamente un flusso video e un flusso audio. Tuttavia, un file multimediale può contenere più flussi dello stesso tipo. Ad esempio, un file video può contenere flussi audio in diverse lingue. In fase di esecuzione, l'applicazione selezionerà il flusso da usare.

Compressione

La compressione fa riferimento a qualsiasi processo che riduce le dimensioni di un flusso di dati rimuovendo le informazioni ridondanti. Gli algoritmi di compressione rientrano in due categorie generali:

  • Compressione senza perdita di dati . Usando un algoritmo senza perdita, i dati ricostruiti sono identici all'originale.
  • Compressione con perdita di dati . Usando un algoritmo di perdita, i dati ricostruiti sono un'approssimazione dell'originale, ma non è una corrispondenza esatta.

Nella maggior parte degli altri domini, la compressione con perdita di dati non è accettabile. (Si supponga di tornare a un'"approssimazione" di un foglio di calcolo!) Ma gli schemi di compressione con perdita sono adatti per audio e video, per un paio di motivi.

La prima ragione ha a che fare con la fisica della percezione umana. Quando ascoltiamo un suono complesso, come una registrazione musicale, alcune delle informazioni contenute in quel suono non sono percepibili per l'orecchio. Con l'aiuto della teoria di elaborazione del segnale, è possibile analizzare e separare le frequenze che non possono essere percepite. Queste frequenze possono essere rimosse senza alcun effetto percettivo. Anche se l'audio ricostruito non corrisponde esattamente all'originale, suona lo stesso al listener. Principi simili si applicano al video.

In secondo luogo, una riduzione della qualità del suono o dell'immagine può essere accettabile, a seconda dello scopo previsto. Nella telefonia, ad esempio, l'audio è spesso altamente compresso. Il risultato è sufficiente per una conversazione telefonica, ma non si vuole ascoltare un'orchestra sinfonia su un telefono.

La compressione è detta anche codifica e un dispositivo che codifica viene chiamato codificatore. Il processo inverso è la decodifica e il dispositivo è naturalmente chiamato decodificatore. Il termine generale per codificatori e decodificatori è codec. I codec possono essere implementati in hardware o software.

La tecnologia di compressione è cambiata rapidamente dall'avvento dei media digitali e oggi è in uso un numero elevato di schemi di compressione. Questo è uno dei principali problemi per la programmazione dei contenuti multimediali digitali.

Contenitori multimediali

È raro archiviare un flusso audio o video non elaborato come file di computer o inviarlo direttamente in rete. Per una cosa, sarebbe impossibile decodificare un flusso di questo tipo, senza sapere in anticipo quale codec usare. Pertanto, i file multimediali contengono in genere almeno alcuni degli elementi seguenti:

  • Intestazioni di file che descrivono il numero di flussi, il formato di ogni flusso e così via.
  • Indice che consente l'accesso casuale al contenuto.
  • Metadati che descrivono il contenuto ,ad esempio l'artista o il titolo.
  • Intestazioni di pacchetto, per abilitare la trasmissione di rete o l'accesso casuale.

Questa documentazione usa il termine contenitore per descrivere l'intero pacchetto di flussi, intestazioni, indici, metadati e così via. Il motivo per cui si usa il termine contenitore anziché file è che alcuni formati di contenitore sono progettati per la trasmissione live. Un'applicazione potrebbe generare il contenitore in tempo reale e non archiviarlo mai in un file.

Un primo esempio di un contenitore multimediale è il formato di file AVI. Altri esempi includono MP4 e Advanced Systems Format (ASF). I contenitori possono essere identificati dall'estensione del nome file (ad esempio, .mp4) o dal tipo MIME.

Il diagramma seguente illustra una struttura tipica per un contenitore multimediale. Il diagramma non rappresenta alcun formato specifico; i dettagli di ogni formato variano notevolmente.

diagramma che mostra un contenitore multimediale tipico

Si noti che la struttura mostrata nel diagramma è gerarchica, con le informazioni sull'intestazione visualizzate all'inizio del contenitore. Questa struttura è tipica di molti formati di contenitore (ma non tutti). Si noti anche che la sezione dati contiene pacchetti audio e video interleaved. Questo tipo di interleaving è comune nei contenitori multimediali.

Il termine multiplexing si riferisce al processo di creazione di pacchetti dei flussi audio e video e l'interleaving dei pacchetti nel contenitore. Il processo inverso, riassemblando i flussi dai dati in pacchetti, viene chiamato demultiplexing.

Formati

Nei supporti digitali il formato del termine è ambiguo. Un formato può fare riferimento al tipo di codifica, ad esempio il video H.264 o il contenitore, ad esempio MP4. Questa distinzione è spesso confusa per gli utenti normali. I nomi assegnati ai formati multimediali non sono sempre utili. Ad esempio, MP3 fa riferimento sia a un formato di codifica (MPEG-1 Audio Layer 3) che a un formato di file.

La distinzione è tuttavia importante perché la lettura di un file multimediale comporta effettivamente due fasi:

  1. Prima di tutto, è necessario analizzare il contenitore. Nella maggior parte dei casi, il numero di flussi e il formato di ogni flusso non possono essere noti fino al completamento di questo passaggio.
  2. Successivamente, se i flussi sono compressi, devono essere decodificati usando i decodificatori appropriati.

Questo fatto porta naturalmente a una progettazione software in cui vengono usati componenti separati per analizzare i contenitori e decodificare i flussi. Inoltre, questo approccio si presta a un modello plug-in, in modo che terze parti possano fornire parser e codec personalizzati. In Windows, il modello COM (Component Object Model) offre un modo standard per separare un'API dalla relativa implementazione, che è un requisito per qualsiasi modello plug-in. Per questo motivo , tra gli altri, Media Foundation usa interfacce COM.

Il diagramma seguente illustra i componenti usati per leggere un file multimediale:

diagramma che mostra i componenti per leggere un file multimediale

La scrittura di un file multimediale richiede anche due passaggi:

  1. Codifica dei dati audio/video non compressi.
  2. Inserimento dei dati compressi in un formato contenitore specifico.

Il diagramma seguente mostra i componenti usati per scrivere un file multimediale:

diagramma che mostra i componenti per scrivere un file multimediale.

Guida alla programmazione di Media Foundation