Tutorial de FFmpeg na marra! - Lição 3 (Resolução, Taxa de quadros e Qualidade de imagem)

Tutorial de FFmpeg na marra! - Lição 3 (Resolução, Taxa de quadros e Qualidade de imagem)

Victor Carneiro (@vitinhocarneiro)

a.k.a. Não sabe usar o FFmpeg? Vem aprender agora!!!


Lição anterior (Codecs, Containers e Rate Control)
Próxima lição (em breve)

Prefácio

Na aula passada visitamos conceitos essencias sobre codificação de vídeo - Codecs, Containers e Controle de Taxa. Mas nós ainda não vimos dois dos aspectos essenciais de codificação de vídeo em geral - os conceito de resolução e taxa de quadros.

Precisamos ver ainda o conceito de qualidade de imagem, que pode parecer trivial, mas é bastante detalhado e precisa ser analisado mais de perto - e é um dos conceitos mais importantes quando se trabalha com compressão de vídeo.

Conceitos básicos sobre imagens digitais

Uma imagem digital, nativamente, é representado por um mapa de pixels, isto é, uma matriz de pixels. O tamanho dessa matriz, isto é, a largura e a altura em pixels, define a resolução dessa imagem.

O conceito de resolução é justamente quantos detalhes nós conseguimos resolver, isto é, interpretar, extrair ou interpolar a partir dos dados da imagem. Quanto mais pixels, mais detalhes podem ser representados na imagem.

(não confunda resolução com compressão - são termos diferentes e que se complementam. Falaremos sobre isso mais à frente.)

E como isso se reflete em compressão de dados?

Primeiramente, quanto mais resolução o seu vídeo tiver, mais pixels o codec vai ter que processar pra codificar ou decodificar ele. Então, uma resolução maior resulta em uma complexidade maior, tanto pra codificação quanto pra decodificação.

Quanto à qualidade do vídeo comprimido, quanto mais resolução, mais pixels o codec vai ter que espremer em uma certa quantidade de dados. O resultado vai depender da abordagem utilizada no controle de taxa:

  • Se o controle de taxa for feito levando em conta a taxa de bits, uma resolução maior significa que o codec vai ter que espremer mais pixels dentro da quantidade definida de dados. Ou seja, ele vai quantizar mais o vídeo (jogar mais detalhes fora), o que resulta em uma qualidade de compressão menor. (da mesma forma, uma resolução menor significa que o codec vai ter menos pixels pra espremer naquela quantidade de dados, o que resulta em uma qualidade de compressão maior)
  • Já se o controle de taxa for feito usando QP constante ou CRF, a quantidade de detalhes que o codec vai jogar fora por região do vídeo é mais ou menos fixa, então a qualidade de compressão mais ou menos se mantém (ela muda um pouco por causa de questões perceptuais que discutiremos mais à frente). Mas como o codec vai ter mais pixels pra processar, isso resulta numa taxa de bits maior. (e por outro lado, uma resoluçào menor = menos pixels = menor taxa de bits)

Como eu escolho uma resolução?

Bom, isso novamente depende do propósito para o qual você quer codificar o vídeo.

Se você quer converter um vídeo para ser reproduzido em um aparelho específico, você deve procurar as especificações desse aparelho para saber as resoluções que ele suporta.

Se você quer reduzir o tamanho de um vídeo, a coisa se torna mais complicada. Você precisa encontrar um equilíbrio entre a qualidade de compressão, o tamanho/taxa de bits do arquivo e a resolução do vídeo. Veremos isso mais à frente na seção sobre qualidade de vídeo.

Se você está trabalhando com um codec que por ventura não suporta a resolução atual do vídeo, você deve escolher entre as resoluções suportadas por ele.

No resto dos casos, não existe motivo para você mudar a resolução do vídeo. Basta deixar como está.

Ok, e no FFmpeg?

Existem duas maneiras de se definir a resolução de um fluxo de vídeo no FFmpeg.

Existe o argumento de linha de comando -s, que pode ser aplicado tanto a fluxos de entrada quanto a fluxos de saída. Ele leva como argumento uma resolução de vídeo, no formato LxH - onde L é a largura em pixels, e H é a altura em pixels.

Exemplos:

-s 1280x720 - define a resolução de vídeo como 1280x720 (1280 pixels de largura por 720 pixels de altura)

-s 480x272 - define a resolução de vídeo como 480x272 (480 pixels de largura por 272 pixels de altura)

Existe também o filtro de vídeo “scale(veremos sobre filtros mais à frente - apontarei apenas que filtros de vídeo são aplicados usando o argumento de linha de comando “-vf”). A principal diferença dele é que com ele podemos definir uma das dimensões e deixar que o FFmpeg calcule a outra de modo a manter a proporção entre a largura e a altura - basta passar um número negativo no parâmetro que desejamos que o FFmpeg determine. Isso é muito útil em scripts de processamento em lotes, onde há arquivos de diferentes proporções, por exemplo.

Exemplos:

-vf "scale=1280:720" - Define a resolução do vídeo como 1280x720

-vf "scale=-2:480" - Define a resolução do vídeo como 480 linhas de altura, sendo a largura definida automaticamente como um número múltiplo de 2.

-vf "scale=-16:360" - Define a resolução do vídeo como 360 linhas de altura, sendo a largura definida automaticamente como um número múltiplo de 16.

(veremos mais à frente por quê pode ser importante usar múltiplos de 2 ou 16 na resolução de um vídeo.)

Taxa de quadros

Um vídeo é formado por uma sequência de imagens sucessivas, que são mostradas na tela com uma certa taxa - a taxa de quadros. Ela é medida em quadros por segundo, que é a quantidade dessas imagens que são exibidas em um segundo de vídeo.

A taxa de quadros afeta diretamente a fluidez do vídeo - uma taxa de quadros baixa, como 16 quadros por segundo (16 fps), resulta em um vídeo com movimento “picotado” ou “saltado”, que pode até causar enjoos em certas pessoas. Já uma taxa de quadros mais alta, como 48 ou 60 quadros por segundo (fps), resulta em um vídeo bastante flúido e com movimentos mais suaves.

Para princípios de comparação, eis algumas taxas de quadros comuns:

  • 24 quadros por segundo é a taxa usada no cinema, e é dito que um vídeo a 24 quadros por segundo tem “um feeling cinematográfico”.
  • 30 quadros por segundo é usada na maioria das câmeras de vídeo, filmagens de celulares e vídeos da Internet.
  • 48 quadros por segundo é uma taxa um tanto incomum, mas está ganhando popularidade entre algumas produções cinematográficas mais novas.
  • 60 quadros por segundo é a taxa usada na maioria das transmissões de televisão. Algumas pessoas dizem que um vídeo a 60 quadros por segundo tem “cara de novela ou telejornal”.

A taxa de quadros afeta a quantidade de dados que o codec precisa comprimir, mas de uma maneira meio atípica - na maioria dos codecs, dobrar a taxa de quadros faz a demanda de bits do codec aumentar só um pouco - cerca de ~40%, ao invés de dobrar como seria esperado. (Óbvio que isso varia de acordo com o codec e o conteúdo do vídeo. Veremos mais sobre isso em uma aula posterior.)

Como definir a taxa de quadros no FFmpeg?

No FFmpeg, usa-se o argumento -r para definir a taxa de quadros. Ele pode ser usado tanto como um argumento de entrada, quanto um argumento de saída. Ele recebe como parâmetro a taxa de quadros desejada.

Exemplos:

-r 30 - Define a taxa de quadros do vídeo para 30 quadros por segundo (30 fps).

-r 29.97 - Define a taxa de quadros do vídeo para 29.97 quadros por segundo (29.97 fps) (também conhecida como taxa de quadros do padrão NTSC).

Importante: Não é possível melhorar a fluidez de um vídeo aumentando a taxa de quadros. Aliás, o ideal é evitar ao máximo mudar a taxa de quadros de um vídeo, a não ser que seja necessário por questões de compatibilidade com codecs ou dispositivos, ou para reduzir o tamanho do vídeo.

O conceito de qualidade de vídeo

Qualidade de vídeo é algo abstrato, subjetivo, que pode variar de acordo com muitos fatores. Podemos destacar:

  • A resolução do vídeo
  • A qualidade de compressão do vídeo
  • As características do codec de vídeo em si
  • As características da tela do dispositivo sendo usado para assistir o vídeo (resolução, tamanho, contraste, reprodução de cores)
  • A percepção da própria pessoa (subjetiva) que está julgando a qualidade de vídeo

Vamos por partes em cada um desses pontos.

Resolução e qualidade de compressão

Primeiramente, é óbvio que a resolução afeta diretamente a qualidade do vídeo. Com menos pixels, temos menos detalhes sendo mostrados na tela, o que nos dá a sensação de menor qualidade.

Mas muitos não levam em conta que a qualidade de compressão também influencia na qualidade do vídeo, mas de uma maneira diferente - são os artefatos de compressão. Enquanto diminuir a resolução de um vídeo o torna borrado ou "pixelado", comprimir um vídeo demais pode ter uma série de efeitos adversos, que variam de acordo com o codec, e são exemplificados abaixo:

  • Perda de detalhes
Esquerda: original. Direita: comprimido (codec H.264).
Fonte: True Color Kodak Images - #11 (http://r0k.us/graphics/kodak/kodim11.html)


  • “Blocking” (artefatos de bloco)
Esquerda: original. Direita: comprimido (codec JPEG)
Repare nas bordas dos blocos da imagem. Também há ringing ao redor da corda.
Fonte: True Color Kodak Images - #11 (http://r0k.us/graphics/kodak/kodim11.html)


  • “Ringing” (distorções que lembram “fantasmas”)
Esquerda: original. Direita: comprimido (codec H.265)
Repare como há distorções ao redor de detalhes finos.
Fonte: True Color Kodak Images - #11 (http://r0k.us/graphics/kodak/kodim11.html)


  • Rastros (que aparecem onde há objetos em movimento, quando a qualidade está extremamente baixa)
Esquerda: original. Direita: comprimido (codec H.264)
Note como parece que há rastros "repetidos várias vezes" na imagem.
Fonte: Xiph.org - Derf's Test Media (https://media.xiph.org/video/derf/y4m/coastguard_cif.y4m)


Esses artefatos sempre variam de acordo com o codec de vídeo e os algoritmos usados por ele.

Características do dispositivo que irá tocar o vídeo

Além o que falamos acima, quando se comprime um vídeo, você deve considerar aonde ele será tocado. Por um lado, não adianta colocar um vídeo em altíssima resolução, como 1920x1080, em um celular com tela de 5 polegadas - a não ser que você tenha bastante memória pra gastar. Por outro lado, se você reduz demais a resolução de um vídeo, digamos, para 432x240, e coloca ele pra tocar em uma televisão de 50 polegadas, ele ficará horrível na tela, totalmente borrado - enquanto no mesmo celular de 5 polegadas mencionado anteriormente, a qualidade será bem assistível.

Também deve se considerar a resolução da tela - não adianta nada colocar um vídeo com resolução de 1920x1080 num dispositivo com tela de 640x480 - ele nunca vai exibir uma imagem com resolução maior que 640x480.

Em geral, telas maiores demandam resoluções de vídeo maiores. A distância de onde a pessoa está da tela também influencia nesse quesito - a distâncias maiores, não é necessária tanta resolução.

Subjetividade

A percepção de qualidade pode variar muito de pessoa pra pessoa. Cada indivíduo tem sua percepçã0 visual, e certas pessoas podem perceber detalhes ou artefatos que outras pessoas não percebem.

Exemplo pessoal: Muitas pessoas consideram que os vídeos do Youtube são de boa qualidade. Mas pessoalmente, eu sinto que certos vídeos, especialmente vídeos mais complexos, como gameplays, sofrem muita compressão e perdem muita qualidade ao serem processados por ele. (isso acontece pois em serviços de streaming, é necessário ter uma taxa de bits máxima para o vídeo - e no caso do Youtube, ela não é suficiente pra oferecer boa qualidade em certos casos)

Balanceamento da resolução e da qualidade de compressão

E finalmente, quando se comprime um vídeo, é necessário saber balancear a resolução com a qualidade de compressão. Não adianta nada ter um vídeo em alta resolução com a qualidade de compressão muito baixa:

Fonte: Big Buck Bunny - Blender Foundation (https://peach.blender.org/download/)


Por outro lado, não adianta nada definir uma qualidade de compressão desnecessariamente alta e deixar a resolução baixa demais:

Fonte: Big Buck Bunny - Blender Foundation (https://peach.blender.org/download/)


Saber balancear a qualidade e a resolução de um vídeo é uma habilidade que só vem com a prática. Por isso é importante praticar muito!

Conclusão

Nós visitamos mais dois aspectos importantes da codificação de vídeo e falamos de um dos termos mais importantes quando se trabalha com compressão de vídeo - a qualidade de vídeo.

Novamente, eu reforço aqui a necessidade de se praticar o uso do FFmpeg. Como hoje falamos de qualidade de vídeo, proponho o seguinte exercício:

  • Consiga um vídeo de ótima qualidade. De preferência em Full HD (1920x1080). E o ideal é que seja curto, pra não demorar a codificar.
  • Pegue vários dispositivos pela sua casa que reproduzam vídeo, com diferentes tamanhos e resoluções de tela. Televisões, DVD player portátil, celulares, MP4 player, tablet, notebook, qualquer coisa vale.
  • Comprima o vídeo para esses dispositivos duas vezes, tentando obter:
  1. No primeiro vídeo, uma qualidade aceitável com o menor tamanho possível.
  2. No segundo vídeo, uma qualidade boa com um tamanho relativamente reduzido.
  • Atente-se para o que foi dito na seção "O conceito de Qualidade de Vídeo". Qual resolução mínima é necessária pra se obter uma qualidade aceitável em um certo dispositivo? Será que não é resolução demais? Não tenha medo de experimentar com diferentes resoluções, métodos de controle de taxa, qualidades de compressão... é experimentando que você pegará o jeito.

Lição 2 - Codecs, Containerws e Rate Control
Lição 4 - em breve!

Dúvidas? Perguntas?

Caso você queira me perguntar algo, tirar uma dúvida, fazer um elogio ou uma crítica, pode me contatar pelos canais abaixo:

E-mail: victorcarneiro2009@gmail.com
Telegram: @vitinhocarneiro

Por favor, caso você mande e-mail, peço que você identifique claramente no assunto da mensagem que está falando desse tutorial, para que eu possa identificar seu e-mail mais facilmente e te responder rápido.

Índice

Lição 1 - O Básico do Básico
Lição 2 - Codecs, Containers e Rate Control
Lição 3 - Resolução, Taxa de quadros e Qualidade de Imagem
Lição 4 - em breve!

Por Victor Carneiro - 09/03/2017. Revisado em 12/03/2017. Conteúdo licenciado sob a licença MIT - disponível aqui.

Report Page