Linux'ta komut satırı aracılığıyla albüm resmini OGG'ye göm


15

Müziğimi flac'tan ogg'a dönüştürmek istiyorum ve şu anda oggenc albüm sanatı hariç bunu mükemmel bir şekilde yapıyor. Metaflac albüm kapağı çıktısı verebilir, ancak albüm kapağını ogg içine yerleştirmek için komut satırı aracı yoktur. MP3Tag ve EasyTAG bunu yapabilir ve bunun için bir şartname var burada görüntü base64 ile kodlanmış için çağırır. Ancak şimdiye kadar bir görüntü dosyası almak, base64 dönüştürmek ve bir ogg dosyasına gömme başarısız oldu.

Zaten görüntü gömülü olan bir ogg dosyasından base64 kodlu bir görüntü alırsam, vorbiscomment kullanarak kolayca başka bir görüntüye gömebilirsiniz:

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

Benim sorunum bir jpeg gibi bir şey alıp base64'e dönüştürmektir. Şu anda var:

base64 --wrap=0 ./image.jpg

Hangi bana vorbiscomment kullanarak ve etiketleme kurallarını kullanarak base64 dönüştürülmüş görüntü dosyası verir, ben böyle bir ogg dosyasına gömmek olabilir:

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

Ancak bu bana görüntüsü düzgün çalışmayan bir ogg veriyor. Base64 dizelerini karşılaştırırken, tüm düzgün şekilde yerleştirilmiş resimlerin bir başlık satırı olduğunu fark ettim, ancak oluşturduğum tüm base64 dizeleri bu üstbilgiden yoksun. Başlığın daha fazla analizi:

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

Yukarıda verilen özellikleri takip eder. Uyarı 003, ön kapağa karşılık gelir ve image / jpeg mime tipidir.

Son olarak, sorum şu, nasıl bir baseg64 bir dosyayı kodlamak ve bir ogg dosyasına gömmek için onunla birlikte bu üstbilgi oluşturmak?

Yanıtlar:


5

Ben sadece vorbiscomment kullanarak OGG / Vorbis dosyalarından görüntü ihracat / ithalat bir komut dosyası yazdım. Bir müzik kitaplığı dönüştürme aracının parçasıdır.

Revelent komut dosyası, bu aracın 'mussync-tools-transfert_images' işlevindedir:

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

Temel olarak, metadata_block_picture biçimi için bir okuyucu ve bir yazar yazdım.

Kod oldukça karmaşık:

      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}"

6

İşte / usr / bin / vorbiscomment için benim çözümüm: Argüman listesi çok uzun problem. Bir senaryo oluşturdum ve oggart olarak adlandırdım. Sadece komut satırından şu şekilde çalıştırın:

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

Bu, ogg dosyanızı METADATA_BLOCK_PICTURE alanıyla etiketler. Easytag, METADATA_BLOCK_PICTURE yerine COVERART alanı ile bunu yapmanın eski yolunu kullanır. Easytag uyumluluğu istiyorsanız komut dosyasını şu şekilde çalıştırabilirsiniz:

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

İşte senaryo:

#!/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

Senaryo buraya komik geldi. Oggart.tar.gz @ murga-linux.com/puppy/viewtopic.php?mode=attach&id=44270
Jason

Yazıdaki komut dosyası biçimlendirmesini düzelttim.
Gaff

1
Ubuntu'da bir "Sözdizimi hatası:" ("beklenmedik" olursa, büyük olasılıkla çalıştırılmakta olan kabukla ilgisi vardır. İlk satırı #! / Bin / bash olarak değiştirdim ve işe yaradı.
Dan Gravell

1
bu senaryo benim için çalışmıyor. Gördüğüm gibi sadece görüntünün base64 kullanıyor ama ondan önce özel bir başlık olmalı
Sergey

2

Sadece görüntüyü işaret ederek otomatik olarak yapan hiçbir şeyin farkında değilim.

Ancak vorbiscomment rastgele etiketler yerleştirebilir, sadece görüntüyü base64'te kodlamanız ve ardından etiketi doğru biçimde oluşturmanız gerekir .

Örneğin vorbiscomment -a -t 'METADATA_BLOCK_PICTURE=...' file.ogg newfile.ogg

faydalı olması için bu adımları bir tür senaryoya dönüştürmeniz gerekir.


Bu yapılabilir, ancak ne yazık ki resim 64 kb'nin üzerindeyse, vorbiscomments "/ usr / bin / vorbiscomment: Bağımsız değişken listesi çok uzun" döndürür. Bunun üstesinden gelmek için bir fikrin var mı?
dmikalova

sisteminiz nedir ve çıktısı getconf ARG_MAXnedir? Maalesef çekirdeği yeniden derlemeden bu sınırın etrafında bir yol yok. Burada 64-bit 2.6.32-24'te 2 MB'ım var.
sml

Ben Arch linux 64-bit 2.6.34.1-1 çalıştırıyorum ve ben de 2mb var. Vorbiscomment -a -t 'METADATA_BLOCK_PICTURE = marker' file.ogg newfile.ogg gibi bir işaretleyici koymak, ogg dosyasını okumak ve işaretçiyi base64 görüntüsüyle değiştirmek bir şey ister mi?
dmikalova

Kesinlikle. Bağladığım etiket biçimi spesifikasyonunu görüyorsanız, geçici (küçük) bir resim eklemek için vorbiscomment'i kullanabilir ve ardından doğrudan etiketin son iki bölümünü güncelleyen dosyaya yazabilirsiniz - veri uzunluğu ve verilerin kendisi. Ancak belli ki bir şeyi kendiniz hacklemeniz gerekecek.
sml

Mutagen, ses etiketleme için düşük seviyeli bir python kütüphanesi deniyorum ve benim ön görünüyor ki ihtiyacım olanı yapabilir gibi görünüyor. İçinde bir şey bulduğumda rapor vereceğim.
dmikalova
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.