lamedoskonale nadaje się do tego zadania, ale ja zamierzam wykorzystać ffmpegi ffprobedo 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 mvpolecenie nie zostanie wykonane, chyba że ffmpegkoń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_streamsmówi, ffprobeaby pokazać informacje o poszczególnych strumieniach; -select_streamsinformuje, które wybrać, i a:0oznacza „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 ffprobei podaje je do grep. grepwypisze 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: forpętla i findpolecenie. 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ć globstaropcję 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 {}'