Ламе - Как повторно закодировать все 320 Кбит/с mp3 к 192 Кбит/с mp3

Согласно заголовку. У меня есть много MP3s в формате на 320 Кбит/с, который я должен преобразовать в 192 Кбит/с. В настоящее время я использую lame --mp3input -b 192 который создает файл того же имени, но с дополнительным .mp3 расширением. Таким образом, я заканчиваю с foo.mp3.mp3.

Я должен смочь ввести каталог, просканировать подкаталоги для любых 320 Кбит/с и преобразовать в 192 Кбит/с и перезапись, если кто-либо найден. Ламе является даже лучшим инструментом для этого?

Спасибо

8
задан 14 October 2014 в 01:39

2 ответа

Lame один из лучших, которые можно найти, чтобы сделать эту задачу

, можно использовать команду lame -b 192 input.mp3 output.mp3

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

exiftool -AudioBitrate File.mp3 

, но Вам все еще нужен способ передать команды по каналу нахождения mp3 файл, проверка скорости передачи и преобразование...

2
ответ дан 16 November 2019 в 16:54

lame отлично подходит для этой задачи, но я собираюсь использовать ffmpeg и ffprobe для этого ответа, потому что я знаю их как свои пять пальцев и потому что они могут быть обобщены к больше, чем просто MP3s. В первую очередь:

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. При выполнении этого на 320k Кбит/с MP3 Вы получите строку как это:

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

Это будет только действовать на MP3s на 320 Кбит/с. Попробуйте его несколькими тестовыми файлами.

Следующий шаг должен получить эту работу с несколькими файлами. Существует два стандартных способа сделать это: a 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 {}' 
11
ответ дан 23 November 2019 в 05:32

Другие вопросы по тегам:

Похожие вопросы: