Algumas definições principais:
- Um codec (por exemplo, H.264, HEVC, VP9) é responsável apenas pela parte de vídeo ou áudio, e um ou mais codecs podem ser mesclados em um contêiner.
- Um contêiner (por exemplo, MP4, MKV) é responsável por mantê-los juntos e também é isso que você costuma abrir no seu media player preferido.
- Um codificador específico (por exemplo, x264, libvpx) é responsável por transformar um fluxo de entrada em um fluxo de bits compatível com codec. Geralmente, existem vários codificadores para um codec específico.
Como você pode ver, teremos que explicar algumas coisas aqui.
O que é um codec?
Um codec é a abreviação de codificador / decodificador, o que basicamente significa apenas o seguinte: Os dados gerados por um codificador sempre podem ser decodificados por um decodificador apropriado. Isso é válido para vídeo, áudio, mas você também pode pensar em criptografia (um codificador precisa de um decodificador apropriado para exibir uma mensagem criptografada).
Atualmente, quando um codec de vídeo é especificado, as instituições que participam dele geralmente especificam apenas a sintaxe do padrão. Por exemplo, eles dirão: "O formato de fluxo de bits deve ser assim", "O 0x810429AAB
aqui será traduzido para isso", etc. Muitas vezes, eles fornecem um codificador e decodificador de referência, mas como um codificador é então escrito para corresponder a tal formato completamente depende dos fabricantes.
Esta é a razão pela qual você encontrará tantos codificadores para o mesmo codec, e alguns deles até comerciais.
Um exemplo de caso - H.264
Antes de misturarmos a terminologia, vamos dar um exemplo. Considere o caso do H.264 . O nome do padrão é H.264 - esse não é o nome do codificador real. O Mainconcept é um codificador comercial muito bom, enquanto o x264 é um código livre e de código aberto. Ambos pretendem oferecer boa qualidade, é claro.
O simples fato de que você pode otimizar a codificação cria uma competição aqui. Ambos os codificadores fornecerão um fluxo de bits padronizado que sempre pode ser decodificado por um decodificador compatível com H.264.
Resumir
Então, em suma, digamos que um codificador irá:
- tirar quadros de vídeo
- produzir um fluxo de bits válido
O fluxo de bits é então multiplexado em um contêiner.
O decodificador irá:
- pegue esse fluxo de bits válido
- reconstruir os quadros de vídeo a partir dele
Ambos estão em conformidade com um padrão de codec. Isso é tudo!
Codecs atuais
Atualmente, você provavelmente encontrará apenas vídeos codificados com os codecs que mencionarei abaixo. Curiosamente, quase todos eles foram criados pelo Motion Picture Experts Group (MPEG). Mas existem outros codecs isentos de royalties, por exemplo, aqueles criados pelo Google ou pela Alliance for Open Media, que são concorrentes dos padrões MPEG.
Observe que "MPEG" pode se referir a codecs e contêineres, como você verá abaixo. Isso aumenta a confusão, mas saiba que apenas "MPEG" não significa nada, por exemplo, "Eu tenho um arquivo no formato MPEG" é muito ambíguo ".
MPEG-2 é bastante antigo. Seu primeiro lançamento público é de 1996. O vídeo MPEG-2 é usado principalmente para transmissão de DVDs e TV, por exemplo, DVB-T ou satélite, e aplicativos legados em que a compatibilidade é importante. Os vídeos MPEG-2 são encontrados principalmente em um contêiner .MPG .
Este é provavelmente o que foi usado principalmente para codificar vídeos para a web em meados dos anos 2000, mas foi substituído nesse meio tempo. Ele oferece boa qualidade em tamanhos de arquivo práticos, o que significa que você pode gravar um filme inteiro de 90 minutos em um CD de 600 MB (enquanto que com o MPEG-2 você precisaria de um DVD, veja minha resposta aqui ). Não funciona mais tão bem para conteúdo HD ou 4K.
Alguns codificadores que emitem vídeo MPEG-4 Parte 2 são o DivX , seu ripoff de fonte aberta XviD e o Nero Digital .
Os vídeos MPEG-4 Parte 2 geralmente vêm em um contêiner AVI , mas o MP4 também é visto com frequência.
Isso também é conhecido como MPEG-4 Advanced Video Coding (AVC) ou H.264 ; hoje é o codec mais usado. Ele oferece boa qualidade em arquivos pequenos e, portanto, é perfeitamente adequado para todos os tipos de vídeo na Internet ou em dispositivos móveis. Você encontrará o H.264 em quase todas as aplicações modernas, de telefones a filmadoras. Nos discos Blu-ray, o vídeo agora é codificado no H.264.
Alguns codificadores são: x264 , NVENC (da NVIDIA), Mainconcept . Os vídeos vêm principalmente em contêineres MP4 , MKV ou MOV .
Também chamado MPEG-H Part 2, este é o sucessor do MPEG-4 Part 10 / AVC / H.264. Ele tem como objetivo resoluções mais altas (até 8K ) e pode oferecer desempenho de codificação até 50% mais alto (em termos de qualidade vs. taxa de bits) em comparação com o H.264 (consulte este documento , por exemplo).
O padrão foi publicado em 2013 e, lentamente, o codec está começando a ser usado cada vez mais, por exemplo, para IPTV ou transmissão de vídeo online. O HEVC também é usado pela Apple para armazenar vídeos e imagens (usando HEIF ) no iOS. No entanto, o fato de haver vários pools de patentes associados ao HEVC faz com que muitas empresas (quase todas, exceto a Apple) mudem para alternativas livres de royalties. O HEVC também não é suportado nativamente por todos os navegadores, tornando-o inutilizável para transmissão na Web.
O codificador mais conhecido é x265 . Há também o NVENC . Os vídeos geralmente vêm em contêineres MP4 .
O VP9 (sucessor do VP8) é um codec desenvolvido principalmente pelo Google. É aberto e livre de royalties e implementado em muitos navegadores . Sua qualidade é quase tão boa quanto a HEVC e às vezes até melhor (veja este artigo da Netflix). VP9 é o que você obtém quando assiste ao YouTube em um navegador compatível.
O VP9 pode ser codificado com o codificador libvpx e geralmente é fornecido em contêineres WebM ou MKV .
Algumas empresas se uniram para formar um concorrente ainda mais forte do HEVC - mas como uma alternativa livre de royalties. O AV1 será o sucessor do VP9 e é baseado no que deveria ser o VP10. É apoiado pela Alliance for Open Media (fundada pela Amazon, Cisco, Google, Intel, Microsoft, Mozilla e Netflix). Leia mais sobre isso aqui .
O codificador libaom pode ser usado para gerar fluxos de bits AV1, mas ainda é experimental.
O que é um formato (contêiner)?
Até agora, apenas explicamos o "fluxo de bits" bruto, que é basicamente apenas dados de vídeo realmente brutos. Você pode realmente assistir e assistir ao vídeo usando um fluxo de bits tão bruto. Mas na maioria dos casos isso não é suficiente ou não é prático.
Portanto, você precisa agrupar o vídeo em um contêiner. Existem várias razões pelas quais:
- Talvez você queira um pouco de áudio junto com o vídeo
- Talvez você queira pular para uma determinada parte do vídeo (como "vá para 1: 32: 20.12")
- Tanto o áudio quanto o vídeo devem estar perfeitamente sincronizados
- Talvez o vídeo precise ser transmitido por uma rede confiável e dividido em pacotes antes de
- O vídeo pode até ser enviado por uma rede com perdas (como 3G) e dividido em pacotes antes
Por todas essas razões, os formatos de contêiner foram inventados, alguns simples, outros mais avançados. O que todos eles fazem é "agrupar" o fluxo de bits do vídeo em outro fluxo de bits.
Um contêiner sincronizará os quadros de vídeo e áudio de acordo com o PTS ( Presentation Time Stamp ), o que garante que eles sejam exibidos exatamente ao mesmo tempo. Também se encarregaria de adicionar informações para servidores de streaming, se necessário, para que um servidor saiba quando enviar qual parte do arquivo.
Vamos dar uma olhada em alguns contêineres populares.
Contentores populares
Você encontrará vídeos embalados principalmente nos seguintes recipientes. Existem outros menos populares também, mas como eu disse, são principalmente:
Intercalação de áudio e vídeo - este é o contêiner mais básico, existe apenas para intercalar áudio e vídeo. Foi escrito em 1992 e ainda é usado hoje, mas considerado legado, portanto, não o use mais.
também é conhecido como MPEG-4 Parte 14 e é baseado no formato de arquivo do QuickTime. Este é o formato para vídeo H.264, mas também envolve HEVC, MPEG-4 Parte 2 e MPEG-2.
Esse contêiner também pode incluir apenas áudio, e é por isso que você encontrará tantos arquivos .mp4 que não são vídeos, mas áudio codificado em AAC , também em arquivos .m4a (apenas uma extensão diferente). A extensão .m4v geralmente é usada para fluxos de bits de vídeo.
O Matroska Video (MKV) é um formato de arquivo gratuito e de código aberto que é frequentemente encontrado atualmente, pois suporta basicamente qualquer codec, do H.264 ao VP9, e, é claro, também muitos codecs de áudio.
O WebM é baseado em MKV e é usado principalmente para vídeo VP9 e áudio Opus - é o contêiner de escolha para streaming de vídeo na Web quando esses codecs são usados.
O contêiner Ogg é o contêiner de escolha para o codec de vídeo Theora (e o codec de áudio Vorbis ), também criado pela Xiph.Org Foundation. Também é gratuito e de código aberto (assim como o codec).
O formato de vídeo em Flash foi criado pela Adobe, para uso em seus aplicativos de streaming. Não é mais usado muito, pois a maneira como a transmissão é feita mudou significativamente nos últimos anos.
Codecs e formatos populares
Além disso, quais dos seguintes são codecs, quais são os formatos de arquivo e quais não são?
- Quicktime MOV : .mov é a extensão de arquivo para o QuickTime File Format , que é um contêiner criado pela Apple. Este contêiner foi posteriormente adaptado para MP4. Pode transportar todos os tipos de codecs. O Quicktime é na verdade uma estrutura de mídia inteira, na verdade, não especifica nenhum codec em si, no que me diz respeito.
- MPEG (1, 2, 3, 4) : Padrões definidos pelo Motion Picture Experts Group. Veja meu post acima para obter detalhes.
- WMV : Vídeo do Windows Media. Na verdade, é um codec envolvido em um contêiner Advanced Systems Format , que usa a extensão .wmv novamente. Estranho, mas é assim que as coisas são.
- FFmpeg : Este não é um codec nem um contêiner. É uma biblioteca de ferramentas de vídeo que também permite a conversão entre diferentes codecs e contêineres. O FFmpeg conta com o código aberto
libavcodec
e as libavformat
bibliotecas para criar codecs e contêineres, respectivamente. A maioria das ferramentas de vídeo que você encontra hoje se baseia nela.
- AVC : Sinônimo para MPEG-4 Parte 10 ou H.264.
- DivX : Outro tipo de codificador para vídeo MPEG-4 Parte 2.
- Xvid : Um tipo de codificador para vídeo MPEG-4 Parte 2. É apenas a versão gratuita e de código aberto do DivX, o que obviamente levou a alguma controvérsia.
- H.264 : Sinônimo para MPEG-4 Part 10 ou AVC.
Em uma nota lateral:
Estou usando a terminologia correta?
Eu acho que uma vez preferiria usar especificamente "codec" e "container" em vez de "format" para evitar mal-entendidos. Teoricamente, um formato pode ser qualquer coisa, porque codecs e contêineres especificam um formato (ou seja, como os dados devem ser representados).
Dito isto, a terminologia do FFmpeg seria usar "formato" para o contêiner. Isso também se deve à distinção entre:
libavcodec
, a biblioteca para codificação / decodificação
libavformat
, a biblioteca para os contêineres