Как нормализовать звук с помощью ffmpeg?

Я хочу, чтобы самый громкий пиковый звук в клипе был таким громким, как позволяет кодек, а затем каждый другой звук усиливался соответственно.

каков практический пример, чтобы выполнить это с помощью ffmpeg?

18
задан Sathya
08.04.2023 20:14 Количество просмотров материала 3267
Распечатать страницу

3 ответа

Вариант 1: встроенные фильтры нормализации

текущий ffmpeg имеет два фильтра, которые могут быть непосредственно использованы для нормализации-хотя они уже достаточно продвинуты, поэтому они не просто применяют усиление для достижения пикового уровня. Вот они какие:

  • loudnorm: громкость нормализации, по данным ЕВС R128. Вы можете установить интегрированную цель громкости, целевой диапазон громкости, или максимальный истинный пик. Это рекомендуется для публикации аудио и видео и оно использованы передатчиками во всем мире.
  • dynaudnorm: "интеллектуальная" нормализация громкости без обрезки, которая динамически применяет нормализацию к оконным частям файла. Это может изменить характеристики звука, поэтому его следует применять с осторожностью.

и volume фильтр может использоваться для выполнения простой регулировки громкости. Смотрите Манипуляция Громкостью Звука запись wiki для более.

loudnorm фильтр может использоваться с одним проходом, но рекомендуется выполнять два прохода, что обеспечивает более точную линейную нормализацию. Это немного трудно автоматизировать. Также, если вы хотите "простой" РМС или пик нормализация к 0 dBFS в режиме (или любой другой цели), Читать далее.


Вариант 2: Используйте ffmpeg-normalize tool

я создал программа Python для нормализации медиа-файлов,доступно на PyPi как ну. Вы просто:

  • скачать ffmpeg (выбрать статический построить, версии 3.1 или выше)
  • поставить ffmpeg исполняемый файл в $PATH либо добавив его, например,/usr/local/bin или добавление каталога в $PATH
  • Run pip install ffmpeg-normalize
  • использовать ffmpeg-normalize

например:

ffmpeg-normalize input.mp4 -o output.mp4 -c:a aac -b:a 192k

или, чтобы просто пакетно нормализовать ряд звуковые файлы и записать их в виде несжатого WAV в выходную папку:

ffmpeg-normalize *.m4a -of /path/to/outputFolder -ext wav

инструмент поддерживает EBU R128 (по умолчанию), RMS и peak. Взгляните на ffmpeg-normalize -h для больше вариантов и проверки README для некоторые примеры.

также, он поддерживает перекодирование с другими кодировщиками (например, AAC или MP3), или автоматическое слияние аудио обратно в видео.


Вариант 3: нормализация звука вручную ffmpeg

в ffmpeg вы можете использовать volume фильтр для изменения громкости трека. Убедитесь, что вы скачать свежую версию программы.

данное руководство предназначено для пик нормализация, что означает, что самая громкая часть в файле будет сидеть на 0 дБ вместо чего-то ниже. Существует также нормализация на основе RMS, которая пытается сделать в среднем громкость одинаковая для нескольких файлов. Чтобы сделать это, не попробуйте нажать максимальную громкость до 0 дБ, но среднюю громкость до уровня дБ по выбору (например, -26 дБ).

узнайте выигрыш применить

во-первых, вам нужно проанализировать звуковой поток для максимальной громкости, чтобы увидеть, если нормализация будет даже погасить:

ffmpeg -i video.avi -af "volumedetect" -vn -sn -dn -f null /dev/null

заменить /dev/null С NUL на Windows.

The -vn,-sn и -dn аргументы предписывают ffmpeg игнорируйте незвуковые потоки во время этого анализа. Это значительно ускоряет анализ.

это выведет что-то вроде следующего:

[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] mean_volume: -16.0 dB
[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] max_volume: -5.0 dB
[Parsed_volumedetect_0 @ 0x7f8ba1c121a0] histogram_0db: 87861

как вы можете видеть, наш максимальный объем -5.0 дБ, поэтому мы можем применить усиление 5 дБ. Если вы получаете значение 0 дБ, то вам не нужно нормализовать аудио.

применить фильтр объем:

теперь применяем volume фильтр аудио файл. Обратите внимание, что применение фильтра значит, придется перекодировать аудиопоток. Какой кодек вы хотите для аудио зависит от исходного формата, конечно. Вот несколько примеров:

  • простой аудиофайл: просто Закодируйте файл с любым кодировщиком вам нужно:

    ffmpeg -i input.wav -af "volume=5dB" output.mp3
    

    ваши варианты очень широки, конечно.

  • AVI формат: обычно есть MP3 аудио с видео, которое поставляется в AVI контейнер:

    ffmpeg -i video.avi -af "volume=5dB" -c:v copy -c:a libmp3lame -q:a 2 output.avi
    

    здесь мы выбрали уровень качества 2. Значения в диапазоне от 0-9 и ниже означает лучше. Проверьте MP3 VBR guide для получения дополнительной информации о настройке качества. Вы также можете установить фиксированный битрейт с -b:a 192k, например.

  • формат MP4: с контейнером MP4, вы, как правило, найти AAC аудио. Мы можем использовать встроенный AAC кодировщик ffmpeg.

    ffmpeg -i video.mp4 -af "volume=5dB" -c:v copy -c:a aac -b:a 192k output.mp4
    

    здесь вы также можете использовать другие AAC кодеры. Некоторые из них также поддерживают VBR. См.ответ и руководство по кодированию AAC для некоторых советов.

в приведенных выше примерах видеопоток будет скопирован с помощью -c:v copy. Если во входном файле есть субтитры или несколько видеопотоков, используйте опцию -map 0 до выходных именем.

139
отвечен slhck 2023-04-10 04:02

Я не могу прокомментировать лучшее сообщение, так что мой уродливый баш на его основе, чтобы сделать это

ffmpeg -i sound.mp3 -af volumedetect -f null -y nul &> original.txt
grep "max_volume" original.txt > original1.tmp
sed -i 's|: -|=|' original1.tmp
if [ $? = 0 ]
 then
 sed -i 's| |\r\n|' original.tmp
 sed -i 's| |\r\n|' original.tmp
 sed -i 's| |\r\n|' original.tmp
 sed -i 's| |\r\n|' original.tmp
 grep "max_volume" original1.tmp > original2.tmp
 sed -i 's|max_volume=||' original2.tmp
 yourscriptvar=$(cat "./original2.tmp")dB
 rm result.mp3
 ffmpeg -i sound.mp3 -af "volume=$yourscriptvar" result.mp3
 ffmpeg -i result.mp3 -af volumedetect -f null -y nul &> result.txt
fi
7
отвечен Sebastien Willemijns 2023-04-10 06:19

скрипт для нормализации уровня звука .файлы m4a. Следите, если уровни звука слишком тихо, чтобы начать с. Конечный звук может быть лучше, если вы используете что-то вроде наглость в этом случае.

#!/bin/bash

# Purpose: Use ffmpeg to normalize .m4a audio files to bring them up to max volume, if they at first have negative db volume. Doesn't process them if not. Keeps bitrate same as source files.
# Parameters:  should be the name of the directory containing input .m4a files.
#    should be the output directory.

INPUTDIR=
OUTPUTDIR=

<<"COMMENT"

# For ffmpeg arguments /q/how-can-i-normalize-audio-using-ffmpeg-605/"volumedetect" -f null /dev/null

ffmpeg -i test.m4a -af "volumedetect" -f null /dev/null 2>&1 | grep max_volume
# output: max_volume: -10.3 dB

ffmpeg -i test.m4a -af "volumedetect" -f null /dev/null 2>&1 | grep 'max_volume\|Duration'
# Output:
#  Duration: 00:00:02.14, start: 0.000000, bitrate: 176 kb/s
# [Parsed_volumedetect_0 @ 0x7f8531e011a0] max_volume: -10.3 dB

ffmpeg -i test.m4a -af "volumedetect" -f null /dev/null 2>&1 | grep max_volume | awk -F': ' '{print }' | cut -d' ' -f1
# Output: -10.3

ffmpeg -i test.m4a 2>&1 | grep Audio
# output: Stream #0:0(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 170 kb/s (default)

ffmpeg -i test.m4a 2>&1 | grep Audio | awk -F', ' '{print }' | cut -d' ' -f1
# output: 170

# This works, but I get a much smaller output file. The sound levels do appear normalized.
ffmpeg -i test.m4a -af "volume=10.3dB" -c:v copy -c:a aac -strict experimental output.m4a

# Operates quietly.
ffmpeg -i test.m4a -af "volume=10.3dB" -c:v copy -c:a aac -strict experimental -b:a 192k output.m4a -loglevel quiet

COMMENT

#  (first param) should be the name of a .m4a input file, with .m4a extension
#  should be name of output file, with extension
function normalizeAudioFile {
    INPUTFILE=
    OUTPUTFILE=

    DBLEVEL=`ffmpeg -i ${INPUTFILE} -af "volumedetect" -f null /dev/null 2>&1 | grep max_volume | awk -F': ' '{print }' | cut -d' ' -f1`

    # We're only going to increase db level if max volume has negative db level.
    # Bash doesn't do floating comparison directly
    COMPRESULT=`echo ${DBLEVEL}'<'0 | bc -l`
    if [ ${COMPRESULT} -eq 1 ]; then
        DBLEVEL=`echo "-(${DBLEVEL})" | bc -l`
        BITRATE=`ffmpeg -i ${INPUTFILE} 2>&1 | grep Audio | awk -F', ' '{print }' | cut -d' ' -f1`

        # echo $DBLEVEL
        # echo $BITRATE

        ffmpeg -i ${INPUTFILE} -af "volume=${DBLEVEL}dB" -c:v copy -c:a aac -strict experimental -b:a ${BITRATE}k ${OUTPUTFILE} -loglevel quiet

    else
        echo "Already at max db level:" $DBLEVEL "just copying exact file"
        cp ${INPUTFILE} ${OUTPUTFILE}
    fi
}

for inputFilePath in ${INPUTDIR}/*; do
    inputFile=$(basename $inputFilePath)
    echo "Processing input file: " $inputFile
    outputFilePath=${OUTPUTDIR}/$inputFile
    normalizeAudioFile ${inputFilePath} ${outputFilePath}
done
5
отвечен Chris Prince 2023-04-10 08:36

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх