Não há como executar automaticamente um filtro loudnorm de duas passagens com apenas ffmpeg, mas você pode usar o ffmpeg-normalize
- Primeira execução:
ffmpeg-normalize
no vídeo original, copiando o fluxo de vídeo original. - Segunda execução: x264-codificação (multithreaded) do arquivo de áudio normalizado ou dos fluxos de vídeo do arquivo original.
O que você deseja alcançar simplesmente não pode ser feito apenas pelo ffmpeg. Você precisa programar sua própria solução, especialmente se você quiser lidar com vários arquivos em paralelo. Isso certamente aceleraria o processo, mesmo que uma única execução do ffmpeg esteja usando apenas um thread.
Como ponto de partida, há também um script Ruby mais simples no repositório do FFmpeg . Ele executa dois passos barulhentos, lendo as estatísticas da primeira execução. Você pode ser capaz de modificá-lo para executar adicionalmente a codificação x264 de duas passagens com multithreading, ou seja, executar o primeiro x264 pass na primeira execução, o segundo na segunda execução:
Primeira passagem:
ffmpeg -y -i $FILE -c:v libx264 -b:v 4000k -pass 1 -filter:a loudnorm=print_format=json -f mkv /dev/null
Leia as estatísticas JSON da loudnorm
output (por exemplo, usando o analisador JSON do Python ou qualquer outra ferramenta como grep
ou awk
) e execute a segunda passagem:
ffmpeg -i $FILE -c:v libx264 -b:v 4000k -pass 2 -filter:a loudnorm=linear=true:measured_I=$input_i:measured_LRA=$input_lra:measured_tp=$input_tp:measured_thresh=$input_thresh -c:a aac -b:a 256k $FILE.mkv
Em que $input_i
, $input_lra
, $input_tp
, $input_thresh
são os valores lidos da primeira passagem.