Lame - So codieren Sie alle MP3-Dateien mit 320 KBit / s in MP3-Dateien mit 192 KBit / s neu

9

Laut Titel. Ich habe viele MP3s im 320-Kbit / s-Format, die ich in 192-Kbit / s konvertieren muss. Derzeit verwende ich lame --mp3input -b 192eine Datei mit demselben Namen, jedoch mit der zusätzlichen Erweiterung .mp3. Also ende ich mit foo.mp3.mp3.

Ich muss in der Lage sein, ein Verzeichnis einzugeben, die Unterverzeichnisse nach 320 kbit / s zu durchsuchen und in 192 kbit / s zu konvertieren und zu überschreiben, wenn welche gefunden werden. Ist Lame überhaupt das beste Werkzeug dafür?

Vielen Dank

Moif Murphy
quelle

Antworten:

12

lameist perfekt für diese Aufgabe geeignet, aber ich werde verwenden ffmpegund ffprobediese Antwort für, weil ich sie wie die Rückseite meiner Hand kennen und weil sie mehr als nur MP3s verallgemeinert werden können. Als erstes:

sudo apt-get install ffmpeg

Es gibt kein mir bekanntes Tool, mit dem Mediendateien gelesen und die Eingabe sofort überschrieben werden können: Sie müssen eine Zwischendatei verwenden. Für eine einzelne Datei können Sie Folgendes tun:

ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3
mv temp.mp3 file.mp3

Sie können diese in einer einzigen Zeile kombinieren:

ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 && mv temp.mp3 file.mp3

Das &&dort bedeutet, dass der mvBefehl erst ausgeführt wird, wenn er ffmpegmit dem Status 0 beendet wird (was Erfolg bedeutet).

Um zu überprüfen, welche Bitrate eine Datei hat, können Sie Folgendes verwenden ffprobe:

ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000'

-show_streamsweist ffprobean, Informationen über einzelne Streams anzuzeigen; -select_streamsteilt ihm mit, welche ausgewählt werden sollen, und a:0bedeutet "der erste Audiostream" (dies ist wichtig für MP3-Dateien im Fall von Cover-Grafiken, die als Videostream gespeichert sind). Die Pipe ( |) nimmt die Standardausgabe von ffprobeund speist sie ein grep. grepdruckt nur die Zeilen, die einem bestimmten Muster entsprechen - in diesem Fall Zeilen, die die Zeichenfolge enthalten bit_rate=320000. Wenn Sie dies auf einem 320k kbps MP3 ausführen, erhalten Sie eine Zeile wie die folgende:

bit_rate=32000

Wenn Sie es mit einer anderen Bitrate ausführen, erhalten Sie überhaupt keine Ausgabe. grep kann keine Übereinstimmung herstellen und wird mit dem Status 1 beendet. Dies bedeutet, dass Sie diesen Befehl mit dem Befehl ffmpeg verketten können:

ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000' && ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 && mv temp.mp3 file.mp3

Oder etwas lesbarer:

ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000' &&
ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 &&
mv temp.mp3 file.mp3

Dies gilt nur für MP3s mit 320 kbit / s. Versuchen Sie es mit ein paar Testdateien.

Der nächste Schritt besteht darin, dies mit mehreren Dateien zum Laufen zu bringen. Hierfür gibt es zwei Standardmethoden: eine forSchleife und den findBefehl. Folgendes wirkt sich auf jede MP3-Datei in einem Verzeichnis aus:

for f in *.mp3; do 
ffprobe -show_streams -select_streams a:0 "$f" | grep -F 'bit_rate=320000' &&
ffmpeg -y -i "$f" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$f"
done

Dies wird nicht in Unterverzeichnisse gehen; Dazu müssen Sie die globstarShell-Option festlegen :

shopt -s globstar
for f in **/*.mp3; do
ffprobe -show_streams -select_streams a:0 "$f" | grep -F 'bit_rate=320000' &&
ffmpeg -y -i "$f" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$f"
done

Mit find:

find . -name '*.mp3' -exec sh -c 'ffprobe -show_streams -select_streams a:0 "$0" | grep -F "bit_rate=320000" &&
ffmpeg -y -i "$0" -c:a libmp3lame -b:a 192k /tmp/temp.mp3 && mv /tmp/temp.mp3 "$0"' '{}' \;

All dies wird streng nacheinander ausgeführt - es wird jeweils nur eine Datei konvertiert. Ihr Prozessor ist jedoch mit ziemlicher Sicherheit zu mehr fähig. Um die Dinge zu beschleunigen, können Sie GNU verwenden parallel:

sudo apt-get install parallel
shopt -s globstar
parallel 'ffprobe -show_streams -select_streams a:0 {} | grep -F "bit_rate=320000" &&
ffmpeg -y -i {} -c:a libmp3lame -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}' ::: **/*.mp3

Oder:

find . -name '*.mp3' | parallel 'ffprobe -show_streams -select_streams a:0 {} | grep -F "bit_rate=320000" &&
ffmpeg -y -i {} -c:a libmp3lame -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}' 
Übelsuppe
quelle
Spektakuläre Antwort. Ich habe etwas mit Lahmem zusammengeschustert, aber ich werde es vor einiger Zeit geben. Werde zurückmelden.
Moif Murphy
Ich Unrecognized option 'select_streams' Failed to set value 'a:0' for option 'select_streams'
erhalte
mit avconv ersetzen Sie es durch:avconv -i {} -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}
lepe
2

Lame ist eines der besten, das Sie finden können, um diese Aufgabe zu erledigen

Sie können den Befehl verwenden lame -b 192 input.mp3 output.mp3

Ich bin nicht gut mit Piping-Befehlen, aber Sie können verwenden exiftool, um die Bitrate der MP3-Datei zu erhalten

exiftool -AudioBitrate File.mp3 

Sie müssen jedoch noch eine Möglichkeit finden, die Befehle zum Suchen von MP3-Dateien, Überprüfen der Bitrate und Konvertieren ...

AdigaJo
quelle
zweimal bearbeitet, den Befehl
korrigiert