1

Параметр max_volume в ffmpeg возвращает положительные значения или он максимально равен 0?

Я вижу несколько файлов, возвращающих 0 для максимальной громкости, но уровни громкости не совпадают. У некоторых есть оглушительные вспышки, которые я пытаюсь обнаружить и удалить.

Пример вывода 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

Когда используешь:

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

... или ffmpeg не тот инструмент для этого? У меня есть mp4 видео файлы, закодированные с помощью кодека h264.

Благодарю.

1 ответ1

2

"max_volume" не может быть больше 0.

Согласно libavfilter/af_volumedetect.c:

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

Таким образом, чтобы вернуть положительное значение по запросу, logdb должен вернуть отрицательное число. Вот 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;
}

Если "d" больше 1, "logdb" вернет отрицательное значение:

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

Чтобы получить "d", более 1 "max_volume" должно быть больше 0x8000. Может ли max_volume быть больше 0x8000? Нет, не может:

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

Если вы не хотите перекодировать файл, вы можете использовать AacGain, если у файла есть аудиопоток:

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

Или, если вы просто хотите проанализировать:

aacgain -s s file

Информация:

-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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .