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.
Sie benötigen nicht die durchschnittliche Lautstärke, sondern die Spitzenamplitude, um eine Audiodatei zu normalisieren. –