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