segunda-feira, 7 de maio de 2012

Duplicando o áudio de um vídeo

Na dica sobre nomalização de áudio de vídeos já embutimos recursos para duplicar o áudio de arquivos onde a trilha estéreo tem um dos lados mudos, só que agora retornamos ao assunto para tratar exclusivamente este problema e sem a utilização de programas externos.

ffmpeg -f lavfi -i "amovie=arquivo_original.flv,pan=stereo: c0=c1: c1=c1" -i arquivo_original.flv -map 0:0 -map 1:0 -vcodec copy -acodec libfaac arquivo_final.mp4

Para entender melhor a sintaxe:

A primeira parte do comando causa bastante estranheza, mas tem uma explicação. -f lavfi -i "amovie=arquivo_original.flv,pan=stereo: c0=c1: c1=c1" indica para o FFMPEG que o arquivo de entrada na verdade é um filtro do libav e logo em seguida passa as opções para o mesmo. Neste caso é a biblioteca que abre o arquivo e não o FFMPEG em si, por isso a sintaxe um pouco estranha. pan=stereo: c0=c1: c1=c1 indica como será o balanceamento do áudio, onde c0 é o canal esquerdo e c1 é o canal direito. Como queremos que o canal direito seja usado nos dois lados do áudio indicamos c0=c1 e c1=c1.

O resto é familiar. -i arquivo_original.flv abre o segundo arquivo que servirá como fonte de vídeo, -map 0:0 -map 1:0 aponta qual stream será o de vídeo e o de áudio, -vcodec copy -acodec libfaac os codecs utilizados e por fim o nome do arquivo final.

sábado, 5 de maio de 2012

De FLV para MP4 sem recompressão

Aprendemos no último post a diferença entre codec e wrapper. Agora vamos tirar proveito disso:

É uma situação bastante corriqueira querer salvar um vídeo do YouTube ou outro site de compartilhamento de vídeos para ver em outro dispositivo. Muitas vezes os aplicativos de download de vídeos não fazem a conversão de formatos ou o fazem piorando ainda mais a qualidade do arquivo que na maioria das vezes já não é bom.

O FFMPEG resolve esse problema. Se o arquivo FLV foi codificado em H264/AAC (você pode ver esta informação pelo VLC em "Informações da Mídia > Detalhes do codec") basta executar:

ffmpeg -i arquivo.flv -vcodec copy -acodec copy arquivo_final.mp4

Pronto, você já tem um arquivo MP4, compatível com uma grande variedade de dispositivos (iOS por exemplo) sem precisar recodificar o arquivo e sem perda nenhuma de qualidade nesse processo.

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.