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 la trasmissione su 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 potrebbe contenere diversi flussi dello stesso tipo. Ad esempio, un file video potrebbe contenere flussi audio in diverse lingue. In fase di esecuzione, l'applicazione selezionerà il flusso da usare.

Compressione

compression 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 di dati, i dati ricostruiti sono identici all'originale.
  • compressione con perdita di qualità. L'utilizzo di un algoritmo con perdita di dati fa sì che i dati ricostruiti siano un'approssimazione dell'originale, ma non sono una corrispondenza esatta.

Nella maggior parte degli altri domini, la compressione con perdita non è accettabile. (Immaginate di ottenere 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 dell'elaborazione dei segnali, è 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, suono uguale al listener. Principi simili si applicano al video.

In secondo luogo, una riduzione della qualità audio 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 viene chiamata anche codifica e un dispositivo che codifica viene chiamato codificatore . Il processo inverso è decodificae il dispositivo è naturalmente denominato 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 un gran numero di schemi di compressione sono attualmente in uso. Questo è uno dei principali problemi per la programmazione multimediale digitale.

Contenitori multimediali

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

  • Intestazioni di file che descrivono il numero di flussi, il formato di ciascun 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 consentire la trasmissione sulla 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 dell'uso del 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 mostra 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 tipico contenitore multimediale

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

Il termine multiplexing si riferisce al processo di impacchettamento dei flussi audio e video e di interleaving dei pacchetti nel contenitore. Il processo inverso, che ricostruisce i flussi dai dati pacchettizzati, viene chiamato demultiplexing.

Formati

Nei supporti digitali, il termine formato è ambiguo. Un formato può fare riferimento al tipo di codifica , ad esempio video H.264 o al 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, il contenitore deve essere analizzato. 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 vengono 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, Component Object Model (COM) fornisce 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 di contenitore specifico.

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

diagramma che mostra i componenti per scrivere un file multimediale.

Guida alla programmazione di Media Foundation