Конвертируйте .flac в .mp3 с помощью ffmpeg, сохраняя все метаданные

88

Как я могу преобразовать .flac в .mp3 с помощью ffmpeg, сохранив все метаданные (то есть преобразовать комментарий Vorbis в файлах .flac в метаданные ID3v2 из .mp3)?

Вито Джентиле
источник
5
Обратите внимание , что в следующий раз вы должны задать ffmpegCli вопросы использования на Super User . Stack Overflow предназначен только для вопросов, связанных с программированием. Кроме того, FLAC официально поддерживает только комментарий Vorbis , поэтому я предполагаю, что вы хотите преобразовать в ID3v2 вместо «сохранить».
llogan
Хорошо, я исправил свой вопрос. Я спросил здесь, потому что я видел подобные вопросы в StackOverflow (например, это или это ), и предположил, что было бы интересно поделиться своими знаниями. Кроме того, я вижу, что есть тег ffmpeg , так почему бы не поделиться здесь моим решением? ffmpeg используется во многих приложениях многими разработчиками.
Вито Джентиле
3
FFmpeg тег говорит, «Вопросы интерактивного использования инструмента командной строки FFmpeg следует задавать на Super User.». Это не имеет большого значения, но я просто хотел указать на это, поскольку, на мой взгляд, здесь слишком много вопросов, не относящихся к теме.
llogan

Ответы:

152

Следующая команда сохраняет высокое качество в формате .mp3 (320 кбит / с), а метаданные из файла .flac преобразуются в формат ID3v2, который может быть включен в файлы .mp3:

ffmpeg -i input.flac -ab 320k -map_metadata 0 -id3v2_version 3 output.mp3
Вито Джентиле
источник
1
Стоит отметить, что "ffmpeg" может потребоваться заменить на "avconv".
shockburner
5
FWIW ffmpeg3.2 автоматически копирует метаданные в ID3v2 из FLAC без необходимости указывать -map_metadata 0 -id3v2_version 3, но не копирует в теги ID3v1. Я использую для этого отдельный инструмент.
Дай
1
текст песни все еще не копируется
user151496
1
Делит ли он flac, если есть несколько частей?
Артем
1
@Artyom У вас, вероятно, должен быть файл cue вместе с вашим flac, где отмечены точки разделения. В таком случае вы можете использовать shnsplit (консоль) или flacon (GUI), чтобы разделить файл и преобразовать части в mp3. Если у вас есть только один flac, вы можете либо написать для него cui, либо использовать параметры -ss и -t ffmpeg, чтобы вырезать каждую песню.
56

Идеальный ответ выше. Я использую его вместе с find, чтобы добавить все файлы FLAC в поддереве в iTunes с помощью этой команды

find . -name "*.flac" -exec ffmpeg -i {} -ab 160k -map_metadata 0 -id3v2_version 3 {}.mp3 \;

Чтобы автоматически добавить полученные файлы в iTunes, получите каталог импорта iTunes с помощью

find ~/Music/ -name "Automatically Add*"

результат например

/Users/sir/Music//iTunes/iTunes Media/Automatically Add to iTunes.localized

Затем запустите, например,

find . -name "*.mp3" -exec mv {} "/Users/sir/Music//iTunes/iTunes Media/Automatically Add to iTunes.localized/" \;

Для автоматического добавления всех преобразованных треков в iTunes.

user2707001
источник
3
" / Пользователи / сэр ", lmao.
Гарри Свенссон
Анекдот: все пользователи в нашей компании имеют имена звездочек, сокращенные до 3-5 символов. Мой "сириус", коротко, сэр;)
user2707001
Неизвестная опция "имя".
MonsterMMORPG
14

Если вы хотите сэкономить немного места, попробуйте рекомендацию Hydrogenaud.io :

Очень высокое качество: HiFi, дом или тихо слушать, с самым лучшим размером файла -V0 (~245 kbps), -V1 (~225 kbps), -V2 (~190 kbps)или -V3 (~175 kbps)рекомендуются. Эти настройки VBR обычно дают прозрачные результаты. Слышимые различия между этими предустановками могут существовать, но встречаются редко.

Источник: http://wiki.hydrogenaud.io/index.php?title=LAME

Если вы хотите использовать эту опцию в ffmpeg, вам следует использовать -q:a 0псевдоним.

Контроль качества с помощью -qscale:a(или псевдонима -q:a). Значения зависят от кодировщика, поэтому для libmp3lame диапазон 0-9, где меньшее значение означает более высокое качество. 0–3 обычно дает прозрачные результаты, 4 (по умолчанию) должно быть близко к прозрачности восприятия, а 6 дает «приемлемое» качество. Параметр -qscale:aсопоставлен с -Vпараметром автономного инструмента интерфейса командной строки.

Источник: https://trac.ffmpeg.org/wiki/Encode/MP3

Если вам нужны метатеги ID3v1, вам следует добавить -write_id3v1 1параметр.

Итак, моя последняя команда:

ffmpeg.exe -y -i input.flac -codec:a libmp3lame -q:a 0 -map_metadata 0 -id3v2_version 3 -write_id3v1 1 output.mp3
Виктор
источник
8

Я тестировал следующую команду для преобразования infile.flacфайла в outfile.mp3:

ffmpeg  -i infile.flac  -q:a 0  outfile.mp3

Начиная с Ubuntu 16.04, вышеуказанная команда, похоже, копирует (большую часть? Все?) Метаданные.

-q:a 0говорит ffmpegиспользовать VBR высочайшего качества.

Тем не менее, я ffmpegперекодировал обложку моего альбома с jpegна png, что увеличило размер обложки.

Stream mapping:
  Stream #0:1 -> #0:0 (mjpeg (native) -> png (native))
  Stream #0:0 -> #0:1 (flac (native) -> mp3 (libmp3lame))

(Я предполагаю, что приведенное выше преобразование имеет смысл, учитывая, как ffmpegработает .)

Покопавшись, я нашел -c:v copyвариант, в котором указано, что видеопоток следует копировать, а не перекодировать. Полная команда:

ffmpeg  -i infile.flac  -c:v copy  -q:a 0  outfile.mp3

Приведенная выше команда приводит к:

Stream mapping:
  Stream #0:1 -> #0:0 (copy)
  Stream #0:0 -> #0:1 (flac (native) -> mp3 (libmp3lame))
mpb
источник
3

Чтобы рекурсивно преобразовать в mp3 все файлы flac во вложенных папках, я использовал эту команду:

find '~/Music/' -iname '*.flac' -exec bash -c 'D=$(dirname "{}"); B=$(basename "{}"); mkdir "$D/mp3/"; ffmpeg -i "{}" -ab 320k -map_metadata 0 -id3v2_version 3 -acodec libmp3lame "$D/mp3/${B%.*}.mp3"' \;

Он создаст папку с именем «mp3» внутри папки с файлами flac и внутри папки mp3 будет сохранять относительные файлы mp3 с битрейтом 320 кбит / с, без сохранения старого расширения файла в имени.

Риккардо Вольпе
источник
3

Однострочное преобразование всех .flacфайлов .mp3в один каталог с сохранением большей части метаданных:

for file in *.flac; do ffmpeg -i $file -q:a 0 ${file:r}.mp3; done

(Примечание: ${file:r}удаляет расширение указанного пути к файлу)

ffmpeg: flac в mp3

Woudsma
источник
Просто укажите переменную $fileкак "$file".
Chazy Chaz
:rпохоже на zshмодификатор, который не работает в bash. В Bash вы можете заменить "${file:r}.mp3"на "${file%.flac}.mp3".
mivk
чтобы показать только имя файла из файла, в bash используйте${file%.*}
Evhz
2

Я знаю, что об этом не спрашивали, но, учитывая, что одна из причин, почему это сделано (по крайней мере, это то, что я хотел сделать), это то, что музыку можно импортировать в Apple iTunes, которая не поддерживает FLAC. В таком случае имеет смысл конвертировать FLAC в собственный формат Apple без потерь, m4a. Я использовал эту команду для преобразования всех файлов в текущей папке, сохранив при этом файлы аналогичного размера.

find . -name "*.flac" -exec ffmpeg -i {} -map_metadata 0 -acodec alac {}.m4a \;

Дхирадж Гупта
источник
Неизвестный вариант "имя". Ошибка при разделении списка аргументов: параметр не найден
MonsterMMORPG
@MonsterMMORPG, вы, вероятно, пропустили ввод. после команды find. Файл. указывает find искать в текущей папке, а -name указывает ему искать совпадающие имена файлов.
Дхирадж Гупта
2

Этот сценарий flac2mp3.sh используется ffmpegдля преобразования дерева папок файлов FLAC в другое дерево папок файлов MP3. Обложка прилагается, если присутствует. Вы можете установить CORESпеременную для создания фоновых заданий для одновременного преобразования нескольких файлов.

Рик О'Салливан
источник
выдает ошибку sed: -e выражение # 1, char 26: незавершенная команда `s '
MonsterMMORPG
Именно то, что я искал, спасибо! Я немного скорректировал сценарий для включения VBR и других ответов, загруженных здесь: gist
aksh1618