Я хочу, щоб найгучніший піковий звук у відеоролику був таким же гучним, як дозволяє кодек, а потім кожен інший звук посилюватися відповідно.
Який практичний приклад для досягнення цього за допомогою ffmpeg?
Я хочу, щоб найгучніший піковий звук у відеоролику був таким же гучним, як дозволяє кодек, а потім кожен інший звук посилюватися відповідно.
Який практичний приклад для досягнення цього за допомогою ffmpeg?
Відповіді:
Поточний ffmpeg має два фільтри, які можна безпосередньо використовувати для нормалізації - хоча вони вже досить вдосконалені, тому вони не просто застосовують посилення для досягнення пікового рівня. Ось вони:
loudnorm
: нормалізація гучності відповідно до EBU R128. Ви можете встановити інтегровану ціль гучності, ціль діапазону гучності або максимальний справжній пік. Це рекомендується для публікації аудіо та відео, і воно використовується телерадіокомпаніями по всьому світу.dynaudnorm
: «Інтелектуальна» нормалізація гучності без відсікання, яка динамічно застосовує нормалізацію до віконних частин файлу. Це може змінити характеристики звуку, тому застосовувати його слід обережно.Також volume
фільтр можна використовувати для простого регулювання гучності. Додаткову інформацію див. У статті Вікі- маніпуляції з обсягом аудіо .
loudnorm
Фільтр може бути використаний з одним проходом, але рекомендується , щоб виконати два проходи, що дозволяє більш точно лінійної нормалізації. Це трохи важко автоматизувати. Крім того, якщо ви хочете "простої" на основі RMS або пікової нормалізації до 0 dBFS (або будь-якої іншої цілі), читайте далі.
ffmpeg-normalize
інструментЯ створив програму 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 та пік. Перегляньте ffmpeg-normalize -h
додаткові варіанти та ознайомтеся з README на кілька прикладів.
Крім того, він підтримує перекодування з іншими кодерами (наприклад, AAC або MP3) або автоматичне злиття аудіо назад у відео.
ffmpeg
У ffmpeg ви можете використовувати volume
фільтр, щоб змінити гучність доріжки. Обов’язково завантажте останню версію програми.
Цей посібник призначений для нормалізації піку , тобто він зробить найгучнішу частину файлу на 0 dB замість чогось нижчого. Існує також нормалізація на основі RMS, яка намагається зробити середню гучність однаковою для кількох файлів. Для цього не намагайтеся висунути максимальний об'єм до 0 дБ, а середній об'єм до вибору рівня дБ (наприклад, -26 дБ).
Спочатку потрібно проаналізувати аудіопотік на максимальну гучність, щоб побачити, чи нормалізація навіть окупиться:
ffmpeg -i video.avi -af "volumedetect" -vn -sn -dn -f null /dev/null
Замінити /dev/null
з NUL
на Windows.
Аргументи -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 для отримання додаткової інформації про налаштування якості. Ви також можете встановити фіксований бітрейт -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-normalize
інструмент, коли ви вказуєте рівень 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. Слідкуйте, чи рівень звуку занадто тихий для початку. Остаточний звук може бути кращим, якщо ви використовуєте щось подібне до Audacity в цьому випадку.
#!/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: $1 should be the name of the directory containing input .m4a files.
# $2 should be the output directory.
INPUTDIR=$1
OUTPUTDIR=$2
<<"COMMENT"
# For ffmpeg arguments http://superuser.com/questions/323119/how-can-i-normalize-audio-using-ffmpeg
# and
# https://kdecherf.com/blog/2012/01/14/ffmpeg-converting-m4a-files-to-mp3-with-the-same-bitrate/
ffmpeg -i test.m4a -af "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 $2}' | 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 $5}' | 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
# $1 (first param) should be the name of a .m4a input file, with .m4a extension
# $2 should be name of output file, with extension
function normalizeAudioFile {
INPUTFILE=$1
OUTPUTFILE=$2
DBLEVEL=`ffmpeg -i ${INPUTFILE} -af "volumedetect" -f null /dev/null 2>&1 | grep max_volume | awk -F': ' '{print $2}' | 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 $5}' | 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
ffmpeg -i image.jpg -i "input.mp3" -acodec копія tmp.avi
mencoder -ovc копія -oac копія tmp.avi -of rawaudio -a volnorm = 1 -oac mp3lame -lameopts cbr: preset = 192 -srate 48000 -o "output.mp3"
rm -f tmp.avi