Lame - Jak ponownie zakodować wszystkie pliki mp3 w formacie 320kbps na 192kbps mp3

9

Zgodnie z tytułem. Mam wiele plików MP3 w formacie 320 kb / s, które muszę przekonwertować na 192 kb / s. Obecnie używam, lame --mp3input -b 192który tworzy plik o tej samej nazwie, ale z dodatkowym rozszerzeniem .mp3. Skończyło się na tym foo.mp3.mp3.

Muszę być w stanie wejść do katalogu, przeskanować podkatalogi w poszukiwaniu dowolnych 320 kb / s i przekonwertować je na 192 kb / s i zastąpić, jeśli takie zostaną znalezione. Czy Lame jest nawet najlepszym narzędziem do tego?

Dzięki

Moif Murphy
źródło

Odpowiedzi:

12

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 {}' 
zła
źródło
Spektakularna odpowiedź. Zrobiłem coś razem przy użyciu kulawych, ale dawę to dawno temu. Zgłosi się.
Moif Murphy
Otrzymuję ten błąd: Unrecognized option 'select_streams' Failed to set value 'a:0' for option 'select_streams'
Moif Murphy
z avconv, zamień na:avconv -i {} -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}
lepe
2

Lame jest jednym z najlepszych, jakie możesz znaleźć, aby wykonać to zadanie

Możesz użyć polecenia lame -b 192 input.mp3 output.mp3

nie exiftooljestem dobry w poleceniach pipowania, ale możesz użyć, aby uzyskać przepływność pliku mp3

exiftool -AudioBitrate File.mp3 

ale nadal potrzebujesz sposobu, aby potokować polecenia wyszukiwania pliku mp3, sprawdzania szybkości transmisji i konwertowania ...

AdigaJo
źródło
edytowane dwukrotnie, naprawiając polecenie i dodając bitrate
AdigaJo