ffmpeg를 사용하여 오디오를 정규화하려면 어떻게해야합니까?


119

동영상 클립에서 가장 큰 피크 사운드가 코덱에서 허용하는 한 큰 소리를 내고 그에 따라 다른 모든 사운드를 증폭시키고 싶습니다.

ffmpeg를 사용하여 이것을 달성하기위한 실용적인 예는 무엇입니까?


1
오디오를 '정규화'하려고합니다. 이 스레드를 찾았 으며 거기에 좋은 정보가 많이 있습니다. 그것이 도움이되기를 바랍니다!
bobsbarricades

답변:


189

옵션 1 : 내장 정규화 필터

현재 ffmpeg에는 정규화에 직접 사용할 수있는 두 개의 필터가 있습니다. 필터는 이미 상당히 발전되어 있지만 피크 레벨에 도달하기 위해 단순히 게인을 적용하지 않습니다. 여기 있습니다:

  • loudnorm: EBU R128에 따른 음량 정규화. 통합 음량 대상, 음량 범위 대상 또는 최대 실제 피크를 설정할 수 있습니다. 오디오 및 비디오 게시에 권장되며 전 세계의 방송사에서 사용합니다.
  • dynaudnorm: 클리핑없이 "지능적인"음량 정규화로 파일의 창 부분에 동적으로 정규화를 적용합니다. 사운드 특성이 변경 될 수 있으므로주의해서 적용해야합니다.

또한 volume필터를 사용하여 간단한 볼륨 조절을 수행 할 수 있습니다. 자세한 내용은 Audio Volume Manipulation 위키 항목을 참조하십시오.

loudnorm필터는 하나의 패스로 이용 될 수 있지만, 더 정확한 선형 정규화 가능 두 과정을 수행 할 것을 권장한다. 자동화하기가 조금 어렵습니다. 또한 "간단한"RMS 기반 또는 최대 정규화를 0dBFS (또는 다른 대상)로 설정하려면 계속 읽으십시오.


옵션 2 : ffmpeg-normalize도구 사용

내가 만든 미디어 파일 정상화 파이썬 프로그램 , 뿐만 아니라 PyPi 볼을 . 당신은 단순히 :

예를 들면 다음과 같습니다.

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)로 다시 인코딩하거나 오디오를 비디오로 자동 병합하는 기능도 지원합니다.


옵션 3 : 다음을 사용하여 수동으로 오디오 정규화 ffmpeg

ffmpeg에서는 volume필터를 사용하여 트랙의 음량을 변경할 수 있습니다 . 최신 버전 의 프로그램 을 다운로드 하십시오 .

이 가이드는 피크 정규화를 위한 것으로, 파일에서 가장 큰 부분이 무언가가 아닌 0dB에있게됩니다. 여러 파일 에서 평균 음량을 동일 하게 만들려는 RMS 기반 정규화도 있습니다. 그렇게하려면 최대 볼륨을 0dB로 누르지 말고 평균 볼륨을 선택한 dB 레벨 (예 : -26dB)로 밉니다.

적용 할 이익 찾기

먼저 최대 볼륨에 대한 오디오 스트림을 분석하여 정규화가 효과가 있는지 확인해야합니다.

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

교체 /dev/nullNULWindows에서. , 및 인수는이 분석 과정이 아닌 오디오 스트림을 무시하기는 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있는 경우 출력 파일 이름 앞에 옵션을 사용하십시오 .


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Journeyman Geek

7
이것은 계속주는 선물입니다. 6 년 후, 여전히 업데이트 및 유지 관리되고 있습니다. 잘 했어!
Jon Skarpeteig

max_volume이 0이되도록 새 볼륨을 설정하면 옵션 3이 클리핑을 피합니까? 즉 max_volume에 의해 주어진 반대 값 초기 값 사용
rraallvv

@rraallvv 그렇습니다. ffmpeg-normalize레벨을 0dB로 지정하고 피크 정규화를 수행 할 때 도구가 수행 하는 작업이기도합니다 .
slhck

7

나는 최고의 메시지에 대해 언급 할 수 없으므로 그것을 기반으로 한 추악한 배쉬입니다.

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

5

다음은 .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

-2

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


2
이 답변을 다른 답변과 비교하면 게시물에 유용한 문맥 정보 및 설명 정보가 없다는 것이 분명합니다. "멘 코더"란 무엇이며 질문에 대답하는 데 어떤 역할을합니까?
music2myear

2
당신은 시겠어요 편집 이 코드는 질문에 대한 답 이유에 대한 설명을 제공하는 답변을? 코드 전용 답변은 솔루션을 가르치지 않기 때문에 권장 하지 않습니다.
DavidPostill
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.