Incorporar a capa do álbum no OGG através da linha de comando no linux

12

Eu quero converter minhas músicas de flac para ogg, e atualmente oggenc faz isso perfeitamente, exceto para a arte do álbum. O Metaflac pode mostrar a arte do álbum, no entanto, parece não haver nenhuma ferramenta de linha de comando para incorporar a arte do álbum no ogg. MP3Tag e EasyTag são capazes de fazê-lo, e há uma especificação para isso aqui que chama a imagem para ser codificado em base64. No entanto, até agora, não consegui pegar um arquivo de imagem, convertê-lo em base64 e incorporá-lo a um arquivo ogg.

Se eu pegar uma imagem codificada em base64 de um arquivo ogg que já tenha a imagem incorporada, posso facilmente incorporá-la a outra imagem usando o vorbiscomment:

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

Meu problema é pegar algo como um jpeg e convertê-lo em base64. Atualmente tenho:

base64 --wrap=0 ./image.jpg

O que me dá o arquivo de imagem convertido em base64, usando vorbiscomment e seguindo as regras de marcação, eu posso inserir isso em um arquivo ogg da seguinte forma:

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

No entanto, isso me dá um ogg cuja imagem não funciona corretamente. Percebi ao comparar as strings base64 que todas as imagens incorporadas corretamente têm uma linha de cabeçalho, mas todas as strings base64 que eu gero estão sem esse cabeçalho. Análise adicional do cabeçalho:

od -c header.txt
0000000  
vorbiscomment -l withimage.ogg > textfile
vorbiscomment -c textfile noimage.ogg
base64 --wrap=0 ./image.jpg
echo "METADATA_BLOCK_PICTURE=$(base64 --wrap=0 ./image.jpg)" > ./folder.txt
vorbiscomment -c textfile noimage.ogg
003
od -c header.txt
0000000  %pre%  %pre%  %pre% 003  %pre%  %pre%  %pre%  \n   i   m   a   g   e   /   j   p
0000020   e   g  %pre%  %pre%  %pre%  %pre%  %pre%  %pre%  %pre%  %pre%  %pre%  %pre%  %pre%  %pre%  %pre%  %pre%
0000040  %pre%  %pre%  %pre%  %pre%  %pre%  %pre%  %pre%  %pre% 035 332
0000052
%pre% %pre% \n i m a g e / j p 0000020 e g %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% 0000040 %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% 035 332 0000052

Que segue a especificação dada acima. O aviso 003 corresponde à capa e o image / jpeg é o tipo mime.

Então, finalmente, minha pergunta é: como eu posso codificar com base64 um arquivo e gerar esse cabeçalho junto com ele para incorporar em um arquivo ogg?

    
por dmikalova 29.07.2010 / 05:56

3 respostas

4

Acabei de escrever um script que exporta / importa imagens de arquivos OGG / Vorbis usando o vorbiscomment. Faz parte de uma ferramenta de conversão de biblioteca de músicas.

O script revelent está na função 'mussync-tools-transfert_images' desta ferramenta:

link

Basicamente, eu escrevi um leitor e um escritor para o formato metadata_block_picture.

O código é bastante complexo:

      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}"
    
por 25.01.2014 / 13:06
5

Aqui está minha solução para o / usr / bin / vorbiscomment: Lista de argumentos problema muito longo. Eu criei um script e chamei de oggart. Basta executá-lo a partir da linha de comando assim:

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

Isso marca seu arquivo ogg com o campo METADATA_BLOCK_PICTURE. A Easytag usa a maneira antiga de fazer isso com o campo COVERART em vez de METADATA_BLOCK_PICTURE. Se você quiser a compatibilidade com o Easytag, você pode executar o script da seguinte forma:

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

Aqui está o script:

#!/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
    
por 04.08.2011 / 18:45
2

Não tenho conhecimento de nada que faça isso automaticamente apenas apontando para a imagem.

No entanto vorbiscomment pode incorporar tags arbitrárias, você só precisa codifique a imagem em base64 e, em seguida, crie a tag na formato correto .

por exemplo, vorbiscomment -a -t 'METADATA_BLOCK_PICTURE=...' file.ogg newfile.ogg

você terá que hackear essas etapas em algum tipo de script para que seja útil.

    
por 29.07.2010 / 06:41