Lame - як перекодувати всі mp3 320kbps в mp3 до 192kbps mp3


9

Відповідно до назви. У мене багато MP3 у форматі 320kbps, який мені потрібно перетворити на 192kbps. В даний час я використовую, lame --mp3input -b 192який створює файл з такою ж назвою, але з додатковим розширенням .mp3. Так я закінчую foo.mp3.mp3.

Мені потрібно мати можливість ввести каталог, просканувати підкаталоги на будь-які 320kbps і перетворити на 192kbps та перезаписати, якщо такі знайдені. Чи Lame навіть найкращий інструмент для цього?

Дякую

Відповіді:


12

lameцілком підходить до цього завдання, але я буду використовувати ffmpegі ffprobeдля цієї відповіді, тому що я знаю їх, як тильну сторону моєї руки, і тому що їх можна узагальнити до більш ніж просто MP3-файлів. Поперше:

sudo apt-get install ffmpeg

Мені невідомо, що я знаю, що може читати мультимедійні файли, а потім перезаписувати вхід відразу: потрібно використовувати проміжний файл. Для одного файлу ви можете:

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

Ви можете об'єднати їх в один рядок:

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

&&там означає , що mvкоманда не буде виконана , якщо ffmpegвиходи зі станом 0 (що означає успіх).

Щоб перевірити, яка швидкість передачі бітів у файлі, ви можете використовувати ffprobe:

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

-show_streamsповідомляє ffprobeпоказувати інформацію про окремі потоки; -select_streamsповідомляє, які саме вибрати, і a:0означає «перший аудіопотік (це важливо для файлів MP3 у випадку обкладинки, яка зберігається як відеопотік). Труба ( |) приймає стандартний вихід ffprobeі подає його grep. grepбуде друкувати лише ті рядки, які відповідають заданому шаблону - у цьому випадку рядки, що містять рядок bit_rate=320000. Якщо ви запускаєте це на MP3 в 320 Кбіт / с, ви отримаєте такий рядок:

bit_rate=32000

Якщо запустити його на чому-небудь з іншою швидкістю передачі бітів, ви не отримаєте жодного результату; grep не зможе виконати збіг, і вийде зі статусом 1. Це означає, що ви можете зв’язати цю команду з командою 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

Або, трохи легше читати:

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

Це діятиме лише у форматі MP3 на 320 кбіт / с. Спробуйте це з парою тестових файлів.

Наступний крок - це працювати з кількома файлами. Існує два стандартних способи зробити це: forцикл і findкоманда. На кожен MP3 у каталозі діятиме наступне:

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

Це не перейде в підкаталоги; для цього потрібно встановити параметр globstarоболонки:

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

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

Усі вони працюватимуть строго послідовно - вони конвертують лише один файл за один раз. Хоча ваш процесор майже напевно здатний на більш ніж це; щоб прискорити роботу, ви можете використовувати 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

Або:

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

Ефектна відповідь. Я щось спільно обмотав за допомогою кульгавого, але я дам це тому. Повідомлять про це.
Моїф Мерфі

Я отримую цю помилку: Unrecognized option 'select_streams' Failed to set value 'a:0' for option 'select_streams'
Moif Мерфі

з avconv, замініть його на:avconv -i {} -b:a 192k {.}.temp.mp3 && mv {.}.temp.mp3 {}
lepe

2

Lame є одним з найкращих, що ви можете знайти для цього завдання

Ви можете використовувати команду lame -b 192 input.mp3 output.mp3

Я не добре з трубопровідними командами, але ви можете використовувати exiftoolшвидкість передачі файлів у форматі mp3

exiftool -AudioBitrate File.mp3 

але вам все одно потрібен спосіб передавати команди пошуку файлу mp3, перевірки бітрейту та перетворення ...


Редагували двічі, виправляючи команду та додаючи бітрейт
AdigaJo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.