terça-feira, 24 de abril de 2012

Noções básicas: Codec e wrapper

Para dominar bem o uso do FFMPEG é preciso antes deixar claro alguns pontos que a maioria das pessoas fazem confusão. Um dos principais é a diferença entre wrapper e codec. É muito comum uma pessoa falar "preciso de um vídeo em formato AVI" e depois ficar confuso pelo vídeo não funcionar no player ou dispositivo utilizado. Vamos a explicação:

Um vídeo e um áudio carregam quantidades enormes de informação digital. Para fazerem parte do nosso dia a dia precisam ser comprimidos. Os processos e técnicas utilizadas para atingir esse objetivo determinam o codec usado. Codec = codificação. Aí entram o h264, DivX, MP3, Windows Media...

Já AVI, tal como FLV, MKV e muitos outros que geralmente emprestam o nome ao conhecimento popular são "wrappers", ou seja, o que a própria tradução diz: Empacotadores. Eles unem vários streams (fluxos) de áudio e vídeo, em diferentes codecs, em um arquivo baixável, um streaming, uma transmissão de TV digital ou TV a cabo, entre outros.

Fazendo uma analogia com o mundo analógico (rá!) o wrapper seria a diagramação do livro, a quantidade de palavras por página, a existência ou não de notas no rodapé das páginas, etc... e o codec a língua em que o livro está escrito.

Portanto, voltando ao exemplo inicial, dizer que um arquivo é AVI não indica muita coisa além da forma que ele é organizado entre stream de áudio e vídeo. É preciso saber os codecs que serão usados dependendo quais são suportados pelo dispositivo-alvo. DivX? h264? Indeo? DV? Tudo depende do objetivo buscado.

Conceito esclarecido? Então até o próximo post, onde baseado nesses conceitos vamos ver como é passar um vídeo Flash FLV baixado do YouTube ser tranformado em MP4 sem perda de qualidade numa recompressão.

domingo, 15 de abril de 2012

Normalizando o áudio do vídeo sem recomprimir a imagem

Nem todo mundo tem muito cuidado técnico ao postar vídeos na internet, nem mesmo as grande emissoras. Faz algum tempo baixei alguns vídeos de um site com dois problemas: Áudio muito baixo e em apenas um lado dos canais estéreo. Mas como corrigir isso sem fazer com que a imagem seja recomprimida quadriculando ainda mais? Esse problema pode ser solucionado através do ffmpeg e um outro programa adicional, o SoX (disponível em http://sox.sourceforge.net/ ou através do Homebrew para usuários do Mac OS X)

O procedimento explicado:

Uso o ffmpeg para extrair do vídeo (um MP4) apenas o áudio em formato WAV, já mixando ele em mono. Depois com o SoX calculo e aplico a normalização no nível de volume e em seguida uso o ffmpeg pra unir a faixa de vídeo original com o arquivo gerado pelo SoX, ao mesmo tempo comprindo para AAC, que o formato MP4 exige.

O código:

Em formato de script do Bash o procedimento fica da seguinte forma:

#!/bin/sh
x=$1
file=${x%.*}
ffmpeg -i "$x" -vn -ac 1 "$file.wav"
sox "$file.wav" "$file-2.wav" vol `sox "$file.wav" -n stat -v 2>&1`
ffmpeg -i "$x" -i "$file-2.wav" -map 0:0 -map 1:0 -vcodec copy -acodec libfaac -ab 128k "$file-2.mp4"
rm "$file-2.wav" "$file.wav"

Feito isso basta apenas chamar pelo Terminal o seu script .sh seguido pelo caminho do arquivo a ser corrigido (não esqueça de atribuir permissões de execução a ele, ou seja, "chmod +x script.sh"). O arquivo corrigido será salvo na mesma pasta do original com o mesmo nome do original acrescentando um "2" no final.

Trocando em miúdos o código:

Agora vamos entender o para que serve cada parte do código:


ffmpeg -i "$x" -vn -ac 1 "$file.wav"
 -i - Indica o arquivo de entrada

-vn - Exclui a faixa de vídeo

-ac 1 - Indica que o arquivo de saída será mono (1 = mono / 2 = estéreo)

sox "$file.wav" "$file-2.wav" vol `sox "$file.wav" -n stat -v 2>&1`
Neste caso usamos um recurso do Bash de executar um comando dentro de outro. Entre os apóstrofes é executado o SoX com o comando -n stat que realiza uma análise do arquivo, inclusive o nível de volume a se ajustado. 2>&1 seleciona e retorna este resultado. Assim, o comando vol ajusta o arquivo de entrada $file.wav e salva como $file-2.wav

ffmpeg -i "$x" -i "$file-2.wav" -map 0:0 -map 1:0 -vcodec copy -acodec libfaac -ab 128k "$file-2.mp4"
Finalmente combinaremos todos os elementos para o arquivo final. Dois comandos -i são realizados, um lendo o vídeo original e outro para o áudio corrigido. Os comandos -map atribuem para estes arquivos de entrada qual será o vídeo e qual será o áudio. -vcodec copy indica que a faixa de vídeo será escrita idêntica a original, sem recompressão e -acodec libfaaac -ab 128k indica que o som WAV será comprimido no formato AAC e em 128kbps. E por último o nome do arquivo de saída. Pronto!

O tal do FFMPEG: Onde baixa? Comofas?

Começando do princípio: Se eu não tenho o FFMPEG, onde posso conseguir?

Se você está no Windows, você pode começar usando os binários (já compilados) fornecidos pelo http://ffmpeg.zeranoe.com/ Apesar de não terem todas as bibliotecas necessárias para lidar com certos formatos é possível realizar a maioria das operações necessárias.

No Mac OS X você pode consegui-lo através dos serviços como o MacPorts ou Homebrew. Eu utilizo o segundo e recomendo a todos que optarem pelo Homebrew instalem utilizando as flags "--with-tools --with-ffplay --enable-librtmp". São muito úteis para em vários testes.

No Linux grande parte das distribuições já vem com o ffmpeg. Caso ele não venha incluído existem vários caminhos para instalá-lo dependendo da distribuição que você usa. O Google pode te ajudar bastante nesse caminho (e neste momento melhor que eu :P)

----

A instalação do FFMPEG pode ser muito tranquila ou quase um pesadelo, dependendo de muitas coisas. Este é apenas um artigo de introdução. Caso você tenha algum problema ou solução, compartilhe conosco. Assim poderemos expandir este post e ajudar mais pessoas.