Chegou a hora de substituir GIFs por vídeos AV1

Chegou a hora de substituir GIFs por vídeos AV1

Agora é 2019, e já está na hora de tomarmos uma decisão sobre o GIF (não, não é sobre essa decisão! Aqui nunca vamos chegar a um acordo! — estamos falando sobre a pronúncia em inglês, que não é relevante para nós — nota do tradutor.). Os GIFs ocupam uma enorme quantidade de espaço (geralmente vários megabytes!), o que, se você é um desenvolvedor web, vai totalmente contra seus desejos! Como desenvolvedor web, você quer minimizar o que os usuários precisam baixar para que o site carregue rapidamente. Pelo mesmo motivo, você minimiza o JavaScript, otimiza PNG, JPEG, e às vezes converte JPEG para WebP. Mas o que fazer com o velho GIF?

Para onde estamos indo, não precisaremos de GIFs!

Se seu objetivo é melhorar a velocidade de carregamento do site, então você deve se livrar dos GIFs! Mas como fazer imagens animadas então? A resposta é vídeo. E na maioria dos casos, você obterá qualidade melhor e uma economia de espaço de 50-90%! Na vida, a maioria das coisas tem seus prós e contras. Quando você substitui o GIF por vídeo, geralmente não há desvantagens.

Fora todos os GIFs!

Felizmente, substituir GIFs por vídeos tem sido uma prática comum nos últimos anos, então todas as ferramentas necessárias já estão em uso. Neste post, não vou reinventar a roda, mas apenas melhorar um pouco as soluções existentes. Então, aqui está a essência:

  1. Pegue o GIF e converta-o para vídeo
  2. Codifique o vídeo usando H.264 ou VP9, ou seja, comprima-o e empacote-o em um contêiner MP4 ou WebM
  3. Substitua <img> o GIF animado por um clipe
  4. Ative a reprodução automática sem som e repita, para conseguir o efeito do GIF

O Google tem uma boa documentação descrevendo o processo.

Agora é 2019

Agora é 2019. O progresso está avançando, e devemos acompanhá-lo. Até agora, tivemos duas opções de codecs que são amplamente suportadas em todos os navegadores e ferramentas de codificação de vídeo:

  1. H.264 — que surgiu em 2003 e é amplamente utilizado hoje
  2. VP9 — que surgiu em 2013 e conseguiu uma melhoria na compressão de quase 50% em comparação com o H.264, embora como se menciona aqui nem tudo é tão simples

Nota: embora o padrão H.265 — a próxima versão do H.264 e capaz de competir com o VP9, eu não o considero devido ao fraco suporte nos navegadores, conforme demonstrado na página. https://caniuse.com/#feat=hevc. Os custos de licenciamento são a principal razão pela qual o H.265 não se tornou tão popular quanto o H.264 e pela qual o consórcio Alliance of Open Media está trabalhando com o codec sem royalties — com o AV1.

Lembre-se de que nosso objetivo é reduzir os enormes GIFs ao menor tamanho possível para acelerar o carregamento. Este teria sido um ano estranho em 2019 se não tivéssemos um novo padrão para compressão de vídeo. Mas temos, e ele se chama AV1. Com o AV1, podemos alcançar uma melhoria de cerca de 30% na compressão em comparação com o VP9. Maravilhoso! 🙂

AV1 está à sua disposição desde 2019!

Em desktops

Recentemente, o suporte para decodificação de vídeo AV1 foi adicionado nas versões desktop do Google Chrome 70 e Mozilla Firefox 65. Neste momento, o suporte no Firefox está apresentando falhas e pode causar panes, mas a situação deve mudar com a adição do decodificador dav1d já no Firefox 67 (já foi lançado, e o suporte foi adicionado — nota do tradutor.). Para mais detalhes sobre a nova versão, leia — dav1d 0.3.0 lançamento: ainda mais rápido!

Em smartphones

Para smartphones, o suporte de hardware atualmente não existe devido à falta de decodificadores adequados. É possível realizar a decodificação por software, mas isso resultará em um aumento no consumo da bateria. Os primeiros SOC móveis com suporte para decodificação de hardware AV1 aparecerão em 2020.

E aqui os leitores do artigo pensam: "então, se os dispositivos móveis ainda não suportam bem, por que usar o AV1?"

O AV1 é um codec relativamente novo, e estamos apenas no início de sua adoção. Pense neste artigo como uma fase de "enquanto você se prepara, a galera vem atrás". O suporte em desktops já vai acelerar sites para uma parte do público. E os codecs antigos podem ser usados como uma opção de falha quando o AV1 não é suportado no dispositivo alvo. À medida que os usuários migram para dispositivos com suporte ao AV1, tudo já estará pronto. Para isso, precisamos criar uma tag de vídeo, como mostrado abaixo, que permitirá ao navegador escolher o formato preferido — AV1 ->> VP9 ->> H.264. Agora, se o usuário tiver um dispositivo ou navegador muito antigo que não suporta vídeo de forma alguma (o que é bastante improvável com H264), simplesmente verá um GIF.

<video style="display:block; margin: 0 auto;" autoplay loop muted playsinline poster="RollingCredits.jpg">
  <source src="media/RollingCredits.av1.mp4" type="video/mp4">
  <source src="media/RollingCredits.vp9.webm" type="video/webm">
  <source src="media/RollingCredits.x264.mp4" type="video/mp4">
  <img src="media/RollingCredits.gif">
</video>

Criando AV1

Criar vídeo em AV1 não é difícil. Baixe a versão mais recente do ffmpeg para o seu sistema aqui. e utilize os comandos abaixo. Usamos 2 passagens para atingir a taxa de bits alvo. Para isso, executaremos o ffmpeg duas vezes. Na primeira vez, gravaremos o resultado em um arquivo inexistente. Isso criará um log que será necessário para a segunda execução do ffmpeg.

# Linux or Mac
## Проход 1
ffmpeg -i input.mp4 -c:v libaom-av1 -b:v 200k -filter:v scale=720:-1 -strict experimental -cpu-used 1 -tile-columns 2 -row-mt 1 -threads 8 -pass 1 -f mp4 /dev/null && 
## Проход 2
ffmpeg -i input.mp4 -pix_fmt yuv420p -movflags faststart -c:v libaom-av1 -b:v 200k -filter:v scale=720:-1 -strict experimental -cpu-used 1 -tile-columns 2 -row-mt 1 -threads 8 -pass 2 output.mp4

# Windows
## Проход 1
ffmpeg.exe -i input.mp4 -c:v libaom-av1 -b:v 200k -filter:v scale=720:-1 -strict experimental -cpu-used 1 -tile-columns 2 -row-mt 1 -threads 8 -pass 1 -f mp4 NUL && ^
## Проход 2
ffmpeg.exe -i input.mp4 -pix_fmt yuv420p -movflags faststart -c:v libaom-av1 -b:v 200k -filter:v scale=720:-1 -strict experimental -cpu-used 1 -tile-columns 2 -row-mt 1 -threads 8 -pass 2 output.mp4

Aqui está a descrição dos parâmetros:

-i - Arquivo de entrada.

-pix_fmt - Formato 4:2:0 para selecionar informações de crominância no vídeo. Existem muitos outros formatos possíveis, mas o 4:2:0 é o mais compatível.

-c:v - Qual codec usar, neste caso - AV1.<br />
-b:v – A taxa de bits média que queremos alcançar.

-filter:v scale - O filtro de escala do ffmpeg é usado para reduzir a resolução do vídeo. Definimos X:-1, o que instrui o ffmpeg a reduzir a largura para X, mantendo a proporção da tela.

-strict experimental - Deve ser especificado, pois o AV1 é um codec relativamente novo.

-cpu-used - Parâmetro mal nomeado, que na verdade é usado para escolher o nível de qualidade do vídeo. Valores possíveis de 0 a 4. Quanto menor o valor, melhor a qualidade e, consequentemente, mais tempo levará a codificação.

-tile-columns - Para usar múltiplas threads. Instrui o AV1 a dividir o vídeo em colunas separadas, que podem ser recodificadas independentemente para melhor utilização da CPU.

-row-mt – Similar ao parâmetro anterior, mas também divide em linhas dentro das colunas.

-threads - Número de threads.

-pass - Qual passagem está sendo realizada atualmente.

-f - Usado apenas na primeira passagem. Especifica o formato do arquivo de saída, ou seja, MP4 neste caso.

-movflags faststart - Ativamos o início rápido do vídeo, movendo parte dos dados para o início do arquivo. Isso permitirá iniciar a reprodução antes que o arquivo esteja completamente carregado.

Criando GIF

Para criar o GIF, usei o comando abaixo. Para reduzir o tamanho, dimensionei o GIF para 720px de largura e 12 fps, ao invés dos 24 fps do vídeo original.

./ffmpeg -i /mnt/c/Users/kasing/Desktop/ToS.mov -ss 00:08:08 -t 12
-filter_complex "[0:v] fps=12,scale=720:-1" -y scene2.gif

Resultados dos testes

É melhor ver uma vez do que ler cem, não é? Vamos garantir que o AV1 seja a escolha certa para nossos objetivos. Peguei um vídeo gratuito Tears Of Steel, disponível aqui https://mango.blender.org/, e o converti, usando uma taxa de bits aproximadamente igual para os codecs AV1, VP9, H.264. Os resultados estão abaixo, assim você pode compará-los por conta própria.

Nota 1: Se o arquivo abaixo não carregar, pode ser hora de atualizar seu navegador. Eu recomendaria um navegador baseado em Chromium, como Chrome, Vivaldi, Brave ou Opera. Aqui estão as informações mais recentes sobre suporte ao AV1 https://caniuse.com/#feat=av1

Nota 2: Para o Firefox 66 no Linux, você precisará ativar o flag media.av1.enabled como valor verdadeiro em about:config

Nota 3: Decidi não incluir os GIFs normais abaixo devido ao seu grande tamanho e ao volume de dados que poderia ser necessário para carregar esta página! (O que seria irônico, já que esta página é sobre a redução do uso de dados na página :)). Mas você pode visualizar os GIFs finais aqui https://github.com/singhkays/its-time-replace-gifs-with-av1-video/blob/master/GIFs

Nota do tradutor: O Habr não permite habilitar a reprodução automática e a repetição do arquivo, então só será possível avaliar a qualidade. Você pode ver como seriam as ‘imagens animadas’ ao vivo em artigo original.

Cena 1 @ 200 Kbps

Aqui há muito movimento, o que é especialmente sensível em baixas taxas de bits. É imediatamente evidente como o H.264 é ruim nessa taxa de bits, com os quadrados visíveis. O VP9 melhora um pouco a situação, mas os quadrados ainda são visíveis. O AV1 claramente se sai melhor, apresentando mais nitidez.

H.264

VP9

AV1

Cena 2 @ 200 Kbps

Aqui há muito conteúdo CGI semitransparente. Os resultados não diferem tanto quanto na última vez, mas no geral o AV1 parece melhor.

H.264

VP9

AV1

Cena 3 @ 100 Kbps

Nesta cena, reduzimos a taxa de bits para 100 Kbps e os resultados refletem isso. O AV1 mantém a liderança mesmo em baixas taxas de bits!

H.264

VP9

AV1

A cereja do bolo

Para concluir o artigo, sentindo a quantidade de tráfego economizado em comparação com os GIFs — o tamanho total de todos os vídeos acima é… 1,62 MB!! Correto. Algo como 1.708.032 bytes! Para comparação, aqui está o tamanho do vídeo GIF e AV1 para cada uma das cenas.

GIF
AV1

Cena 1
11,7 MB
0,33 MB

Cena 2
7,27 MB
0,18 MB

Cena 3
5,62 MB
0,088 MB

Simplesmente impressionante! Não é?

Nota: Os tamanhos dos arquivos VP9 e H264 não são mencionados, pois praticamente não diferem do AV1 devido ao uso da mesma taxa de bits. Seria redundante adicionar mais duas colunas com tamanhos iguais, só para enfatizar que esses codecs oferecem qualidade muito melhor que o GIF com tamanhos de arquivo muito menores.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster