동영상 클립에서 가장 큰 피크 사운드가 코덱에서 허용하는 한 큰 소리를 내고 그에 따라 다른 모든 사운드를 증폭시키고 싶습니다.
ffmpeg를 사용하여 이것을 달성하기위한 실용적인 예는 무엇입니까?
동영상 클립에서 가장 큰 피크 사운드가 코덱에서 허용하는 한 큰 소리를 내고 그에 따라 다른 모든 사운드를 증폭시키고 싶습니다.
ffmpeg를 사용하여 이것을 달성하기위한 실용적인 예는 무엇입니까?
답변:
현재 ffmpeg에는 정규화에 직접 사용할 수있는 두 개의 필터가 있습니다. 필터는 이미 상당히 발전되어 있지만 피크 레벨에 도달하기 위해 단순히 게인을 적용하지 않습니다. 여기 있습니다:
loudnorm
: EBU R128에 따른 음량 정규화. 통합 음량 대상, 음량 범위 대상 또는 최대 실제 피크를 설정할 수 있습니다. 오디오 및 비디오 게시에 권장되며 전 세계의 방송사에서 사용합니다.dynaudnorm
: 클리핑없이 "지능적인"음량 정규화로 파일의 창 부분에 동적으로 정규화를 적용합니다. 사운드 특성이 변경 될 수 있으므로주의해서 적용해야합니다.또한 volume
필터를 사용하여 간단한 볼륨 조절을 수행 할 수 있습니다. 자세한 내용은 Audio Volume Manipulation 위키 항목을 참조하십시오.
loudnorm
필터는 하나의 패스로 이용 될 수 있지만, 더 정확한 선형 정규화 가능 두 과정을 수행 할 것을 권장한다. 자동화하기가 조금 어렵습니다. 또한 "간단한"RMS 기반 또는 최대 정규화를 0dBFS (또는 다른 대상)로 설정하려면 계속 읽으십시오.
ffmpeg-normalize
도구 사용내가 만든 미디어 파일 정상화 파이썬 프로그램 , 뿐만 아니라 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
필터를 사용하여 트랙의 음량을 변경할 수 있습니다 . 최신 버전 의 프로그램 을 다운로드 하십시오 .
이 가이드는 피크 정규화를 위한 것으로, 파일에서 가장 큰 부분이 무언가가 아닌 0dB에있게됩니다. 여러 파일 에서 평균 음량을 동일 하게 만들려는 RMS 기반 정규화도 있습니다. 그렇게하려면 최대 볼륨을 0dB로 누르지 말고 평균 볼륨을 선택한 dB 레벨 (예 : -26dB)로 밉니다.
먼저 최대 볼륨에 대한 오디오 스트림을 분석하여 정규화가 효과가 있는지 확인해야합니다.
ffmpeg -i video.avi -af "volumedetect" -vn -sn -dn -f null /dev/null
교체 /dev/null
와 NUL
Windows에서. , 및 인수는이 분석 과정이 아닌 오디오 스트림을 무시하기는 FFmpeg을 지시합니다. 이는 분석 속도를 크게 향상시킵니다.-vn
-sn
-dn
다음과 같은 결과가 출력됩니다.
[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.0dB이므로 5dB 게인을 적용 할 수 있습니다. 값이 0dB이면 오디오를 정규화 할 필요가 없습니다.
이제 volume
필터 를 오디오 파일에 적용 합니다. 필터를 적용하면 오디오 스트림을 다시 인코딩해야합니다. 오디오에 필요한 코덱은 물론 원래 형식에 따라 다릅니다. 여기 몇 가지 예가 있어요.
일반 오디오 파일 : 필요한 인코더로 파일을 인코딩하십시오.
ffmpeg -i input.wav -af "volume=5dB" output.mp3
물론 옵션은 매우 광범위합니다.
AVI 형식 : 일반적으로 AVI 컨테이너에 들어있는 비디오가 포함 된 MP3 오디오가 있습니다.
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 오디오가 있습니다. ffmpeg의 내장 AAC 인코더를 사용할 수 있습니다.
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
레벨을 0dB로 지정하고 피크 정규화를 수행 할 때 도구가 수행 하는 작업이기도합니다 .
나는 최고의 메시지에 대해 언급 할 수 없으므로 그것을 기반으로 한 추악한 배쉬입니다.
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 -af volnorm = 1 -oac mp3lame -lameopts cbr : preset = 192 -srate 48000 -o "output.mp3"
rm -f tmp.avi