Согласно заголовку. У меня есть много MP3s в формате на 320 Кбит/с, который я должен преобразовать в 192 Кбит/с. В настоящее время я использую lame --mp3input -b 192
который создает файл того же имени, но с дополнительным .mp3 расширением. Таким образом, я заканчиваю с foo.mp3.mp3
.
Я должен смочь ввести каталог, просканировать подкаталоги для любых 320 Кбит/с и преобразовать в 192 Кбит/с и перезапись, если кто-либо найден. Ламе является даже лучшим инструментом для этого?
Спасибо
Lame
один из лучших, которые можно найти, чтобы сделать эту задачу
, можно использовать команду lame -b 192 input.mp3 output.mp3
im не хороший с передачей по каналу команд, но можно использовать exiftool
для получения скорости передачи mp3 файла
exiftool -AudioBitrate File.mp3
, но Вам все еще нужен способ передать команды по каналу нахождения mp3 файл, проверка скорости передачи и преобразование...
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 {}'