lame
ist perfekt für diese Aufgabe geeignet, aber ich werde verwenden ffmpeg
und ffprobe
diese 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 mv
Befehl erst ausgeführt wird, wenn er ffmpeg
mit 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_streams
weist ffprobe
an, Informationen über einzelne Streams anzuzeigen; -select_streams
teilt ihm mit, welche ausgewählt werden sollen, und a:0
bedeutet "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 ffprobe
und speist sie ein grep
. grep
druckt 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 for
Schleife und den find
Befehl. 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 globstar
Shell-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 {}'