ฉันจะทำให้ปกติเสียงโดยใช้ ffmpeg ได้อย่างไร


115

ฉันต้องการเสียงที่ดังที่สุดในคลิปภาพยนตร์ให้ดังที่สุดเท่าที่ตัวแปลงสัญญาณอนุญาตจากนั้นให้ขยายเสียงอื่น ๆ ตามลำดับ

ตัวอย่างการปฏิบัติเพื่อให้บรรลุสิ่งนี้โดยใช้ ffmpeg คืออะไร?


1
คุณกำลังต้องการให้เสียง 'ปกติ' ฉันพบกระทู้นี้และมีข้อมูลที่ดีมากมายในนั้น หวังว่ามันจะช่วย!
bobsbarricades

คำตอบ:


185

ตัวเลือกที่ 1: ตัวกรองการทำให้เป็นมาตรฐาน

ffmpeg ปัจจุบันมีตัวกรองสองตัวที่สามารถนำมาใช้โดยตรงสำหรับการทำให้เป็นมาตรฐาน - แม้ว่าตัวกรองเหล่านี้จะค่อนข้างก้าวหน้าไปแล้ว ที่นี่พวกเขาคือ:

  • loudnorm: การฟื้นฟูความดังตามมาตรฐาน EBU R128 คุณสามารถตั้งค่าเป้าหมายเสียงแบบรวม, เป้าหมายช่วงเสียงดังหรือจุดสูงสุดจริงสูงสุด แนะนำให้ใช้สำหรับการเผยแพร่เสียงและวิดีโอและผู้เผยแพร่ทั่วโลกใช้
  • dynaudnorm: การฟื้นฟูความดังแบบ“ อัจฉริยะ” โดยไม่ต้องตัดซึ่งใช้การทำให้เป็นมาตรฐานแบบไดนามิกบนส่วนที่เป็นหน้าต่างของไฟล์ สิ่งนี้อาจเปลี่ยนลักษณะของเสียงดังนั้นควรใช้ด้วยความระมัดระวัง

นอกจากนี้ยังvolumeสามารถใช้ตัวกรองเพื่อปรับระดับเสียงได้ง่าย ดูรายการ wiki ของAudio Volume Manipulationเพิ่มเติม

loudnormกรองสามารถใช้กับหนึ่งผ่าน แต่ก็จะแนะนำให้ดำเนินการทั้งสองผ่านซึ่งจะช่วยให้การฟื้นฟูเชิงเส้นที่แม่นยำมากขึ้น นี่เป็นเรื่องยากที่จะทำให้เป็นอัตโนมัติ นอกจากนี้หากคุณต้องการการทำให้เป็นมาตรฐานแบบธรรมดาหรือธรรมดา RMS เป็น 0 dBFS (หรือเป้าหมายอื่น ๆ ) อ่านต่อ


ตัวเลือกที่ 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ตัวกรองเพื่อเปลี่ยนระดับเสียงของแทร็ก ให้แน่ใจว่าคุณดาวน์โหลดเวอร์ชันล่าสุดของโปรแกรม

คู่มือนี้มีไว้สำหรับการทำให้ปกติสูงสุดซึ่งหมายความว่าจะทำให้ส่วนที่ดังที่สุดในไฟล์อยู่ที่ 0 dB แทนที่จะเป็นบางสิ่งที่ต่ำกว่า นอกจากนี้ยังมีการทำให้เป็นมาตรฐานตามมาตรฐาน RMS ซึ่งพยายามทำให้ความดังโดยเฉลี่ยเหมือนกันในหลาย ๆ ไฟล์ หากต้องการทำเช่นนั้นอย่าพยายามผลักดันปริมาณสูงสุดไปที่ 0 dB แต่ระดับเสียงเฉลี่ยไปที่ระดับ dB ที่เลือก (เช่น -26 dB)

หากำไรที่จะใช้

ก่อนอื่นคุณต้องวิเคราะห์กระแสข้อมูลเสียงเพื่อให้ได้ระดับเสียงสูงสุดเพื่อดูว่าการทำให้ปกติเป็นปกติหรือไม่:

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 dB ดังนั้นเราจึงสามารถใช้อัตราขยาย 5 dB หากคุณได้รับค่า 0 dB คุณไม่จำเป็นต้องทำการปรับมาตรฐานให้เป็นมาตรฐาน

ใช้ตัวกรองปริมาณ:

ตอนนี้เราใช้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ก่อนชื่อไฟล์ที่ส่งออก


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Geek

7
นี่คือของขวัญที่มอบให้อย่างต่อเนื่อง 6 ปีต่อมาและยังคงได้รับการปรับปรุงและบำรุงรักษา ทำได้ดี!
Jon Skarpeteig

ตัวเลือก 3 หลีกเลี่ยงการตัดถ้าฉันตั้งค่าโวลุ่มใหม่ดังนั้น max_volume จึงเป็นศูนย์หรือไม่? เช่นการใช้ค่าตรงข้ามเริ่มต้นที่กำหนดโดย max_volume
rraallvv

@rallallvv ใช่มันควรจะเป็น นั่นคือสิ่งที่ffmpeg-normalizeเครื่องมือทำเมื่อคุณระบุระดับ 0 dB และการปรับมาตรฐานสูงสุด
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 ระวังว่าระดับเสียงเงียบเกินไปที่จะเริ่มต้นด้วย เสียงสุดท้ายอาจดีกว่านี้ถ้าคุณใช้ความกล้าในกรณีนั้น

#!/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 copy tmp.avi

mencoder -ovc copy -oac copy tmp.avi -of rawaudio -af volnorm = 1 -oac mp3lame -lameopts cbr: preset = 192- อัตรา 48000 -o "output.mp3"

rm -f tmp.avi


2
เมื่อเปรียบเทียบกับคำตอบอื่น ๆ ที่นี่ฉันหวังว่ามันชัดเจนว่าโพสต์ของคุณไม่มีข้อมูลเชิงบริบทและคำอธิบายที่จะทำให้มีประโยชน์ "mencoder" คืออะไรและมีบทบาทอะไรในการตอบคำถาม
music2myear

2
คุณกรุณาแก้ไขคำตอบของคุณเพื่อให้คำอธิบายว่าทำไมรหัสนี้ตอบคำถามได้หรือไม่ คำตอบที่ไม่ใช้รหัสเท่านั้นไม่มีกำลังใจเพราะพวกเขาไม่ได้สอนวิธีแก้ปัญหา
DavidPostill
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.