mp32wav

Post Reply
Message
Author
Sascha+Müller

mp32wav

#1 Post by Sascha+Müller »

Hallo!

Ich habe eine ganze Reihe von MP3s, die ich allesamt ins WAV-Format umwandeln möchte.

Erste Wahl zum Umwandeln von Sounddateien ist natürlich SoX, das allerdings kein MP3 kennt. Also habe ich es mit folgendem kleinen Skript versucht:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">mpg123 -b 10000 -s "$1" | sox -t raw -s -w -r 44100 -c2 - "$2"</font><hr></pre></blockquote>

Das klappt leider nicht so, wie ich es mir vorgestellt habe. Vermutlich liegt es daran, dass MPG123 nur reine RAW-Daten rausgibt, und die eben keine Information über Sampling-Frequenz, Mono/Stereo, etc. enthalten. Einige der MP3s werden korrekt umgewandelt, wenn ich das -c2 weglasse, andere nicht.

Hat da jemand einen Tipp für mich?

Lippi

Re: mp32wav

#2 Post by Lippi »

Hi Sascha,

#!/bin/sh
for file in *.mp3
do
mpg123 -w "$file.wav" "$file"
done

funktoniert bei mir einwandfrei.

Gruß Lippi

Sascha Müller

Re: mp32wav

#3 Post by Sascha Müller »

Ja, aber wieso einfach wenn es auch kompliziert geht <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

Im Ernst: Danke für den Tipp!

BTW: Sollte es nicht eher heissen: <blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">mpg123 -w "${file%mp3}wav" "$file"</font><hr></pre></blockquote>

malfi

Re: mp32wav

#4 Post by malfi »

Ein bisserl konfigurabler...

#!/bin/bash
echo " ##### mp3 to wav #####"
case $# in
0) echo "Usage: mp32wav <file> <file> <file>...."
echo ' mp32wav "*bla*.mp3" "[foo]*bar.mp3"...'
echo "Note: The quotationsmarks are needed for globbing!"
;;
*)
for i in $*; do
tgt=$(echo "$i" | sed -e s/\<!--no-->.mp3/\<!--no-->.wav/)
echo "# Converting $i to $tgt"
mpg123 -q -v -w "$tgt" "$i"
echo " DONE"
done
;;
esac

TuX

Re: mp32wav

#5 Post by TuX »

wie wäre es mit folgender kleiner Anpassung:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/bash

#
# erst mal festlegen wo unsere Binaries liegen...
#
BIN_BASENAME="/usr/bin/basename"
BIN_MPG123="/usr/bin/mpg123"
BIN_SED="/usr/bin/sed"


echo " ##### mp3 to wav #####"

case $# in
0) echo "Usage: mp32wav <file> <file> <file>...."
echo ' mp32wav "*bla*.mp3" "[foo]*bar.mp3"...'
echo "Note: The quotationsmarks are needed for globbing!"
;;
*) for INPUTFILE in $*; do
#
# "basename Dateiname Dateiendung" verwenden um die Dateiendung zu entfernen
# anschliessend mit SED alle Spaces im Dateinamen eliminieren (stoeren unter UNIX eh nur)
#
TARGET=$(echo "$(${BIN_BASENAME} "${INPUTFILE}" .mp3).wav" | ${BIN_SED} -e "/ \+/_/g")
echo "# Converting $i to ${TARGET}"
${BIN_MPG123} -q -v -w "${TARGET}" "${INPUTFILE}"
echo " DONE"
done
;;
esac
</font><hr></pre></blockquote>

Malfi

Re: mp32wav

#6 Post by Malfi »

Hast' recht. Bei meiner Version könnte man u.U. Dateien schrotten, wenn sie nicht den Suffix 'mp3' haben, weil dann bei mpg123 target=sourcefile ist. (Kann aber auch sein, dass mpg123 das abfaengt, habs nicht getestet.)

Man sollte vielleicht noch in Betracht ziehen, ein Ziel-Verzeichnis anzugeben, wohin die wav's sollen. Entweder als Argument (dann wirds 'kompliziert') oder als Config-Variable...

bye Malfi

Jochen

Re: mp32wav

#7 Post by Jochen »

Kleiner Bugfix: Die Zeile <pre> *) for INPUTFILE in $*; do</pre> sollte entweder <pre> *) for INPUTFILE ; do</pre>oder aber <pre> *) for INPUTFILE in "$@" ; do</pre>lauten, sonst bekommst Du Schwierigkeiten bei Dateien mit Leerzeichen. Bei Verwendung von $* bricht die Shell die Dateiliste noch mal nach Whitespace auf, so dass bei einer Datei 'Artist Titel.mp3' die Schleife 2mal laufen würde, einmal mit INPUTFILE gleich "Artist" und einmal gleich "Titel.mp3".

Jochen

Post Reply