سؤال كيف يمكنني تطبيع الصوت باستخدام ffmpeg؟


أريد أعلى صوت أعلى صوت في مقطع الفيلم ليكون مرتفعًا كما يسمح لك الكودك ، ثم قم بتضخيم كل صوت آخر وفقًا لذلك.

ما هو مثال عملي من أجل تحقيق ذلك باستخدام ffmpeg؟


89
2017-08-14 19:56


الأصل


أنت تتطلع إلى جعل الصوت "طبيعيًا". وجدت هذا الموضوع وهناك الكثير من المعلومات الجيدة هناك. آمل أن يساعد! - bobsbarricades


الأجوبة:


الخيار 1: مرشحات التطبيع المضمنة

يحتوي ffmpeg الحالي على مرشحين يمكن استخدامهما مباشرة للتطبيع - على الرغم من أنهما متقدمان بالفعل بالفعل ، لذلك لا يقوما ببساطة بتطبيق الكسب للوصول إلى مستوى الذروة. ها هم:

  • loudnorm: تطبيع الجهارة وفقا ل EBU R128. يمكنك ضبط هدف متكامل لجهارة الصوت أو هدف نطاق جهارة الصوت أو أقصى ذروة حقيقية. يوصى بهذا لنشر الصوت والفيديو ويستخدمه المذيعون في جميع أنحاء العالم.
  • dynaudnorm: تطويع الجهارة "الذكي" بدون قصاصة ، مما يؤدي إلى تطبيق التطبيع ديناميكيًا على أجزاء من النافذة في الملف. هذا قد يغير خصائص الصوت ، لذلك يجب تطبيقه بحذر.

أيضا ، و volume مرشح يمكن استخدامها لأداء تعديلات بسيطة الحجم. شاهد التلاعب في الصوت دخول ويكي لمزيد من.

ال loudnorm يمكن استخدام الفلتر مع تمرير واحد ، ولكن يُنصح بإجراء تمريرين ، مما يتيح تطبيع خطي أكثر دقة. هذا من الصعب قليلا لأتمتة. أيضا ، إذا كنت ترغب في "بسيطة" RMS المستندة إلى أو تطبيع الذروة إلى 0 dBFS (أو أي هدف آخر) ، وقراءة.


الخيار 2: استخدم ffmpeg-normalize أداة

صنعت برنامج بايثون لتطبيع ملفات الوسائط، المتاحة على PyPi كذلك. أنت ببساطة:

  • تحميل ffmpeg (اختر بناء ثابتالإصدار 3.1 أو أعلى)
  • ضع ال 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) ، أو دمج تلقائي للصوت في الفيديو.


الخيار 3: تطبيع الصوت يدويًا مع ffmpeg

في ffmpeg يمكنك استخدام volume مرشح لتغيير حجم المسار. تأكد أنك تحميل نسخة حديثة من البرنامج.

هذا الدليل هو ل قمة التطبيع ، بمعنى أنها ستجعل أعلى جزء في الملف يجلس عند 0 ديسيبل بدلاً من شيء أقل. هناك أيضا تطبيع القائمة على RMS الذي يحاول جعل معدل ارتفاع الصوت نفسه عبر ملفات متعددة. للقيام بذلك ، لا تحاول دفع الحد الأقصى لحجم الصوت إلى 0 ديسيبل ، لكن متوسط ​​الحجم إلى مستوى اختيار dB (على سبيل المثال -26 ديسيبل).

معرفة مكسب للتطبيق

تحتاج أولاً إلى تحليل الدفق الصوتي للوصول إلى الحد الأقصى للحجم لمعرفة ما إذا كان التطبيع سيؤدي إلى نتائج جيدة:

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

يحل محل /dev/null مع NUL على ويندوز.
ال -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 قبل اسم الملف الناتج.


139
2017-08-14 20:11



التعليقات ليست للمناقشة الموسعة. كانت هذه المحادثة انتقل إلى الدردشة. - Journeyman Geek♦
هذه هي الهدية التي تستمر في العطاء. بعد 6 سنوات ، ولا يزال يتم تحديثه وصيانته. أحسنت! - Jon Skarpeteig
@ جون شكرا ، موضع تقدير كبير! - slhck
هل يتجنب الخيار 3 الاقتطاع إذا قمت بتعيين وحدة التخزين الجديدة بحيث يكون max_volume صفراً؟ بمعنى استخدام القيمة المعاكسة المبدئية المعطاة بواسطة max_volume - rraallvv
rraallvv نعم ، يجب أن. هذا أيضا ما ffmpeg-normalize أداة ، عندما تحدد مستوى 0 ديسيبل وذروة التطبيع. - slhck


لا أستطيع التعليق على أفضل رسالة حتى أن باشتي القبيحة تستند إليها للقيام بذلك

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

7
2018-05-19 14:51





إليك برنامج نصي لتطبيع مستويات الصوت لملفات 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

5
2017-09-12 04:57