Я хочу, чтобы самый громкий пиковый звук в клипе был таким громким, как позволяет кодек, а затем каждый другой звук усиливался соответственно.
каков практический пример, чтобы выполнить это с помощью ffmpeg?
Я хочу, чтобы самый громкий пиковый звук в клипе был таким громким, как позволяет кодек, а затем каждый другой звук усиливался соответственно.
каков практический пример, чтобы выполнить это с помощью ffmpeg?
текущий ffmpeg имеет два фильтра, которые могут быть непосредственно использованы для нормализации-хотя они уже достаточно продвинуты, поэтому они не просто применяют усиление для достижения пикового уровня. Вот они какие:
loudnorm
: громкость нормализации, по данным ЕВС R128. Вы можете установить интегрированную цель громкости, целевой диапазон громкости, или максимальный истинный пик. Это рекомендуется для публикации аудио и видео и оно использованы передатчиками во всем мире.dynaudnorm
: "интеллектуальная" нормализация громкости без обрезки, которая динамически применяет нормализацию к оконным частям файла. Это может изменить характеристики звука, поэтому его следует применять с осторожностью.и volume
фильтр может использоваться для выполнения простой регулировки громкости. Смотрите Манипуляция Громкостью Звука запись wiki для более.
loudnorm
фильтр может использоваться с одним проходом, но рекомендуется выполнять два прохода, что обеспечивает более точную линейную нормализацию. Это немного трудно автоматизировать. Также, если вы хотите "простой" РМС или пик нормализация к 0 dBFS в режиме (или любой другой цели), Читать далее.
ffmpeg-normalize
toolя создал программа Python для нормализации медиа-файлов,доступно на PyPi как ну. Вы просто:
ffmpeg
исполняемый файл в $PATH
либо добавив его, например,/usr/local/bin
или добавление каталога в $PATH
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), или автоматическое слияние аудио обратно в видео.
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
до выходных именем.
Я не могу прокомментировать лучшее сообщение, так что мой уродливый баш на его основе, чтобы сделать это
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
скрипт для нормализации уровня звука .файлы 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
Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]