• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[HowTo] in MP3 mit der gewünschten Bitrate umwandeln?

tat2

Newbie
Wenn ich wave Dateien von Audio CD rippen möchte, nutze ich Grip (mit lame) und das funktioniert einwandfrei.

Jetzt habe ich aber noch einige MP3 Dateien, die höher als 256 Bit sind und die frisst mein tragbarer MP3 Player nicht.

Jezt brauche ich ein Programm mit dem ich MP3 Dateien in WAV umwandeln kann, um sie anschlißend wieder in MP3 mit der gewünschten Bitrate umwandeln zu können.

Ich habe jetzt schon einen Beitrag gelesen in dem beschrieben wurde wie ich die Bitrate von MP3 Dateien direkt ändern kann. Aber das war nur textbasiert beschrieben. Und das ist mir zu viel Schreiberei.

Also wenn jemand ein grafisches Programm kennt, mit dem ich von MP3 zu WAV und wieder zu MP3 umwandeln kann wäre ich sehr sehr dankbar. Würde mir stinken, wenn ich dafür doch noch Windoofs bemühen müsste. :?
 
A

Anonymous

Gast
Hi.

Nimm doch den Konsoleplayer 'mpg123'. Mit dem Teil kannste nicht nur abspielen, sondern auch 'WAVs' schreiben. Hatte das Prob was du hast auch mal. Ein einzelnen Song kannste so zu einer Wav-Datei machen.
Code:
mpg123 --wav sample.wav musik.mp3
Mit Hilfe eines kleinen Scripts kannste ein ganzes Verzeichnis beispielweise so in einem Rutsch wandeln.
Code:
#!/bin/bash
#
for SAMPLE in *.mp3
do
#
mpg123 --wav "$SAMPLE".wav "$SAMPLE"
#
done

Gruß
 

nobbiew

Hacker
Wenn du dich doch an die "schreiberei" gewöhnen könntest, ginge es auch direkt ohne den Umweg nach wav.

Mit lame kannst du einfach nur die Bitrate ändern. Ich kann nur leider grade die Syntax nicht rausfinden, da ich mein Beispiel zu Hause habe. Vom prinzip her geht es so:
Code:
for x in `find VERZEICHNIS -iname '*.mp3'`
do
    lame --mp3input -optionen "$x" "$x.tmp"
    mv "$x.tmp" "$x"
done
Und dann noch etwas Geduld u. alles ist erledigt. Wobei du -optionen noch durch die entsprechenen Sampling-Optionen von lame ersetzen musst.

Achtung das Script überschreibt deine alten Dateien!!!

Optional geht´s auch so
Code:
for x in `find VERZEICHNIS -iname '*.mp3'`
do
   path=`echo $x|sed 's/\/[^\/]*$//i'`;
   mkdir -p "/tmp/$path";
   lame --mp3input -optionen "$x" "/tmp/$x"
done
Dabei wird unter /tmp die gleiche Verzeichnisstruktur angelegt u. die neuen MP3´s dort abgelegt

Und jetzt behaupte noch mal, das sei viel schreiberei. Versuch das mal mit audacity ohne tausend Klicks
 

nobbiew

Hacker
Sorry, bei den beiden Scripten ist mir ein kleiner Denkfehler unterlaufen

im 1. Fall sollte es so gehen
Code:
find . -type f -iname '*.mp3' -exec lame --mp3input -optionen "{}" "{}.tmp" \; -exec mv "{}.tmp" "{}" \;

im 2. Fall wirds etwas "komplizierter". Leg eine Datei /tmp/resample.x mit folgendem inhalt an
Code:
#!/bin bash
path=`echo $1|sed 's/\/[^\/]*$//i'`; 
mkdir -p "/tmp/$path"; 
lame --mp3input -optionen "$1" "/tmp/$1"
Wie gesagt -optionen musst du mit den sample-Optionen von lame ersetzten. Das gilt auch für den 1. Fall.

Dann mit
Code:
chmod a+x /tmp/resample.x
die Datei ausführbar machen und mit
Code:
find . -type f -iname '*.mp3' -exec /tmp/resample.x "{}" \;
das ganze ausführen.
 

spunti

Hacker
find . -type f -iname '*.mp3' -exec lame --mp3input -b 128 "{}" "{}.tmp" \; -exec mv "{}.tmp" "{}" \;

...ist eine ziemlich freakige Zeile, aber funktioniert.
Ich hab übrigens mal das Internet durchforstet und 192 Bit sollte man schon nehmen, wenn man genug Platz hat und an CD-Qualität rankommen will.

danke
spunti

Edit: Das gilt natürlich für's Umwandeln von CD/wav in Mp3.
Von Mp3 nach Mp3 ist nie so gut, selbst mit 320 Bit.
 
Da ich auch nach der Möglichkeit gesucht habe, MP3s zu resamplen, habe ich diesen Thread mit großem Interesse gelesen. Allerdings geht es mir als Neueinsteiger auch darum, mein Verständnis zu verbessern. Daher habe ich ein paar Fragen:
nobbiew schrieb:
im 2. Fall wirds etwas "komplizierter". Leg eine Datei /tmp/resample.x mit folgendem inhalt an
Code:
#!/bin bash
path=`echo $1|sed 's/\/[^\/]*$//i'`; 
mkdir -p "/tmp/$path"; 
lame --mp3input -optionen "$1" "/tmp/$1"
Die erste Zeile ist mir klar, die zeigt wohl an, dass es sich um ein Script handelt. (Oder liege ich da falsch?)
Wenn ich das richtig interpretiere, wird in der zweiten Zeile ein Pfad festgelegt. Aber was passiert da genau? Ich vermute, dass durch "echo $1" der erste an das Script übergebene Parameter zum Bestandteil des Pfadnamens wird. Ist das richtig? Was ich garnicht verstehe, ist der kryptisch aussehende Teil, der dann folgt. Was "sed" prinzipiell macht, konnte ich zwar nachschlagen, aber was hier passiert ist mir schleierhaft.
Die dritte Zeile ist klar; in der 4. Zeile wird lame mit den entsprechenden Optionen aufgerufen. Allerdings frage ich mich, wofür "$1" jetzt genau steht.
nobbiew schrieb:
Dann mit
Code:
chmod a+x /tmp/resample.x
die Datei ausführbar machen und mit
Code:
find . -type f -iname '*.mp3' -exec /tmp/resample.x "{}" \;
das ganze ausführen.
An dieser Stelle frage ich mich, wofür bei dem Aufruf des Scriptes "{}" \ steht.
Und was ist der Unterschied zwischen -iname und -name (letzteres habe ich in Beschreibungen zu .find gefunden, ersteres nicht)?
Muss man das Script in dem Ordner ausführen, in dem auch die Quelldateien liegen?
 

nobbiew

Hacker
Also ich versuch´s mal zu erklären:

Code:
#!/bin bash
legt den Skriptinterpreter fest. Was noch keiner festgestellt hat, da ist ein Fehler drin. Richtig ist:
Code:
#!/bin/bash

Code:
path=`echo $1|sed 's/\/[^\/]*$//i'`;
extrahiert aus dem Namen der Datei (inclusive Pfad) den Pfad. Genauer genommen wird vom Übergabeparameter $1 von hinten weg alles bis zum 1. / entfernt.
Code:
mkdir -p "/tmp/$path";
erzeugt in /tmp wieder die Pfadstruktur, die auch im Quellverzeichnis existierte (Nur zum leichter zurechtfinden und dass nicht aus versehen gleichlautende Stücke überschrieben werden)

Code:
lame --mp3input -optionen "$1" "/tmp/$1"
Konvertiert die Dateien nach /tmp/... Allerdings musst du -optionen noch durch die gewünschten Optionen austauschen. Das war nur eine Schnellanleitung zum selberbauen, keine fertige Lösung. $1 ist in dem Fall der Pfad (inclusive Dateinamen) zum Quellstück.


Code:
find . -type f -iname '*.mp3' -exec /tmp/resample.x "{}" \;
{} steht für den Dateinamen, den find gefunden hat, und nur der Vollstädnigkeit halber \; steht für das Ende der Zeile, das der Option -exec übergeben werden soll. Sonst kann -exec nicht erkennen welche Paramter dem find und welche dem Prozeduraufruf übergeben werden sollen.

Ach ja u. -iname steht für -name + ignore case. D.h. Groß u. Kleinschreibung wird nicht beachtet. Ist vor allem für Windowsbenutzer nicht immer verständlich, warum Sound.mp3 nicht gleich Sound.MP3 ist.


Das Script kann im prinzip überall stehen, da es seine Eingabeinformationen aus $1 bezieht u. die Ausgabe immer nach /tmp/... erfolgt. Allerdings musst du das Script entweder irgendwo im Suchpfad hinterlegen o. wie hier im Beispiel mit absolutem Pfad (/tmp/resample.x) ansprechen

Wenn du das Skript etwas flexibler gestalten willst kann du mit weiteren parametern arbeiten:

Beispiel:

Code:
#!/bin/bash
path=`echo $1|sed 's/\/[^\/]*$//i'`;
mkdir -p "$2/$path";
lame --mp3input $3 "$1" "$2/$1"

Dann sieht die find-Zeile so aus:
Code:
find . -type f -iname '*.mp3' -exec /tmp/resample.x "{}" "zielpfad" "-lameoptionen" \;
Aber bitte die Anführungszeichen nicht vergessen. Und dran denken. Hier wird keine Fehlerbehandlung gemacht. Wenn du z.B. den Zielpfad vergisst wirst du ein völlig unerwatetes Ergebnis haben (nämlich, dass die lameoptionen als zielpfad interpretiert werden - und das geht wirklich - und vermutlich beim mkdir einen Fehler verursachen - wenn du Glück hast, weil dann nichts weiter passiert)

Du siehst schon, ich schreibe gerne "kranke" Kommandozeilen. Aber wer die mal drauf hat, möchte jede GUI wegschmeißen. Und nun viel Spaß beim ausprobieren und weiterlernen.
 
Vielen Dank erst mal. :) Das hat mir schon mal ein gutes Stück weitergeholfen.
nobbiew schrieb:
Code:
path=`echo $1|sed 's/\/[^\/]*$//i'`;
extrahiert aus dem Namen der Datei (inclusive Pfad) den Pfad. Genauer genommen wird vom Übergabeparameter $1 von hinten weg alles bis zum 1. / entfernt.
Wo ich da noch nicht durchblicke ist das 's/\/[^\/]*$//i'. Da hilft mir auch die mir bekannte Manpage nicht unbedingt weiter. Aber ich denke, da werde ich mal ausführlich das Manual bemühen und zu "ungefährlichen" Selbstversuchen greifen müssen, um das zu verstehen.
Nur eine Frage: Ist jede Kombination "\/" ein maskierter Slash?
 

nobbiew

Hacker
Ist es.
Und da hilft dir auch keine Man-Page. Was du da brauchst ist "Reguläre Ausdrücke" von O´Reilly. Zumindest hat mir das sehr geholfen.

In dem Fall gilt folgendes

's/\/[^\/]*$//i'
's leitet ein Suchen und ersetzten ein ein
/ trennt die Felder voneinander
\/ Sucht nach einem /
[^\/] Sucht nach allen Zeichen außer /
* such die vorhergehnde Zeichenklasse ([]) oder Zeichen beliebig oft (keinmal ist auch ok, was oft zu Verwirrungen führt)
$ Begrenzt die vorhergehende Suche an das Zeilenende. Dadurch muss der Suchstring von hinten gelesen werden.
i' Beendet den Suchstring und weist den sed an auf Groß/Kleinschreibung nicht zu achten (hätte ich mir hier sparen können, ist aber alte Gewohnheit)

Dadurch liest sich der Suchstring folgendermaßen:
Suche in der Zeichenkette von Hinten nach allen Zeichen außer dem /, suche dann nach einem / vor der gefunden Zeichenkette und ersetze alles durch nichts, da hinter dem 2. u. 3. Feldbegrenzer (/) keine Zeichen stehen.

Viel Spaß beim Ausprobieren, und glaub mir, das war noch einer der einfacheren regulären Ausdrücke. Aber hier gilt das gleiche, wie für die Kommandozeile; wer sie einigermaßen beherrscht kann sich ein Leben ohne sie nicht mehr vorstellen.
 

TomcatMJ

Guru
Hm, so ein kleines Script schreit eigentich nach einem Übertrag ins Wiki ;)
Frage an den Scriptauthor: Hast du nicht Lust das Script in http://wiki.linux-club.de/opensuse/Shellscripte#kleinere_Hilfsscripte eingereiht in einen eigenen Artikel zu packen? Die Frage nach Bitratenwandlung kommt ja doch öfters mal hier vor...

Bis denne,
Tom (der dort ja auch sein Videoconverterscript reingepackt hat*g*)
 
Weil vielleicht gerade Einsteiger über diesen thread stolpern, würde ich gerne noch 'ne GUI-Lösung erwähnen. Der » soundKonverter « bietet eine einerseits leicht zu bedienende, andererseits sehr flexible Oberfläche für so ziemlich alle Konvertierungsrichtungen, die sich denken lassen. Wirklich sehr empfehlenswert.

Für SuSE gibt's ein extra-Repo dafür:

Code:
[home:HessiJames]
type = rpm-md
name = HessiJames's Home Project (openSUSE_10.3)
baseurl = http://download.opensuse.org/repositories/home:/HessiJames/openSUSE_10.3/

(Für die 11.0 und die 11.1 einfach die URL bzw. den Namen anpassen - YaST benötigt natürlich nur die URL, um dieses Repo einzubinden)
 
Oben