मैं ffmpeg का उपयोग करके ऑडियो को कैसे सामान्य कर सकता हूं?


119

मैं एक फिल्म क्लिप में सबसे ऊँची चोटी की आवाज़ चाहता हूँ जितना ज़ोर से कोडेक अनुमति देता है, तो उसके अनुसार हर दूसरी ध्वनि बढ़ जाती है।

Ffmpeg का उपयोग करके इसे पूरा करने के लिए एक व्यावहारिक उदाहरण क्या है?


1
आप ऑडियो को 'सामान्यीकृत' कर रहे हैं। मुझे यह धागा मिला और वहाँ बहुत सारी अच्छी जानकारी है। आशा है ये मदद करेगा!
bobsbarricades

जवाबों:


189

विकल्प 1: बिल्ट-इन सामान्यीकरण फिल्टर

वर्तमान ffmpeg में दो फिल्टर होते हैं जो सीधे सामान्यीकरण के लिए उपयोग किए जा सकते हैं - हालांकि वे पहले से ही काफी उन्नत हैं, इसलिए वे केवल एक चरम स्तर तक पहुंचने के लिए लाभ नहीं लागू करते हैं। वे यहाँ हैं:

  • loudnorm: EBU R128 के अनुसार जोर का सामान्यीकरण। आप एक एकीकृत लाउडनेस लक्ष्य, एक लाउडनेस रेंज लक्ष्य या अधिकतम वास्तविक शिखर सेट कर सकते हैं। यह ऑडियो और वीडियो प्रकाशित करने के लिए अनुशंसित है और इसका उपयोग दुनिया भर के प्रसारकों द्वारा किया जाता है।
  • dynaudnorm: क्लिपिंग के बिना "बुद्धिमान" लाउडनेस सामान्यीकरण, जो फ़ाइल के विंडो किए गए हिस्सों पर गतिशील रूप से सामान्यीकरण लागू करता है। यह ध्वनि की विशेषताओं को बदल सकता है, इसलिए इसे सावधानी के साथ लागू किया जाना चाहिए।

इसके अलावा, volumeफ़िल्टर का उपयोग सरल वॉल्यूम समायोजन करने के लिए किया जा सकता है। अधिक के लिए ऑडियो वॉल्यूम हेरफेर विकी प्रविष्टि देखें ।

loudnormफिल्टर एक पास के साथ इस्तेमाल किया जा सकता है, लेकिन यह दो गुजरता है, जो और अधिक सटीक रैखिक सामान्य सक्षम बनाता है प्रदर्शन करने के लिए सिफारिश की है। यह स्वचालित करने के लिए थोड़ा कठिन है। इसके अलावा, यदि आप 0 dBFS (या किसी अन्य लक्ष्य) पर "सरल" RMS- आधारित या शिखर सामान्यीकरण चाहते हैं, तो पढ़ें।


विकल्प 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 या एमपी 3), या वीडियो में ऑडियो के स्वचालित विलय के साथ पुन: एन्कोडिंग का समर्थन करता है।


विकल्प 3: ऑडियो को सामान्य रूप से सामान्य करना ffmpeg

Ffmpeg में आप volumeकिसी ट्रैक की मात्रा को बदलने के लिए फ़िल्टर का उपयोग कर सकते हैं । सुनिश्चित करें कि आपने प्रोग्राम का हाल ही का संस्करण डाउनलोड किया है

यह मार्गदर्शिका चोटी के सामान्यीकरण के लिए है, जिसका अर्थ है कि यह फ़ाइल के सबसे निचले हिस्से को कुछ कम करने के बजाय 0 डीबी पर बैठेगा। आरएमएस-आधारित सामान्यीकरण भी है जो कई फ़ाइलों में औसत ज़ोर बनाने की कोशिश करता है । ऐसा करने के लिए, अधिकतम वॉल्यूम को 0 डीबी पर धकेलने की कोशिश न करें, लेकिन पसंद के डीबी स्तर (जैसे -26 डीबी) के लिए औसत मात्रा।

आवेदन करने का लाभ प्राप्त करें

पहले आपको अधिकतम देखने के लिए ऑडियो स्ट्रीम का विश्लेषण करने की आवश्यकता है कि क्या सामान्यीकरण भी भुगतान करेगा:

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

बदलें /dev/nullके साथ NULविंडोज पर। , , और तर्क इस विश्लेषण के दौरान गैर-ऑडियो धाराओं की अनदेखी करने के 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.0 डीबी है, इसलिए हम 5 डीबी हासिल कर सकते हैं। यदि आपको 0 dB का मान मिलता है, तो आपको ऑडियो को सामान्य करने की आवश्यकता नहीं है।

वॉल्यूम फ़िल्टर लागू करें:

अब हम volumeफ़िल्टर को एक ऑडियो फ़ाइल पर लागू करते हैं । ध्यान दें कि फ़िल्टर लागू करने का मतलब है कि हमें ऑडियो स्ट्रीम को फिर से एनकोड करना होगा। ऑडियो के लिए आपको कौन सा कोडेक चाहिए, यह मूल प्रारूप पर निर्भर करता है। यहाँ कुछ उदाहरण हैं:

  • सादा ऑडियो फ़ाइल: बस आपको जो भी एनकोडर चाहिए फाइल को एनकोड करें:

    ffmpeg -i input.wav -af "volume=5dB" output.mp3
    

    आपके विकल्प बहुत व्यापक हैं, निश्चित रूप से।

  • AVI प्रारूप: आमतौर पर वीडियो के साथ एमपी 3 ऑडियो होता है जो एक AVI कंटेनर में आता है:

    ffmpeg -i video.avi -af "volume=5dB" -c:v copy -c:a libmp3lame -q:a 2 output.avi
    

    यहां हमने क्वालिटी लेवल चुना। वैल्यू 0 से लेकर 9 तक और लोअर का मतलब बेहतर है। चेक एमपी 3 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तो आउटपुट फ़ाइल नाम से पहले विकल्प का उपयोग करें ।


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
जर्नीमैन गीक

7
यह वह उपहार है जो देता रहता है। 6 साल बाद, और यह अभी भी अद्यतन और बनाए रखा जा रहा है। बहुत बढ़िया!
जॉन स्कारपेटिग 21

क्या विकल्प 3 क्लिपिंग से बचता है अगर मैं नया वॉल्यूम सेट करता हूं तो max_volume शून्य है? इसका मतलब है कि विपरीत मूल्य का उपयोग करना, जो कि max_volume द्वारा दिया गया है
rraallvv

@ श्रील्लव हाँ, यह चाहिए। यह भी वही है जो ffmpeg-normalizeउपकरण करता है, जब आप 0 डीबी और शिखर-सामान्यीकरण के स्तर को निर्दिष्ट करते हैं।
स्लॉक

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-48 48 -o "output" एमपी 3

rm -f tmp.avi


2
अन्य उत्तरों के साथ इसकी तुलना करते हुए, मुझे उम्मीद है कि यह स्पष्ट है कि आपकी पोस्ट में प्रासंगिक और व्याख्यात्मक जानकारी का अभाव है जो इसे उपयोगी बना देगा। प्रश्न का उत्तर देने में "मेन्कोडर" क्या है और यह किस भूमिका निभाता है?
संगीत 2 साल

2
क्या आप इस कोड के प्रश्न का उत्तर देने की व्याख्या देने के लिए अपना उत्तर संपादित कर सकते हैं ? कोड-केवल उत्तर हतोत्साहित किए जाते हैं , क्योंकि वे समाधान नहीं सिखाते हैं।
DavidPostill
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.