ffmpeg max_volume Decibéis Positivos?

1

O parâmetro max_volume do ffmpeg retorna valores positivos ou está no máximo em 0 ?

Estou vendo vários arquivos retornando 0 para o volume máximo, mas os níveis de volume não são os mesmos. Alguns têm blips ensurdecedores que estou tentando detectar e remover.

Exemplo de saída do ffmpeg:

frame=19323 fps=1143 q=0.0 Lsize=N/A time=00:12:52.92 bitrate=N/A    
video:1812kB audio:144184kB subtitle:0 global headers:0kB muxing overhead -100.000015%
n_samples: 73822208
[Parsed_volumedetect_0 @ 0x7f77e0] mean_volume: -22.6 dB
[Parsed_volumedetect_0 @ 0x7f77e0] max_volume: 0.0 dB
[Parsed_volumedetect_0 @ 0x7f77e0] histogram_0db: 8169
[Parsed_volumedetect_0 @ 0x7f77e0] histogram_1db: 388
[Parsed_volumedetect_0 @ 0x7f77e0] histogram_2db: 531
[Parsed_volumedetect_0 @ 0x7f77e0] histogram_3db: 2389
[Parsed_volumedetect_0 @ 0x7f77e0] histogram_4db: 5039
[Parsed_volumedetect_0 @ 0x7f77e0] histogram_5db: 12128
[Parsed_volumedetect_0 @ 0x7f77e0] histogram_6db: 24978
[Parsed_volumedetect_0 @ 0x7f77e0] histogram_7db: 48077

Ao usar:

ffmpeg -i /var/www/CDNFiles/Video_1Web.mp4 -af "volumedetect" -f null /dev/null/ 2>&1

... ou é ffmpeg a ferramenta errada para isso? Tenho arquivos de vídeos mp4 codificados com o codec h264.

Obrigado.

    
por chris85 31.03.2017 / 17:27

1 resposta

2

"max_volume" não pode ser maior que 0.

De acordo com libavfilter / af_volumedetect.c :

av_log(ctx, AV_LOG_INFO, "max_volume: %.1f dB\n", -logdb(max_volume * max_volume));

Portanto, para retornar positivo conforme você solicita, "logdb" precisa retornar um valor negativo número. Aqui está o logdb:

#define MAX_DB 91

static inline double logdb(uint64_t v)
{
    double d = v / (double)(0x8000 * 0x8000);
    if (!v)
        return MAX_DB;
    return -log10(d) * 10;
}

Se "d" for maior que 1, "logdb" retornará negativo:

$ awk 'BEGIN {print -log(2) / log(10) * 10}'
-3.0103

Para obter "d", acima de 1, "max_volume" precisa ser maior que 0x8000. pode "max_volume" é maior que 0x8000? Não, não pode:

max_volume = 0x8000;
while (max_volume > 0 && !vd->histogram[0x8000 + max_volume] &&
                         !vd->histogram[0x8000 - max_volume])
    max_volume--;

Se você não quiser codificar novamente o arquivo, poderá usar o AacGain enquanto arquivo tem um fluxo de áudio:

aacgain -k -r -s s -m 10 file

Ou se você quiser apenas analisar:

aacgain -s s file

Informação:

-k - automatically lower Track/Album gain to not clip audio
-r - apply Track gain automatically (all files set to equal loudness)
-s s - skip (ignore) stored tag info (do not read or write tags)
-m <i> - modify suggested gain by integer i
    
por 14.04.2017 / 01:26