FFMPEG: Конвертируйте файлы m4a в mp3 без значительной потери информации / качества. Автоматизированный битрейт
У меня есть загруженные аудиофайлы (около 1000), которые я хочу конвертировать из m4a в mp3, чтобы я мог воспроизвести их на проигрывателе компакт-дисков, который имеет порт USB.
Я пытался сделать что-то простое, как: ffmpeg -i FILE.m4a FILE.mp3
но это, кажется, снижает битрейт до очень низкого значения, а это не то, что я хочу.
Точно так же я не хочу конвертировать, используя постоянный битрейт, такой как 320k, потому что некоторые файлы, которые я конвертирую, имеют размер 320k m4a, а некоторые имеют низкое качество, как 96k m4a.
Кажется, нет смысла форсировать 320k, так как некоторые файлы станут во много раз больше, чем нужно. Точно так же нет смысла уничтожать все мои файлы с разрешением 320 КБ, преобразовав их во что-то намного меньшее, чем 96 КБ. (На данный момент файлы конвертируются примерно в 50к.)
Кто-нибудь знает, как я могу это сделать? Что я действительно хочу сделать, так это сказать ffmpeg, чтобы он конвертировал все файлы m4a в каталоге в mp3, сохраняя при этом текущее качество звука настолько, насколько это возможно. (Конечно, при преобразовании файлов с потерями в форматы с потерями могут возникнуть некоторые дополнительные потери.)
Спасибо за вашу помощь. Если это невозможно, существует ли какой-либо сценарий, который может определить требуемое качество при индивидуальном преобразовании файлов?
PS: Я работаю на Intel Mac, но у меня также есть Ubuntu Box.
7 ответов
VBR
Вы можете использовать -qscale:a
вариант в ffmpeg
создать MP3-выход с переменным битрейтом (VBR). Из FFmpeg Wiki: Кодирование VBR (переменная скорость передачи битов) mp3 аудио:
Контроль качества с
-qscale:a
(или псевдоним-q:a
). Значения зависят от кодировщика, поэтому для libmp3lame диапазон составляет 0-9, где более низкое значение является более высоким качеством. 0-3 обычно дает прозрачные результаты, 4 (по умолчанию) должно быть близко к прозрачности восприятия, а 6 обычно дает "приемлемое" качество. Опция-qscale:a
отображается на-V
опция в автономном инструменте интерфейса командной строки.
Вам придется поэкспериментировать, чтобы увидеть, какое значение для вас приемлемо. Также см. Hydrogen Audio: Рекомендуемые настройки LAME Encoder.
Кодирование нескольких файлов
Вы можете использовать Bash "for loop" для кодирования всех файлов в каталоге:
$ mkdir newfiles
$ for f in *.m4a; do ffmpeg -i "$f" -codec:v copy -codec:a libmp3lame -q:a 2 newfiles/"${f%.m4a}.mp3"; done
Получить ffmpeg
Рекомендуется использовать последнюю сборку ffmpeg
если возможно. См. Страницу загрузки FFmpeg для ссылок на сборки для OS X, Linux и Windows. Вы также можете следовать руководству по компиляции FFmpeg.
использовать FFmpeg (есть также много версий GUI)
MP3 уже снят с производства (в 2017 году), устаревший кодек. Интернет уже перешел на AAC (более эффективный и качественный кодек):
ffmpeg -i filenameee.m4a -acodec copy output.aac
Однако, если вы все еще хотите использовать MP3 (потому что он все еще поддерживается несколькими устройствами):
ffmpeg -i filenameee.m4a -acodec libmp3lame -ab 256k output.mp3
Это сработало для меня:
ffmpeg -i testing.m4v -b:a 192K -vn testing.mp3
Используя существующие ответы в качестве основы, я написал скрипт bash, который должен делать именно то, что задает вопрос на машине с Ubuntu (протестировано 16.04). Вам нужно будет установить avprobe
который находится в libav-tools
пакет. Вы можете установить avprobe
с помощью следующей команды
sudo apt-get install libav-tools
ПРИМЕЧАНИЕ. Было бы разумно сделать резервную копию любой папки, в которой вы запускаете этот сценарий, а также приложить все усилия, чтобы прочитать и понять, что он делает перед запуском.
Я не очень строго проверял YMMV.
#!/bin/bash
mkdir "mp3s"
for f in *.m4a;
do
bitrate=$(avprobe "${f}" 2> >(grep bitrate) | sed 's/^.*bitrate://g' | sed 's/[^0-9]*//g')
bitrate="${bitrate}K"
new_filename=$(echo "${f}" | sed 's/.m4a$/.mp3/g')
ffmpeg -y -i "${f}" -acodec libmp3lame -ab "${bitrate}" "mp3s/${new_filename}"
done
Приведенный выше ответ jbowman (на момент написания) является единственным, который действительно решает главную проблему OP, которая заключается в сохранении скорости передачи данных в исходном M4A - ни больше, ни меньше - в полученном MP3. Предоставленный им сценарий делает именно это, рассчитывая извлечь скорость передачи данных из M4A перед фактическим преобразованием в MP3.
К сожалению, в комплекте идет libav
библиотека, которая считается заброшенной , поскольку ее последний стабильный выпуск был в феврале 2018 года (в начале 2019 года на их git было несколько обновлений).
Хорошая новость в том, что вы можете заменить
ffprobe -v quiet -of flat=s=_ -show_entries format=bit_rate <source filename>
В результате должно получиться что-то вроде:
format_bit_rate="324440"
Для этого требуется немного другой (и более простой) способ анализа, поэтому я написал для этого собственный сценарий с одной особенностью: в моем случае на моем Mac есть много альбомов, некоторые из которых в формате M4A, и для которых требуется конвертирую в MP3 для моего недорогого автомобильного аудиоплеера. Существует по крайней мере множество инструментов, которые делают это, некоторые даже просто интерфейсы на основе графического интерфейса, но не имеют ничего общего с «контролем» и делают это с самого начала.
Итак, скопируйте и вставьте приведенный ниже скрипт, поместите его в файл, добавьте необходимые
#!/usr/bin/env bash
# Takes a directory as parameter and converts everything inside it
# from M4A to MP3, respecting the bitrate, and creating a directory
# for the converted files.
#
# Based on https://superuser.com/a/1211902/127382 by @jbowman (2017)
if [ -d "${1}" ]
then
echo "Doing conversions from directory \"${1}\"..."
else
echo "Source directory not found! Please add it as a parameter, e.g.:"
echo " ${0} path/to/album/containing/mp3/files"
exit 1
fi
# Get the album's name from the first parameter
ALBUM_PATH="${1}"
ALBUM=$()basename "${ALBUM_PATH}")
echo "Attempting to process album \"${ALBUM}\" in source directory
\"${ALBUM_PATH}\"..."
# Create a directory for this run
mkdir -p "mp3s/${ALBUM}"
# Check if mkdir succeeded
if [[ $? -ne 0 ]]
then
echo "Could not create directory mp3s/${ALBUM} for output. Exiting..."
exit 2
fi
# Loop across the filnames in that directory that end in *.m4a, invoke
# ffprobe to extract the bitrate, then use ffmpeg to convert it into MP3
# and place the result inside the mp3s/${ALBUM}/ directory:
for f in "${ALBUM_PATH}"/*.m4a
do
echo "Before ffprobe... testing ${f}"
bitrate=$(ffprobe -v quiet -of flat=s=_ -show_entries format=bit_rate "${f}" | sed 's/[^0-9]*//g')
new_filename=$(basename "${f}" .m4a).mp3
echo "Reading ${f} and writing to mp3s/${ALBUM}/${new_filename} with bitrate ${bitrate}..."
# echo ffmpeg -y -i "${f}" -codec:a libmp3lame -b:a "${bitrate}" -q:a 2 "mp3s/${ALBUM}/${new_filename}"
ffmpeg -y -i "${f}" -codec:a libmp3lame -b:a "${bitrate}" -q:a 2 "mp3s/${ALBUM}/${new_filename}"
done
Задача: разрешить несколько каталогов в качестве параметра командной строки, что позволит прогонять длинный пакет по всей музыкальной библиотеке (тысячи песен!) и правильно организовывать их в соответствии с названиями альбомов. Текущий сценарий работает только для одного каталога (без подстановки имен каталогов, иначе результаты будут непредсказуемыми — это справедливое предупреждение!).
Предостережение: некоторые M4A действительно имеют очень высокую скорость передачи данных, и на нее немного жалуются — в конце концов, спецификации MP3 определяют максимальную скорость передачи данных как 320 Кбит/с, причем 192 Кбит/с (переменная скорость передачи данных) на практике является «лучшим» для человека. можно услышать со сжатием с потерями, обеспечиваемым MP3. Хотя LAME может (предположительно) развивать скорость до 640 Кбит/с, такие MP3-файлы в любом случае не смогут воспроизводиться на обычных низкотехнологичных устройствах.
Сценарий также доступен в виде gist.
Обновление: спасибо @mashuptwice за проверку и исправление некоторых деталей сценария (см. комментарии).
Мой файл m4a вообще не конвертировался с помощью ffmpeg (создавал нечитаемый файл mp3 примерно такого же размера, как m4a). Для меня это помогло использовать vlc для преобразования:
- СМИ ->
- Конвертировать\Сохранить ->
- Выбрать файл ->
- Конвертировать файл ->
- Выберите профиль «Аудио mp3) ->
- нажмите кнопку гаечного ключа возле профиля ->
- Выберите Аудиокодек и измените 128 кбит/с на 320 ->
- нажми сохранить ->
- Введите имя выходного файла ->
- Начинать
Если вы работаете на 48 кГц и не менее 24 бит во входном файле (из файлового редактора i.ex.) -q:a 0
будет воспроизводить 20 кГц не с таким большим файлом, как flac... Но звук низкого качества, если только вы не уменьшите шум от высоких частот (шипение) с помощью звуковых редакторов, созданных в преобразованиях, которые будут воспроизводиться, затем будут использовать файл данных как неслышная ВЧ, но дорогой шум.