Вставить обложку альбома в OGG через командную строку в Linux

15

Я хочу преобразовать свою музыку из flac в ogg, и в настоящее время oggenc делает это отлично, за исключением обложек альбомов. Metaflac может выводить обложки альбомов, однако, похоже, нет инструмента командной строки для встраивания обложек альбомов в ogg. Mp3Tag и EasyTag в состоянии сделать это, и есть спецификация для этого здесь , который требует изображение , которое будет в кодировке base64. Однако до сих пор мне не удалось взять файл изображения, преобразовать его в base64 и встроить в файл ogg.

Если я возьму изображение в кодировке base64 из файла ogg, в который уже встроено изображение, я могу легко встроить его в другое изображение с помощью vorbiscomment:

vorbiscomment -l withimage.ogg > textfile
vorbiscomment -c textfile noimage.ogg

Моя проблема заключается в том, чтобы взять что-то вроде JPEG и преобразовать его в base64. В настоящее время у меня есть:

base64 --wrap=0 ./image.jpg

Что дает мне файл изображения, преобразованный в base64, используя vorbiscomment и следуя правилам тегирования, я могу встроить его в файл ogg следующим образом:

echo "METADATA_BLOCK_PICTURE=$(base64 --wrap=0 ./image.jpg)" > ./folder.txt
vorbiscomment -c textfile noimage.ogg

Однако, это дает мне ogg, изображение которого не работает должным образом. При сравнении строк base64 я заметил, что все правильно встраиваемые изображения имеют строку заголовка, но во всех генерируемых мной строках base64 этот заголовок отсутствует. Дальнейший анализ заголовка:

od -c header.txt
0000000  \0  \0  \0 003  \0  \0  \0  \n   i   m   a   g   e   /   j   p
0000020   e   g  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000040  \0  \0  \0  \0  \0  \0  \0  \0 035 332
0000052

Который следует спецификации, приведенной выше. Примечание 003 соответствует передней обложке, а image / jpeg - это пантомима.

Итак, наконец, мой вопрос, как я могу base64 кодировать файл и генерировать этот заголовок вместе с ним для встраивания в файл ogg?

dmikalova
источник

Ответы:

5

Я только что написал скрипт, который экспортирует / импортирует изображения из файлов OGG / Vorbis с помощью vorbiscomment. Это часть инструмента преобразования музыкальной библиотеки.

Сильный сценарий находится в функции mussync-tools-Transfert_images этого инструмента:

https://github.com/biapy/howto.biapy.com/blob/master/various/mussync-tools

По сути, я написал для читателя и писателя формат metadata_block_picture.

Код довольно сложный:

      OUTPUT_FILE="/path/to/my-ogg-file.ogg"
      IMAGE_PATH="/path/to/my-cover-art.jpg"
      IMAGE_MIME_TYPE="image/jpeg"
      # Export existing comments to file.
      local COMMENTS_PATH="$(command mktemp -t "tmp.XXXXXXXXXX")"
      command vorbiscomment --list --raw "${OUTPUT_FILE}" > "${COMMENTS_PATH}"

      # Remove existing images.
      command sed -i -e '/^metadata_block_picture/d' "${COMMENTS_PATH}"

      # Insert cover image from file.

      # metadata_block_picture format.
      # See: https://xiph.org/flac/format.html#metadata_block_picture

      local IMAGE_WITH_HEADER="$(command mktemp -t "tmp.XXXXXXXXXX")"
      local DESCRIPTION=""

      # Reset cache file.
      echo -n "" > "${IMAGE_WITH_HEADER}"

      # Picture type <32>.
      command printf "0: %.8x" 3 | command xxd -r -g0 \
              >> "${IMAGE_WITH_HEADER}"
      # Mime type length <32>.
      command printf "0: %.8x" $(echo -n "${IMAGE_MIME_TYPE}" | command wc -c) \
                | command xxd -r -g0 \
              >> "${IMAGE_WITH_HEADER}"
      # Mime type (n * 8)
      echo -n "${IMAGE_MIME_TYPE}" >> "${IMAGE_WITH_HEADER}"
      # Description length <32>.
      command printf "0: %.8x" $(echo -n "${DESCRIPTION}" | command wc -c) \
                | command xxd -r -g0 \
              >> "${IMAGE_WITH_HEADER}"
      # Description (n * 8)
      echo -n "${DESCRIPTION}" >> "${IMAGE_WITH_HEADER}"
      # Picture with <32>.
      command printf "0: %.8x" 0 | command xxd -r -g0 \
              >> "${IMAGE_WITH_HEADER}"
      # Picture height <32>.
      command printf "0: %.8x" 0 | command xxd -r -g0 \
              >> "${IMAGE_WITH_HEADER}"
      # Picture color depth <32>.
      command printf "0: %.8x" 0 | command xxd -r -g0 \
              >> "${IMAGE_WITH_HEADER}"
      # Picture color count <32>.
      command printf "0: %.8x" 0 | command xxd -r -g0 \
              >> "${IMAGE_WITH_HEADER}"
      # Image file size <32>.
      command printf "0: %.8x" $(command wc -c "${IMAGE_PATH}" \
                | command cut --delimiter=' ' --fields=1) \
                | command xxd -r -g0 \
              >> "${IMAGE_WITH_HEADER}"
      # Image file.
      command cat "${IMAGE_PATH}" >> "${IMAGE_WITH_HEADER}"

      echo "metadata_block_picture=$(command base64 --wrap=0 < "${IMAGE_WITH_HEADER}")" >> "${COMMENTS_PATH}"

      # Update vorbis file comments.
      command vorbiscomment --write --raw --commentfile "${COMMENTS_PATH}" "${OUTPUT_FILE}"

      # Delete cache file.
      command rm "${IMAGE_WITH_HEADER}"
      # Delete comments file.
      command rm "${COMMENTS_PATH}"
Biapy
источник
6

Вот мое решение для / usr / bin / vorbiscomment: Список аргументов слишком длинная. Я создал сценарий и назвал его Oggart. Просто запустите его из командной строки следующим образом:

oggart /path/to/music_file.ogg /path/to/image_file

Это помечает ваш файл ogg с полем METADATA_BLOCK_PICTURE. Easytag использует старый способ сделать это с полем COVERART вместо METADATA_BLOCK_PICTURE. Если вам нужна совместимость с Easytag, вы можете запустить скрипт следующим образом:

oggart /path/to/music_file.ogg /path/to/image_file -e

Вот сценарий:

#!/bin/sh

FILE1="`basename \"$1\"`"
EXT1=${FILE1##*.}
EXTTYPE1=`echo $EXT1 | tr '[:upper:]' '[:lower:]'`

FILE2="`basename \"$2\"`"
EXT2=${FILE2##*.}
EXTTYPE2=`echo $EXT2 | tr '[:upper:]' '[:lower:]'`

OGG=""
if [ "$EXTTYPE1" = ogg ]; then
OGG="$1"
elif [ "$EXTTYPE2" = ogg ]; then
OGG="$2"
fi
if [ "$OGG" = "" ]; then
echo no ogg file selected
exit 0
fi

PIC=""
array=(jpeg jpg png)
for item in ${array[*]}
do
if [ "$item" = "$EXTTYPE1" ]; then
PIC="$1"
elif [ "$item" = "$EXTTYPE2" ]; then
PIC="$2"
fi
done
if [ "$PIC" = "" ]; then
echo no jpg or png file selected
exit 0
fi

if [ "$3" = -e ]; then
EASYTAG=Y
else
EASYTAG=N
fi

DESC=`basename "$PIC"`
APIC=`base64 --wrap=0 "$PIC"`
if [ "`which exiv2`" != "" ]; then
MIME=`exiv2 "$PIC" | grep 'MIME type ' | sed 's/: /|/' | cut -f 2 -d '|' | tail -n 1`
fi
if [ "$MIME" = "" ]; then
MIME="image/jpeg"
fi

vorbiscomment -l "$OGG" | grep -v '^COVERART=' | grep -v '^COVERARTDESCRIPTION=' | grep -v '^COVERARTMIME=' | grep -v 'METADATA_BLOCK_PICTURE=' > "$OGG".tags

if [ "$EASYTAG" = N ]; then
echo METADATA_BLOCK_PICTURE="$APIC" > "$OGG".tags2
else
echo COVERART="$APIC" > "$OGG".tags2
fi
vorbiscomment -w -R -c "$OGG".tags2 "$OGG"
vorbiscomment -a -R -t COVERARTDESCRIPTION="$DESC" "$OGG"
vorbiscomment -a -R -t COVERARTMIME="$MIME" "$OGG"
vorbiscomment -a -R -c "$OGG".tags "$OGG"

rm -f "$OGG".tags
rm -f "$OGG".tags2
Джейсон
источник
Скрипт выложен здесь смешно. Вы можете скачать oggart.tar.gz @ murga-linux.com/puppy/viewtopic.php?mode=attach&id=44270
Джейсон,
Я исправил форматирование скрипта в посте.
Gaff
1
Если вы получаете «Синтаксическая ошибка:» («неожиданно» в Ubuntu, это, вероятно, связано с тем, что оболочка используется для запуска. Я изменил первую строку на #! / Bin / bash, и она сработала.
Дэн Грейвелл,
1
этот скрипт не работает для меня. Как я вижу, он использует только base64 изображения, но перед ним должен быть специальный заголовок
Сергей
2

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

Однако vorbiscomment может встраивать произвольные теги, вам просто нужно кодировать изображение в base64, а затем создать тег в правильном формате .

например vorbiscomment -a -t 'METADATA_BLOCK_PICTURE=...' file.ogg newfile.ogg

вам придется взломать эти шаги в какой-то скрипт, чтобы он был полезен.

SML
источник
Это было бы выполнимо, но, к сожалению, если размер изображения превышает 64 КБ, vorbiscomments возвращает «/ usr / bin / vorbiscomment: список аргументов слишком длинный». Есть идеи как обойти это?
Дмикалова
какая у вас система и каков выход getconf ARG_MAX? К сожалению, нет никакого способа обойти это ограничение без перекомпиляции ядра. Здесь на 64-битной версии 2.6.32-24 у меня 2 МБ.
sml
Я использую Arch Linux 64-bit 2.6.34.1-1 и у меня также есть 2mb. Можно ли добавить маркер, например, vorbiscomment -a -t 'METADATA_BLOCK_PICTURE = marker' file.ogg newfile.ogg, затем что-нибудь прочитать файл ogg и заменить маркер изображением base64?
Дмикалова
Абсолютно. Если вы видите спецификацию формата тега, которую я связал, вы можете использовать vorbiscomment, чтобы вставить временное (маленькое) изображение, а затем напрямую записать в файл обновление двух последних частей тега - длины данных и самих данных. Однако, очевидно, вам придется взломать что-то вместе.
SML
Я пробую мутаген, низкоуровневую библиотеку Python для аудио-тегов, и мой предварительный вид кажется, что он может делать то, что мне нужно. Я сообщу, когда выясню в этом.
Дмикалова