Lame - как перекодировать все 320kbps mp3 на 192kbps mp3

5

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

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

Спасибо

    
задан Moif Murphy 13.10.2014 в 23:39
источник

2 ответа

6

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 320k kbps, вы получите следующую строку:

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

Это будет действовать только на 320 kbps MP3. Попробуйте это с помощью нескольких тестовых файлов.

Следующий шаг - заставить это работать с несколькими файлами. Существует два стандартных способа: цикл 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 {}' 
    
ответ дан evilsoup 14.10.2014 в 11:58
2

Lame - одно из лучших, которое вы можете найти для выполнения этой задачи.

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

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

exiftool -AudioBitrate File.mp3 

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

    
ответ дан AdigaJo 14.10.2014 в 00:06