"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