lame
doskonale nadaje się do tego zadania, ale ja zamierzam wykorzystać ffmpeg
i ffprobe
do tej odpowiedzi, bo znam je jak własną kieszeń i dlatego mogą być uogólnione na więcej niż tylko MP3. Po pierwsze:
sudo apt-get install ffmpeg
Nie znam narzędzia, które potrafiłoby odczytać pliki multimedialne, a następnie od razu nadpisać dane wejściowe: musisz użyć pliku pośredniego. W przypadku pojedynczego pliku możesz wykonać:
ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3
mv temp.mp3 file.mp3
Możesz połączyć je w jedną linię:
ffmpeg -i file.mp3 -c:a libmp3lame -b:a 192k temp.mp3 && mv temp.mp3 file.mp3
&&
nie oznacza, że mv
polecenie nie zostanie wykonane, chyba że ffmpeg
kończy pracę z kodem 0 (co oznacza sukces).
Aby sprawdzić, jaką szybkość transmisji ma plik, możesz użyć ffprobe
:
ffprobe -show_streams -select_streams a:0 -v quiet file.mp3 | grep -F 'bit_rate=320000'
-show_streams
mówi, ffprobe
aby pokazać informacje o poszczególnych strumieniach; -select_streams
informuje, które wybrać, i a:0
oznacza „pierwszy strumień audio (jest to ważne w przypadku plików MP3 w przypadku okładek, które są przechowywane jako strumień wideo). Potok ( |
) pobiera standardowe wyjście ffprobe
i podaje je do grep
. grep
wypisze tylko te linie, które pasują do danego wzorca - w tym przypadku linie zawierające ciąg bit_rate=320000
. Jeśli uruchomisz to na plikach MP3 o szybkości 320 kb / s, otrzymasz następujący wiersz:
bit_rate=32000
Jeśli uruchomisz go na czymkolwiek z inną szybkością transmisji, nie uzyskasz żadnej wydajności; grep nie uda się dopasować i zakończy działanie ze statusem 1. Oznacza to, że możesz połączyć to polecenie za pomocą polecenia ffmpeg:
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
Lub, nieco bardziej czytelnie:
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
Działa to tylko w przypadku plików MP3 320 kb / s. Wypróbuj z kilkoma plikami testowymi.
Następnym krokiem jest rozpoczęcie pracy z wieloma plikami. Istnieją dwa standardowe sposoby wykonania tej czynności: for
pętla i find
polecenie. Następujące elementy będą działać na każdym pliku MP3 w katalogu:
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
To nie przejdzie do podkatalogów; w tym celu należy ustawić globstar
opcję powłoki:
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
Z 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"' '{}' \;
Wszystkie będą działały ściśle sekwencyjnie - będą konwertować tylko jeden plik na raz. Twój procesor jest jednak prawie na pewno zdolny do czegoś więcej; aby przyspieszyć, możesz użyć GNU 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
Lub:
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 {}'