2009-06-16 8 views
0

Ich brauche die durchschnittliche Lautstärke einer mp3-Datei kennen, so dass, wenn ich es in mp3 konvertieren (bei einer anderen Bitrate) ich auch die Lautstärke skaliert werden kann, um es zu normieren ...berechnen mp3 durchschnittliches Volumen

Deshalb Ich brauche eine Befehlszeilen-Tool/Ruby-Bibliothek, die mir die durchschnittliche Lautstärke in dB gibt.

+1

Sie benötigen nicht die durchschnittliche Lautstärke, sondern die Spitzenamplitude, um eine Audiodatei zu normalisieren. –

Antwort

3

Sie können sox (ein Open-Source-Befehlszeilen-Audio-Tool http://sox.sourceforge.net/sox.html) verwenden, um Ihre Dateien gleichzeitig zu normalisieren und zu transcodieren.

EDIT

Sieht aus wie es Optionen für die Bitrate nicht verfügt. Sowieso ist sox wahrscheinlich übertrieben, wenn LAME normalisiert.

1

Sie können LAME verwenden, um zu mp3 zu kodieren. Es hat Optionen für Normalisierung, Skalierung und Bitrate. LAME kompiliert auch zu praktisch jeder Plattform.

+2

lame macht die Skalierung, aber normalisiert es sich? Ich meine, kann es die durchschnittliche Lautstärke pro Track auswerten? Wenn das so ist, wie? Ich las den Mann und konnte es nicht verarbeiten ... – luca

1

schrieb ich ein kleines Wrapper-Skript, basierend auf dem oben Eingang:

#!/bin/sh 

# Get the current volume (will reset to this later). 
current=`amixer -c 0 get Master 2>&1 |\ 
    awk '/%/ { 
       p=substr($4,2,length($4)-2); 
       if(substr(p,length(p)) == "%") 
       { 
       p = substr(p,1,length(p)-1) 
       } 
      print p 
      }'` 

# Figure out how loud the track is. The normal amplitude for a track is 0.1. 
# Ludicrously low values are 0.05, high is 0.37 (!!?) 
rm -f /tmp/$$.out 
/usr/bin/mplayer -vo null -ao pcm:file=/tmp/$$.out $1 >/dev/null 2>&1 
if [ $? = 0 ] ; then 
    amplitude=`/usr/bin/sox /tmp/$$.out -n stat 2>&1 | awk '/RMS.+amplitude/ {print $NF}'` 
fi 
rm -f /tmp/$$.out 

# Set an appropriate volume for the track. 
to=`echo $current $amplitude | awk '{printf("%.0f%%", $1 * 0.1/$2);}'` 
echo $current $amplitude | awk '{print "Amplitude:", $2, " Setting volume to:", 10/$2 "%, mixer volume:", $1 * 0.1/$2}' 
amixer -c 0 set Master $to >/dev/null 2>&1 

mplayer -quiet -cache 2500 $1 

# Reset the volume for next time. 
amixer -c 0 set Master "$current%" >/dev/null 2>&1 

Es dauert eine zusätzliche Sekunde, um die Datei zu starten spielen, und stützt sich auf alsamixer die Lautstärke anzupassen, aber es hat eine wirklich nette Arbeit, die dich davon abhält, das Master Volume ständig zu optimieren. Und es ist nicht wirklich wichtig, was das Eingabeformat ist, denn wenn MPlayer es überhaupt abspielen kann, kann es das Audio extrahieren, also sollte es gut mit MP3, OGG, AVI, was auch immer funktionieren.