Lame - Come ricodificare tutti gli mp3 da 320kbps in mp3 a 192kbps


9

Come da titolo. Ho molti MP3 in formato 320kbps che devo convertire in 192kbps. Attualmente sto usando lame --mp3input -b 192quale crea un file con lo stesso nome ma con un'estensione extra .mp3. Quindi finisco con foo.mp3.mp3.

Devo essere in grado di accedere a una directory, scansionare le sottodirectory per qualsiasi 320kbps e convertirle in 192kbps e sovrascriverle se ne vengono trovate. Lame è anche lo strumento migliore per questo?

Grazie

Risposte:


12

lameè perfettamente adatto a questo compito, ma ho intenzione di usare ffmpege ffprobeper questa risposta, perché li conosco come il palmo della mia mano e perché possono essere generalizzati a più di un semplice MP3. Prima di tutto:

sudo apt-get install ffmpeg

Non sono a conoscenza di alcuno strumento in grado di leggere file multimediali e sovrascrivere immediatamente l'input: è necessario utilizzare un file intermedio. Per un singolo file, puoi fare:

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

Puoi combinarli in un'unica riga:

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

l' &&lì significa che il mvcomando non sarà eseguito a meno che ffmpegesce con stato 0 (che significa successo).

Per verificare la velocità in bit di un file, è possibile utilizzare ffprobe:

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

-show_streamsdice ffprobedi mostrare informazioni sui singoli flussi; -select_streamsindica quali selezionare e a:0indica "il primo flusso audio (questo è importante per i file MP3 nel caso della copertina, che viene archiviato come flusso video). Il pipe ( |) prende l'output standard di ffprobee lo alimenta grep. grepstamperà solo quelle linee che corrispondono a un determinato motivo - in questo caso, le linee che contengono la stringa bit_rate=320000. Se lo esegui su un MP3 da 320k kbps, otterrai una linea come questa:

bit_rate=32000

Se lo esegui su qualcosa con un bit rate diverso, non otterrai alcun output; grep non riuscirà a trovare una corrispondenza e uscirà con uno stato di 1. Ciò significa che puoi concatenare quel comando con il comando 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

O, un po 'più facilmente:

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

Funzionerà solo su MP3 da 320 kbps. Provalo con un paio di file di test.

Il prossimo passo è farlo funzionare con più file. Esistono due modi standard per farlo: un forciclo e il findcomando. Quanto segue agirà su ogni MP3 in una directory:

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

Questo non andrà nelle sottodirectory; per fare ciò, devi impostare l' globstaropzione shell:

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

Con 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"' '{}' \;

Tutti questi eseguiranno rigorosamente in sequenza: convertiranno solo un file alla volta. Il tuo processore è quasi sicuramente in grado di fare molto di più, però; per velocizzare le cose, potresti usare 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

O:

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 {}' 

Risposta spettacolare. Ho messo insieme qualcosa usando lame, ma lo darò io fa. Riferirà indietro.
Moif Murphy,

Ricevo questo errore: Unrecognized option 'select_streams' Failed to set value 'a:0' for option 'select_streams'
Moif Murphy,

con avconv, sostituirlo a:avconv -i {} -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}
Lepe

2

Lame è uno dei migliori che puoi trovare per fare questo compito

Puoi usare il comando lame -b 192 input.mp3 output.mp3

non sono bravo con i comandi di piping ma puoi usarlo exiftoolper ottenere il bit rate del file mp3

exiftool -AudioBitrate File.mp3 

ma hai ancora bisogno di un modo per convogliare i comandi di ricerca di file mp3, controllo del bitrate e conversione ...


modificato due volte, riparando il comando e aggiungendo bitrate
AdigaJo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.