Добавить обложку альбома в файл mp3 / ogg из командной строки в пакетном режиме?


38

Я ищу программное обеспечение в Linux, которое добавит обложку альбома / обложку к каждому из выбранных файлов в пакетном режиме. Обложка альбома - это jpg / png, хранящийся на моем компьютере. Будет здорово, если он сможет импортировать из интернета.

В настоящее время я пробовал оба Rhythmbox и Banshee. Я также пробовал lameи easytag, но, кажется, они не поддерживают пакетный режим. lameэто не добавление свойств, но перезапись. (Я знаю, что lame - единственная командная строка, которую использовали до сих пор).

Итак, в основном я ищу:

<some magic s/w> --picture=<my chosen picture> Music/Artist/*.mp3

Это добавит картинку к метаданным файла, навсегда.

Можете ли вы предложить мне такое программное обеспечение?

Ответы:


24

ламе

Используя lameвы можете сделать это с помощью небольшого сценария:

$ lame --ti /path/to/file.jpg audio.mp3

Если файлы названы примерно так, вы можете создать скрипт оболочки, который будет делать то, что вы хотите:

for i in file1.mp3 file2.mp3 file3.mp3; do
  albart=$(echo $i | sed 's/.mp3/.jpg/')
  lame --ti /path/to/$albart $i
done

Вы можете сделать вышеупомянутое немного более компактным и устранить необходимость sed, используя bashдля этого, удалив соответствующий суффикс:

...
albart="${i%.mp3}.jpg"
...

Пикард / MusicBrainz

Если вы хотите сделать это в большом масштабе, я бы предложил использовать Picard, который является инструментом внешнего интерфейса для использования базы данных MusicBrainz. Существует плагин для Picard под названием «Cover Art Downloader», который может сделать это для партий вашей коллекции.

Однако вышеприведенное не похоже на командную строку.

свекла

Другой вариант будет использовать beets. Это можно сделать из командной строки и использовать базу данных MusicBrainz для поиска обложек альбомов.

Вы можете либо создать обложку альбома с помощью плагина FetchArt, либо встроить его с помощью плагина EmbedArt .

Другие опции?

Также взгляните на ранее задаваемые вопросы и ответы от U & L под названием: Какой инструмент для тегирования mp3 для Linux? , В этой теме есть несколько альтернативных инструментов.


Вы можете избежать sedзвонка с чем-то вроде albart="${i%.mp3}.jpg". Что еще более важно, я только что проверил твою слабую команду и получил lame: unrecognized option -i...
evilsoup

@evilsoup - спасибо, на коммутаторе не было тире. Должно быть --ti ...
slm

@evilsoup - также добавил свой отзыв о неиспользовании sed. Благодарность!
slm

8
@ Exeleration-G - нет, я бы не советовал использовать, lameтак как на самом деле это кодировщик. Существуют и другие инструменты для манипулирования тегами id3 в mp3. Вы можете использовать id3v2 -r "APIC" *.mp3или eyeD3 --remove-all-images *.mp3для удаления любых прикрепленных изображений.
SLM

2
К вашему сведению, моя версия 3.99 не имеет опции "--ti" (debian buster) - eyeD3 кажется хорошей альтернативой.
Бенджамин Питер

17

Одним из решений будет использование ffmpeg:

ffmpeg -i input.mp3 -i cover.jpg -map_metadata 0 -map 0 -map 1 output.mp3

Вы можете поместить это в цикл for для создания каждого MP3 в каталоге:

for f in ./*.mp3; do ffmpeg -i "$f" -i cover.jpg -map_metadata 0 -map 0 -map 1 out-"${f#./}"; done

Это создаст отдельный выходной файл (поэтому, если у вас есть файл с именем foo.mp3, вы получите оба foo.mp3и out-foo.mp3); это потому, что ffmpeg не может записывать поверх своего ввода. Вы можете исправить это с помощью чего-то вроде:

for f in ./*.mp3; do \
ffmpeg -i "$f" -i cover.jpg -map_metadata 0 -map 0 -map 1 out-"${f#./}" \
&& mv out-"${f#./}" "$f"; done

Использование ffmpeg для этой проблемы немного похоже на использование крылатой ракеты, чтобы сломать орех. Более специализированные инструменты для работы с метаданными, безусловно, смогут сделать это более чистой и короткой командой.


6
Показанная здесь команда ffmpeg закодирует аудио. Если вы конвертируете из другого формата, это нормально, но если вы просто хотите добавить изображение в существующий mp3 без перекодирования, добавьте -acodec copyпосле -map 1.
JSD

Это не работает для меня, какая-то конкретная причина? Я получаю только mp3-файл, но без миниатюры. @jsd
шеф-повар фараона

Извините @ChefPharaoh Я не знаю, почему это не работает для вас. Я просто попытался сделать wav-> mp3, добавив art, и просто добавив art в существующий mp3 с помощью команд ffmpeg, показанных выше. Оба раза это работало нормально.
JSD

@evilsoup Я не уверен, что делаю что-то супер злое или неправильное, но я могу изменить мои mp3-файлы на месте с помощью процесса подстановки. Kinda упрощает этот сценарий, и он кажется очень быстрым.
rien333

Работал как удовольствие, и я также обнаружил, что ffmpeg немного быстрее хромого :)
Тина


5

Вы можете использовать драгоценный камень FancyAudio для этого. Это может добавить обложку альбома в mp3 файлы. Документация доступна здесь .

функции

  1. добавить обложку альбома в один файл mp3
  2. добавить обложку альбома в несколько файлов mp3.

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

введите описание изображения здесь

На снимке экрана ниже показан вывод fancy_audio при запуске в папке, содержащей файлы mp3 и изображения

Это изображение показывает вывод fancy_audio при запуске в папке, содержащей mp3 и файлы изображений


Это просто и работает быстрее, чем lameпри добавлении одного и того же изображения в несколько mp3-файлов. Вам не нужно знать Ruby;) - это автономный скрипт.
Томаш Гандор

0

ОП заявляет, что он предпочел бы, чтобы обложка была загружена из Интернета, и я просто написал довольно неплохой сценарий для этого, используя eye3Dи sacad, и устанавливаемый из pip. eye3Dочень полезен для этой цели, поскольку он не перекодирует аудио и, используя --to-v2.4флаг, обрабатывает любые mp3-файлы, независимо от типа тега id3. Сценарий должен быть запущен из каталога, содержащего mp3-файлы. Его можно запускать без аргументов, угадывая исполнителя и название альбома из тегов id3, или с ручными именами в качестве аргументов, например embedart "pink floyd" "dark side of the moon". Он написан для оболочки fish, но должен легко переноситься на bash, если вы измените все команды set на присвоение переменных bash.

function embedart
    if echo $argv | grep -q -e '-h'
       echo 'embedart "[Artist]" "[Album]"'
       return
    end

    if test $argv[1]
        set artist $argv[1]
        set album $argv[2]
    else
        set artist (eyed3 (ls *mp3 | head -1) | ggrep -oP "artist.*: \K.*" | head -1)
        if not test $artist
            echo "No artist found!"
            return
        end
        set album (eyed3 (ls *mp3 | head -1) | ggrep -oP "album.*: \K.*" | head -1)
        if not test $album
            echo "No album found!"
            return
        end
    end

    sacad $artist $album 350 cover.jpg -v warning 2> /dev/null > /dev/null
    eyeD3 --to-v2.4 --add-image "cover.jpg:FRONT_COVER" *mp3 -Q 2> /dev/null > /dev/null

    rm cover.jpg
    echo "Done!"
end

-1

eyeD3 не работает с Unicode . Если в имени файла .mp3 есть какие-либо не-ascii символы (или даже просто в имени каталога предка, например в каталоге Album), то он прерывается. LTA.

Так что вам не повезло, если название альбома или песни написано не на английском языке!

Например:

cp yoursong.mp3 /tmp/Странджанска.mp3
eyeD3 --add-image folder.jpg:FRONT_COVER Странджанска.mp3

Очевидно, eyeD3 хочет поместить полный путь к файлу .mp3 в файл .mp3 и не может обрабатывать символы, отличные от ascii.

Неопределенное исключение: кодек 'ascii' не может кодировать символы в позиции 5-16: порядковый номер не в диапазоне (128)
eyed3: ОШИБКА: кодек 'ascii' не может кодировать символы в позиции 5-16: порядковый номер не в диапазоне (128)
Проследить 
... (длинная обратная связь не указана) ...
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.