Media Foundation: conceitos essenciais

Se você for novo em mídia digital, este tópico apresentará alguns conceitos que você precisará entender antes de escrever um aplicativo do Media Foundation.

Fluxos

Um fluxo é uma sequência de dados de mídia com um tipo uniforme. Os tipos mais comuns são áudio e vídeo, mas um fluxo pode conter quase qualquer tipo de dados, incluindo texto, comandos de script e imagens paradas. O fluxo de termos nesta documentação não implica entrega em uma rede. Um arquivo de mídia destinado à reprodução local também contém fluxos.

Normalmente, um arquivo de mídia contém um único fluxo de áudio ou exatamente um fluxo de vídeo e um fluxo de áudio. No entanto, um arquivo de mídia pode conter vários fluxos do mesmo tipo. Por exemplo, um arquivo de vídeo pode conter fluxos de áudio em vários idiomas diferentes. Em tempo de execução, o aplicativo selecionaria qual fluxo usar.

Compactação

A compactação refere-se a qualquer processo que reduza o tamanho de um fluxo de dados removendo informações redundantes. Os algoritmos de compactação se enquadram em duas categorias amplas:

  • Compactação sem perda . Usando um algoritmo sem perda, os dados reconstruídos são idênticos ao original.
  • Compactação com perda . Usando um algoritmo de perda, os dados reconstruídos são uma aproximação do original, mas não é uma correspondência exata.

Na maioria dos outros domínios, a compactação com perda não é aceitável. (Imagine recuperar uma "aproximação" de uma planilha!) Mas os esquemas de compactação com perda são adequados para áudio e vídeo, por alguns motivos.

A primeira razão tem a ver com a física da percepção humana. Quando ouvimos um som complexo, como uma gravação de música, algumas das informações contidas nesse som não são perceptíveis ao ouvido. Com a ajuda da teoria do processamento de sinal, é possível analisar e separar as frequências que não podem ser percebidas. Essas frequências podem ser removidas sem nenhum efeito perceptivo. Embora o áudio reconstruído não corresponda exatamente ao original, ele soará o mesmo para o ouvinte. Princípios semelhantes se aplicam ao vídeo.

Em segundo lugar, alguma degradação na qualidade de som ou imagem pode ser aceitável, dependendo da finalidade pretendida. Na telefonia, por exemplo, o áudio geralmente é altamente compactado. O resultado é bom o suficiente para uma conversa telefônica, mas você não gostaria de ouvir uma orquestra sinfônica por telefone.

A compactação também é chamada de codificação e um dispositivo que codifica é chamado de codificador. O processo reverso é a decodificação e o dispositivo é naturalmente chamado de decodificador. O termo geral para codificadores e decodificadores é codec. Codecs podem ser implementados em hardware ou software.

A tecnologia de compactação mudou rapidamente desde o advento da mídia digital, e um grande número de esquemas de compactação estão em uso hoje. Esse fato é um dos principais desafios para a programação de mídia digital.

Contêineres de Mídia

É raro armazenar um fluxo de áudio ou vídeo bruto como um arquivo de computador ou enviar um diretamente pela rede. Por um lado, seria impossível decodificar esse fluxo, sem saber com antecedência qual codec usar. Portanto, os arquivos de mídia geralmente contêm pelo menos alguns dos seguintes elementos:

  • Cabeçalhos de arquivo que descrevem o número de fluxos, o formato de cada fluxo e assim por diante.
  • Um índice que permite acesso aleatório ao conteúdo.
  • Metadados que descrevem o conteúdo (por exemplo, o artista ou o título).
  • Cabeçalhos de pacote, para habilitar a transmissão de rede ou o acesso aleatório.

Esta documentação usa o contêiner de termos para descrever todo o pacote de fluxos, cabeçalhos, índices, metadados e assim por diante. O motivo para usar o contêiner de termos em vez de arquivo é que alguns formatos de contêiner foram projetados para transmissão ao vivo. Um aplicativo pode gerar o contêiner em tempo real, nunca armazenando-o em um arquivo.

Um exemplo inicial de um contêiner de mídia é o formato de arquivo AVI. Outros exemplos incluem MP4 e ASF (Advanced Systems Format). Os contêineres podem ser identificados por extensão de nome de arquivo (por exemplo, .mp4) ou por tipo MIME.

O diagrama a seguir mostra uma estrutura típica para um contêiner de mídia. O diagrama não representa nenhum formato específico; os detalhes de cada formato variam amplamente.

diagram showing a typical media container

Observe que a estrutura mostrada no diagrama é hierárquica, com informações de cabeçalho aparecendo no início do contêiner. Essa estrutura é típica de muitos (mas não todos) formatos de contêiner. Observe também que a seção de dados contém pacotes de áudio e vídeo intercalados. Esse tipo de intercalação é comum em contêineres de mídia.

O termo multiplexação refere-se ao processo de empacotar os fluxos de áudio e vídeo e intercalar os pacotes no contêiner. O processo reverso, remontando os fluxos dos dados em pacotes, é chamado de demultiplexing.

Formatos

Na mídia digital, o formato do termo é ambíguo. Um formato pode se referir ao tipo de codificação, como vídeo H.264 ou o contêiner, como MP4. Essa distinção geralmente é confusa para usuários comuns. Os nomes dados aos formatos de mídia nem sempre ajudam. Por exemplo, MP3 refere-se a um formato de codificação (MPEG-1 Audio Layer 3) e a um formato de arquivo.

No entanto, a distinção é importante porque a leitura de um arquivo de mídia envolve dois estágios:

  1. Primeiro, o contêiner deve ser analisado. Na maioria dos casos, o número de fluxos e o formato de cada fluxo não podem ser conhecidos até que esta etapa seja concluída.
  2. Em seguida, se os fluxos forem compactados, eles deverão ser decodificados usando os decodificadores apropriados.

Esse fato leva naturalmente a um design de software em que componentes separados são usados para analisar contêineres e decodificar fluxos. Além disso, essa abordagem se presta a um modelo de plug-in, para que terceiros possam fornecer seus próprios analisadores e codecs. No Windows, o COM (Component Object Model) fornece uma maneira padrão de separar uma API de sua implementação, o que é um requisito para qualquer modelo de plug-in. Por esse motivo (entre outros), o Media Foundation usa interfaces COM.

O diagrama a seguir mostra os componentes usados para ler um arquivo de mídia:

diagram showing the components to read a media file

Escrever um arquivo de mídia também requer duas etapas:

  1. Codificando os dados de áudio/vídeo não compactados.
  2. Colocando os dados compactados em um formato de contêiner específico.

O diagrama a seguir mostra os componentes usados para gravar um arquivo de mídia:

diagram showing the components to write a media file.

Guia de programação do Media Foundation