Lame - Cara mengkodekan ulang semua 320 kbps mp3 ke 192kbps mp3

9

Sesuai judul. Saya memiliki banyak MP3 dalam format 320kbps yang perlu saya konversi menjadi 192kbps. Saat ini saya menggunakan lame --mp3input -b 192yang membuat file dengan nama yang sama tetapi dengan ekstensi .mp3 tambahan. Jadi saya berakhir dengan foo.mp3.mp3.

Saya harus dapat memasuki direktori, memindai sub direktori untuk setiap 320kbps dan mengkonversi ke 192kbps dan menimpa jika ada yang ditemukan. Apakah Lame bahkan alat terbaik untuk ini?

Terima kasih

Moif Murphy
sumber

Jawaban:

12

lamesangat cocok untuk tugas ini, tetapi saya akan menggunakan ffmpegdan ffprobeuntuk jawaban ini, karena saya tahu mereka menyukai bagian belakang tangan saya dan karena mereka dapat digeneralisasikan ke lebih dari sekedar MP3. Pertama-tama:

sudo apt-get install ffmpeg

Tidak ada alat yang saya ketahui yang dapat membaca file media dan kemudian langsung menulis input: Anda perlu menggunakan file perantara. Untuk satu file, Anda dapat melakukan:

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

Anda dapat menggabungkan ini menjadi satu baris:

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

di &&sana berarti bahwa mvperintah tidak akan dieksekusi kecuali ffmpegkeluar dengan status 0 (yang berarti sukses).

Untuk memeriksa berapa bit rate sebuah file, Anda dapat menggunakan ffprobe:

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

-show_streamsmemberitahu ffprobeuntuk menunjukkan informasi tentang aliran individu; -select_streamsmemberi tahu yang mana yang harus dipilih, dan a:0berarti 'aliran audio pertama (ini penting untuk file MP3 dalam kasus sampul, yang disimpan sebagai aliran video). Pipa ( |) mengambil output standar ffprobedan mengumpankannya ke grep. grephanya akan mencetak garis-garis yang cocok dengan pola yang diberikan - dalam hal ini, garis yang berisi string bit_rate=320000. Jika Anda menjalankan ini pada MP3 320k kbps, Anda akan mendapatkan baris seperti ini:

bit_rate=32000

Jika Anda menjalankannya dengan bit rate berbeda, Anda tidak akan mendapatkan output sama sekali; grep akan gagal melakukan kecocokan, dan akan keluar dengan status 1. Ini berarti Anda dapat mengaitkan perintah itu dengan perintah 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

Atau, sedikit lebih mudah dibaca:

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

Itu hanya akan bekerja pada MP3 320 kbps. Cobalah dengan beberapa file uji.

Langkah selanjutnya adalah membuatnya bekerja dengan banyak file. Ada dua cara standar untuk melakukan ini: satu forloop, dan findperintah. Berikut ini akan bertindak pada setiap MP3 dalam direktori:

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

Ini tidak akan masuk ke subdirektori; untuk melakukannya, Anda harus mengatur globstaropsi 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

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

Semua ini akan berjalan sangat berurutan - mereka hanya akan mengkonversi satu file pada satu waktu. Prosesor Anda hampir pasti mampu melakukan lebih dari itu; untuk mempercepat, Anda bisa menggunakan 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

Atau:

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 {}' 
Evilsoup
sumber
Jawaban yang spektakuler. Saya telah membuat sesuatu yang lumpuh menggunakan lumpuh tetapi saya akan memberikan ini lalu. Akan melaporkan kembali.
Moif Murphy
Saya mendapatkan kesalahan ini: Unrecognized option 'select_streams' Failed to set value 'a:0' for option 'select_streams'
Moif Murphy
dengan avconv, ganti ke:avconv -i {} -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}
lepe
2

Lame adalah salah satu yang terbaik yang dapat Anda temukan untuk melakukan tugas ini

Anda bisa menggunakan perintah lame -b 192 input.mp3 output.mp3

Saya tidak baik dengan perintah perpipaan tetapi Anda dapat menggunakan exiftooluntuk mendapatkan bit rate file mp3

exiftool -AudioBitrate File.mp3 

tetapi Anda masih memerlukan cara untuk mengirim perintah untuk mencari file mp3, memeriksa bitrate dan mengonversi ...

AdigaJo
sumber
diedit dua kali, memperbaiki perintah dan menambahkan bitrate
AdigaJo