ฝังปกอัลบั้มใน OGG ผ่านบรรทัดคำสั่งใน linux


15

ฉันต้องการแปลงเพลงจาก flac เป็น ogg และในปัจจุบัน oggenc ทำได้อย่างสมบูรณ์แบบยกเว้นอัลบั้ม art 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 สอดคล้องกับหน้าปกและภาพ / jpeg เป็นประเภทละครใบ้

ในที่สุดคำถามของฉันคือฉันจะ base64 เข้ารหัสไฟล์และสร้างส่วนหัวนี้พร้อมกับมันสำหรับการฝังลงในไฟล์ ogg ได้อย่างไร

คำตอบ:


5

ฉันเพิ่งเขียนสคริปต์ที่ส่งออก / นำเข้าภาพจากไฟล์ OGG / Vorbis โดยใช้ vorbiscomment มันเป็นส่วนหนึ่งของเครื่องมือแปลงไลบรารีเพลง

สคริปต์ revelent อยู่ในฟังก์ชัน '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}"

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
Jason

ฉันแก้ไขการจัดรูปแบบสคริปต์ในโพสต์
Gaff

1
หากคุณได้รับ "ข้อผิดพลาดทางไวยากรณ์:" ("ไม่คาดคิด" ใน Ubuntu อาจเป็นเรื่องของเชลล์ที่ใช้ในการรันฉันเปลี่ยนบรรทัดแรกเป็น #! / bin / bash และใช้งานได้
Dan Gravell

1
สคริปต์นี้ไม่ทำงานสำหรับฉัน อย่างที่ฉันเห็นมันใช้ base64 ของภาพเท่านั้น แต่จำเป็นต้องมีส่วนหัวพิเศษก่อนมัน
Sergey

2

ฉันไม่ทราบว่าจะทำอะไรโดยอัตโนมัติเพียงแค่ชี้ไปที่รูปภาพ

อย่างไรก็ตามvorbiscommentสามารถฝังแท็กพล, คุณเพียงแค่ต้องเข้ารหัสภาพใน base64แล้วสร้างแท็กในรูปแบบถูกต้อง

เช่น vorbiscomment -a -t 'METADATA_BLOCK_PICTURE=...' file.ogg newfile.ogg

คุณจะต้องแฮ็คขั้นตอนเหล่านี้เป็นสคริปต์เพื่อให้มีประโยชน์


สิ่งนี้จะทำได้ แต่น่าเศร้าถ้ารูปภาพมีขนาดเกิน 64kb ดังนั้น vorbiscomments จะส่งกลับ "/ usr / bin / vorbiscomment: รายการอาร์กิวเมนต์ยาวเกินไป" ความคิดใดที่จะหลีกเลี่ยงปัญหานี้?
dmikalova

ระบบของคุณคืออะไรและอะไรคือผลลัพธ์ของgetconf ARG_MAX? น่าเสียดายที่ไม่มีวิธีแก้ไขขีด จำกัด นี้หากไม่มีการคอมไพล์เคอร์เนลใหม่ ที่นี่ใน 64- บิต 2.6.32-24 ฉันมี 2 MB
sml

ฉันใช้ arch linux 64-bit 2.6.34.1-1 และฉันมี 2mb เช่นกัน เป็นไปได้หรือไม่ที่จะใส่เครื่องหมายเช่น vorbiscomment -a -t 'METADATA_BLOCK_PICTURE = marker' file.ogg newfile.ogg จากนั้นมีบางสิ่งที่อ่านไฟล์ ogg และแทนที่เครื่องหมายด้วยรูปภาพ base64 หรือไม่
dmikalova

อย่างแน่นอน หากคุณเห็นข้อมูลจำเพาะฟอร์แมตแท็กที่ฉันเชื่อมโยงคุณสามารถใช้ vorbiscomment เพื่อแทรกรูปภาพชั่วคราว (เล็ก) แล้วเขียนไปยังไฟล์ที่อัปเดตสองส่วนสุดท้ายของแท็ก - ความยาวข้อมูลและข้อมูลเองโดยตรง เห็นได้ชัดว่าคุณจะต้องแฮ็คบางสิ่งด้วยกันด้วยตัวเอง
sml

ฉันลองใช้ mutagen ซึ่งเป็นไลบรารี python ระดับต่ำสำหรับการติดแท็กเสียงและดูเหมือนว่าเบื้องต้นฉันสามารถทำสิ่งที่ฉันต้องการได้ ฉันจะรายงานกลับเมื่อฉันเข้าใจสิ่งต่างๆ
dmikalova
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.