2009-06-16 8 views
0

je dois connaître le volume moyen d'un fichier mp3 de telle sorte que quand je le convertir en mp3 (à un débit binaire différent) je peux échelle le volume aussi, pour normaliser ...calculer le volume moyen mp3

Par conséquent, J'ai besoin d'un outil de ligne de commande/bibliothèque ruby ​​qui me donne le volume moyen en dB.

+1

Vous n'avez pas besoin du volume moyen mais de l'amplitude de crête pour normaliser un fichier son. –

Répondre

3

Vous pouvez utiliser sox (un outil audio de ligne de commande open source http://sox.sourceforge.net/sox.html) pour normaliser et transcoder vos fichiers en même temps.

EDIT

On dirait qu'il n'a pas d'options pour débit binaire. Quoi qu'il en soit, sox est probablement overkill si LAME fait la normalisation.

1

Vous pouvez utiliser LAME pour encoder en mp3. Il a des options pour la normalisation, la mise à l'échelle et le débit. LAME compile également sur pratiquement n'importe quelle plate-forme.

+2

lame fait la mise à l'échelle, mais est-ce normal? Je veux dire, peut-il évaluer le volume moyen par piste? Si c'est le cas, comment? J'ai lu l'homme et je ne pouvais pas le résoudre ... – luca

1

j'ai écrit un petit script d'emballage, basé sur l'entrée ci-dessus:

#!/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 

Il faut une seconde supplémentaire pour démarrer la lecture du fichier, et repose sur alsamixer pour régler le volume, mais il fait un vraiment bon travail de vous empêcher d'avoir à constamment modifier le volume principal. Et peu importe le format d'entrée, car si mplayer peut le lire, il peut extraire l'audio, donc ça devrait marcher avec MP3, Ogg, AVI, peu importe.

Questions connexes