Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

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

Alles rund um das Thema Multimedia unter Linux

Moderator: Moderatoren

Antworten
tat2
Newbie
Newbie
Beiträge: 39
Registriert: 23. Nov 2004, 06:05
Wohnort: Heemsen

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

Beitrag von tat2 »

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. :?
Stay RUDE, stay REBEL ! ! !

www.familie-mauch.net
Gast

Beitrag von 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: Alles auswählen

mpg123 --wav sample.wav musik.mp3
Mit Hilfe eines kleinen Scripts kannste ein ganzes Verzeichnis beispielweise so in einem Rutsch wandeln.

Code: Alles auswählen

#!/bin/bash
#
for SAMPLE in *.mp3
do
#
mpg123 --wav "$SAMPLE".wav "$SAMPLE"
#
done
Gruß
Benutzeravatar
nobbiew
Hacker
Hacker
Beiträge: 497
Registriert: 1. Mär 2004, 23:26

Beitrag von nobbiew »

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: Alles auswählen

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: Alles auswählen

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
Benutzeravatar
nobbiew
Hacker
Hacker
Beiträge: 497
Registriert: 1. Mär 2004, 23:26

Beitrag von nobbiew »

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

im 1. Fall sollte es so gehen

Code: Alles auswählen

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: Alles auswählen

#!/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: Alles auswählen

chmod a+x /tmp/resample.x
die Datei ausführbar machen und mit

Code: Alles auswählen

find . -type f -iname '*.mp3' -exec /tmp/resample.x "{}" \;
das ganze ausführen.
Benutzeravatar
spunti
Hacker
Hacker
Beiträge: 598
Registriert: 6. Mai 2004, 10:49

Beitrag von spunti »

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.
Zuletzt geändert von spunti am 20. Jun 2005, 15:24, insgesamt 1-mal geändert.
Uli_Gebhardt
Newbie
Newbie
Beiträge: 10
Registriert: 26. Apr 2005, 06:43

Beitrag von Uli_Gebhardt »

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 hat geschrieben: im 2. Fall wirds etwas "komplizierter". Leg eine Datei /tmp/resample.x mit folgendem inhalt an

Code: Alles auswählen

#!/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 hat geschrieben: Dann mit

Code: Alles auswählen

chmod a+x /tmp/resample.x
die Datei ausführbar machen und mit

Code: Alles auswählen

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?
Benutzeravatar
nobbiew
Hacker
Hacker
Beiträge: 497
Registriert: 1. Mär 2004, 23:26

Beitrag von nobbiew »

Also ich versuch´s mal zu erklären:

Code: Alles auswählen

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

Code: Alles auswählen

#!/bin/bash

Code: Alles auswählen

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: Alles auswählen

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: Alles auswählen

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: Alles auswählen

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: Alles auswählen

#!/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: Alles auswählen

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.
Uli_Gebhardt
Newbie
Newbie
Beiträge: 10
Registriert: 26. Apr 2005, 06:43

Beitrag von Uli_Gebhardt »

Vielen Dank erst mal. :) Das hat mir schon mal ein gutes Stück weitergeholfen.
nobbiew hat geschrieben:

Code: Alles auswählen

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?
Benutzeravatar
nobbiew
Hacker
Hacker
Beiträge: 497
Registriert: 1. Mär 2004, 23:26

Beitrag von nobbiew »

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.
Benutzeravatar
TomcatMJ
Guru
Guru
Beiträge: 2484
Registriert: 1. Apr 2004, 00:29
Wohnort: Köln
Kontaktdaten:

Beitrag von TomcatMJ »

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/Shel ... lfsscripte 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*)
gropiuskalle
Guru
Guru
Beiträge: 4603
Registriert: 20. Nov 2007, 15:17
Wohnort: Berlin
Kontaktdaten:

Beitrag von gropiuskalle »

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: Alles auswählen

[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)
Antworten