Normalizando áudio de um filme

De tempos em tempos eu “alugo” filmes da Locadora do Paulo Coelho e topo com o áudio muito baixinho. Isso acontece, frequentemente, com filmes ripados de DVDs, onde o ripador não se importa em melhorar a qualidade do que está distribuindo.

Uma maneira de “normalizar” o áudio de um filme — ou seja, aumentar o volume ao máximo sem “cortar” os picos do áudio — e sem usar ferramentas gráficas, é usando o ffmpeg e um outro softwarezinho: mp3gain

Primeiro, extraia o áudio do filme:

$ ffmpeg -i filme.mp4 -ac 2 audio.mp3

O parâmetro -ac é importante porque o mp3gain não lida com sons com múltiplos canais (acho que somente stereo e mono, mas posso estar errado nisso!). Como já expliquei em post anterior, isso não é importante para mim…

Depois, normalize o áudio assim:

$ mp3gain audio.mp3

Use o parâmetro -h sem o nome do arquivo para ver outras opções. Ou consulte a manpage.

O próximo passo deve ser feito em duas partes. Primeiro temos que ver como o ffmpeg mapeará as entradas usando:

$ ffmpeg -i filme.avi -i audio.mp3

Provavelmente ele colocará o vídeo como Input #0 e o áudio como Input #1. No caso do vídeo, provavelmente o stream de vídeo será 0.0 e o de áudio 0.1:

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2012-05-30 18:11:37
  Duration: 00:01:52.76, start: 0.000000, bitrate: 562 kb/s
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 640x360, 464 kb/s, 25 fps, 25 tbr, 50 tbn, 50 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, s16, 95 kb/s
    Metadata:
      creation_time   : 2012-05-30 18:11:37
      handler_name    : 
[mp3 @ 0xb3f620] max_analyze_duration 5000000 reached at 5015510
Input #1, mp3, from 'audio.mp3':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2012-05-30 18:11:37
    encoder         : Lavf53.32.100
  Duration: 00:01:52.79, start: 0.000000, bitrate: 128 kb/s
    Stream #1:0: Audio: mp3, 44100 Hz, stereo, s16, 128 kb/s

Estamos prontos para reintegrar o novo áudio no vídeo:

$ ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a ac3 -sameq -map 0:0 -map 1:0 video2.mp4

Note os parâmetros -c:a e -map. O -c:a recodifica o áudio para ac3 (meu preferido) e os -map indicam quais streams serão copiados para o vídeo2.mp4. No caso, deixei o strem 0:1 (o áudio original) de fora.

Ok, provavelmente existem filtros de áudio no ffmpeg que fazem isso pra vocẽ, mas, por enquanto, ainda são meio complicados para que eu possa usá-los… dai o macete.

Update: Um possível script para fazer a bagaça toda mostrada acima…

#!/bin/bash

if [ "$1x" == "x" ]; then
  echo "audionormalize \<inputvideofile\>"
  exit
fi

tmpaudio="$(echo $1 | sed 's/\.[^.]*$/.$$$.mp3/')"
tmpvideo="$(echo $1 | sed 's/\.\([^.]*\)$/.$$$.\1/')"

# Isso é crítico! Não me lembrei do comando para estirpar espaços no início da linha!
videomap=$(ffmpeg -i "$1" 2>&1 | grep "Stream" | grep "Video:" | cut -c5- | cut -d" " -f2 | cut -c2-4)

ffmpeg -y -i "$1" -ac 2 "$tmpaudio"
mp3gain "$tmpaudio"
ffmpeg -y -i "$1" -i "$tmpaudio" -c:v copy -c:a ac3 -sameq -map $videomap -map 1:0 "$tmpvideo" && \
  rm "$1" "$tmpaudio" && mv "$tmpvideo" "$1"
Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s