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

7350
dmikalova

Я хочу преобразовать свою музыку из 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?

12

3 ответа на вопрос

5
Jason

Вот мое решение для / 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=$ EXTTYPE1=`echo $EXT1 | tr '[:upper:]' '[:lower:]'`  FILE2="`basename \"$2\"`" EXT2=$ 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 $ 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 
The script posted funny here. You can download oggart.tar.gz @ http://www.murga-linux.com/puppy/viewtopic.php?mode=attach&id=44270 Jason 12 лет назад 0
Я исправил форматирование скрипта в посте. 3498DB 12 лет назад 0
Если вы получаете «Синтаксическая ошибка:» («неожиданно» в Ubuntu, это, вероятно, связано с тем, что оболочка используется для запуска. Я изменил первую строку на #! / Bin / bash, и это сработало. Dan Gravell 11 лет назад 1
этот скрипт не работает для меня. Как я вижу, он использует только base64 изображения, но перед ним должен быть специальный заголовок Sergey 10 лет назад 1
3
Biapy

Я только что написал скрипт, который экспортирует / импортирует изображения из файлов 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 "$" > "$"  # Remove existing images. command sed -i -e '/^metadata_block_picture/d' "$"  # 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 "" > "$"  # Picture type <32>. command printf "0: %.8x" 3 | command xxd -r -g0 \ >> "$" # Mime type length <32>. command printf "0: %.8x" $(echo -n "$" | command wc -c) \ | command xxd -r -g0 \ >> "$" # Mime type (n * 8) echo -n "$" >> "$" # Description length <32>. command printf "0: %.8x" $(echo -n "$" | command wc -c) \ | command xxd -r -g0 \ >> "$" # Description (n * 8) echo -n "$" >> "$" # Picture with <32>. command printf "0: %.8x" 0 | command xxd -r -g0 \ >> "$" # Picture height <32>. command printf "0: %.8x" 0 | command xxd -r -g0 \ >> "$" # Picture color depth <32>. command printf "0: %.8x" 0 | command xxd -r -g0 \ >> "$" # Picture color count <32>. command printf "0: %.8x" 0 | command xxd -r -g0 \ >> "$" # Image file size <32>. command printf "0: %.8x" $(command wc -c "$" \ | command cut --delimiter=' ' --fields=1) \ | command xxd -r -g0 \ >> "$" # Image file. command cat "$" >> "$"  echo "metadata_block_picture=$(command base64 --wrap=0 < "$")" >> "$"  # Update vorbis file comments. command vorbiscomment --write --raw --commentfile "$" "$"  # Delete cache file. command rm "$" # Delete comments file. command rm "$" 
2
sml

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

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

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

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

Это было бы выполнимо, но, к сожалению, если размер изображения превышает 64 КБ, vorbiscomments возвращает «/ usr / bin / vorbiscomment: список аргументов слишком длинный». Есть идеи как обойти это? dmikalova 13 лет назад 0
what is your system, and what is the output of `getconf ARG_MAX`? Unfortunately there is no way around this limit without recompiling the kernel. Here on 64-bit 2.6.32-24, I have 2 MB. sml 13 лет назад 0
I'm running arch linux 64-bit 2.6.34.1-1 and I have 2mb as well. Would it be possible to put in a marker e.g. vorbiscomment -a -t 'METADATA_BLOCK_PICTURE=marker' file.ogg newfile.ogg, then have something read the ogg file and replace the marker with the base64 image? dmikalova 13 лет назад 0
Абсолютно. Если вы видите спецификацию формата тега, которую я связал, вы можете использовать vorbiscomment, чтобы вставить временное (маленькое) изображение, а затем напрямую записать в файл обновление двух последних частей тега - длины данных и самих данных. Однако, очевидно, вам придется взломать что-то вместе. sml 13 лет назад 0
Я пробую мутаген, низкоуровневую библиотеку Python для аудио-тегов, и мой предварительный вид кажется, что он может делать то, что мне нужно. Я доложу, когда выясню это. dmikalova 13 лет назад 0
Мне удалось написать скрипт для vorbiscomment, и он работает, однако я до сих пор не знаю, как правильно конвертировать изображение в base64. Вот что у меня есть: base64 --wrap = 0 ./image.jpg> ./image. ./image echo $ Picture vorbiscomment -a -t METADATA_BLOCK_PICTURE = "$ Picture" ./1.ogg Однако base64, похоже, берет изображение и включает заголовки, а затем изображение не работает в ogg. В противном случае остальная часть сценария работает. dmikalova 13 лет назад 0

Похожие вопросы