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)

  1. MP3 уже снят с производства (в 2017 году), устаревший кодек. Интернет уже перешел на AAC (более эффективный и качественный кодек):

    ffmpeg -i filenameee.m4a -acodec copy output.aac
    
  2. Однако, если вы все еще хотите использовать 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 было несколько обновлений).

Хорошая новость в том, что вы можете заменитьwith — в конце концов, он поставляется вместе с , поэтому вам не нужно добавлять для этого дополнительный пакет.в лучшем случае сложно привести к правильному формату, но после долгих поисков в Google я вроде как нашел решение, которое действительно извлекает правильную скорость передачи данных (по крайней мере, для первого потока в M4A — если у вас много , это, вероятно, не сработает):

      ffprobe -v quiet -of flat=s=_ -show_entries format=bit_rate <source filename>

В результате должно получиться что-то вроде:

      format_bit_rate="324440"

Для этого требуется немного другой (и более простой) способ анализа, поэтому я написал для этого собственный сценарий с одной особенностью: в моем случае на моем Mac есть много альбомов, некоторые из которых в формате M4A, и для которых требуется конвертирую в MP3 для моего недорогого автомобильного аудиоплеера. Существует по крайней мере множество инструментов, которые делают это, некоторые даже просто интерфейсы на основе графического интерфейса, но не имеют ничего общего с «контролем» и делают это с самого начала.!

Итак, скопируйте и вставьте приведенный ниже скрипт, поместите его в файл, добавьте необходимыеи дайте ему возможность работать, вызвав его с одним параметром, которым является каталог, в котором находится ваша коллекция файлов M4A. Как и @jbowman, я поместил конвертированные файлы вкаталог, но с одной особенностью: он добавляет название альбома в качестве дополнительного подкаталога (по сути, последний элемент каталога, переданный в скрипт) — так что все снова будет сгруппировано по названию альбома :)

      #!/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-файлы в любом случае не смогут воспроизводиться на обычных низкотехнологичных устройствах.

тем не менее, преобразование по-прежнему выполняется и ограничивается скоростью 320 Кбит/с (согласно спецификациям)

Сценарий также доступен в виде gist.


Обновление: спасибо @mashuptwice за проверку и исправление некоторых деталей сценария (см. комментарии).

Мой файл m4a вообще не конвертировался с помощью ffmpeg (создавал нечитаемый файл mp3 примерно такого же размера, как m4a). Для меня это помогло использовать vlc для преобразования:

  1. СМИ ->
  2. Конвертировать\Сохранить ->
  3. Выбрать файл ->
  4. Конвертировать файл ->
  5. Выберите профиль «Аудио mp3) ->
  6. нажмите кнопку гаечного ключа возле профиля ->
  7. Выберите Аудиокодек и измените 128 кбит/с на 320 ->
  8. нажми сохранить ->
  9. Введите имя выходного файла ->
  10. Начинать

Если вы работаете на 48 кГц и не менее 24 бит во входном файле (из файлового редактора i.ex.) -q:a 0 будет воспроизводить 20 кГц не с таким большим файлом, как flac... Но звук низкого качества, если только вы не уменьшите шум от высоких частот (шипение) с помощью звуковых редакторов, созданных в преобразованиях, которые будут воспроизводиться, затем будут использовать файл данных как неслышная ВЧ, но дорогой шум.

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