Nhúng album nghệ thuật vào OGG thông qua dòng lệnh trong linux


15

Tôi muốn chuyển đổi âm nhạc của mình từ flac sang ogg và hiện tại oggenc thực hiện điều đó một cách hoàn hảo ngoại trừ album nghệ thuật. Metaflac có thể xuất album nghệ thuật, tuy nhiên dường như không có công cụ dòng lệnh nào để nhúng album nghệ thuật vào ogg. MP3Tag và EasyTag có thể làm điều đó, và có một đặc điểm kỹ thuật cho nó ở đây yêu cầu hình ảnh được mã hóa base64. Tuy nhiên, cho đến nay tôi đã không thành công trong việc có thể lấy một tệp hình ảnh, chuyển đổi nó thành base64 và nhúng nó vào một tệp ogg.

Nếu tôi lấy một hình ảnh được mã hóa base64 từ một tệp ogg đã có hình ảnh được nhúng, tôi có thể dễ dàng nhúng nó vào một hình ảnh khác bằng cách sử dụng vorbiscomment:

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

Vấn đề của tôi là lấy một cái gì đó như jpeg và chuyển đổi nó thành base64. Hiện tại tôi có:

base64 --wrap=0 ./image.jpg

Điều này mang lại cho tôi tệp hình ảnh được chuyển đổi thành base64, bằng cách sử dụng vorbiscomment và tuân theo các quy tắc gắn thẻ, tôi có thể nhúng tệp đó vào một tệp ogg như vậy:

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

Tuy nhiên, điều này mang lại cho tôi một ogg có hình ảnh không hoạt động đúng. Tôi nhận thấy khi so sánh các chuỗi base64 rằng tất cả các hình ảnh nhúng đúng đều có một dòng tiêu đề nhưng tất cả các chuỗi base64 tôi tạo ra đều thiếu tiêu đề này. Phân tích sâu hơn về tiêu đề:

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

Mà theo thông số kỹ thuật được đưa ra ở trên. Lưu ý 003 tương ứng với bìa trước và hình ảnh / jpeg là loại mime.

Vì vậy, cuối cùng, câu hỏi của tôi là, làm thế nào tôi có thể mã hóa một tập tin và tạo tiêu đề này cùng với nó để nhúng vào một tập tin ogg?

Câu trả lời:


5

Tôi vừa mới viết một tập lệnh xuất / nhập hình ảnh từ các tệp OGG / Vorbis bằng cách sử dụng vorbiscomment. Nó là một phần của công cụ chuyển đổi thư viện nhạc.

Tập lệnh mặc khải nằm trong chức năng 'mussync-tools-transfert_images' của công cụ này:

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

Về cơ bản, tôi đã viết một trình đọc và một trình ghi cho định dạng metadata_block_picture.

Mã này khá phức tạp:

      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

Đây là giải pháp của tôi cho / usr / bin / vorbiscomment: Danh sách đối số vấn đề quá dài. Tôi đã tạo ra một kịch bản và đặt tên nó là oggart. Chỉ cần chạy nó từ dòng lệnh như thế này:

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

Điều này gắn thẻ tệp ogg của bạn với trường METADATA_BLOCK_PICTURE. Easytag sử dụng cách thức cũ để thực hiện việc này với trường COVERART thay vì METADATA_BLOCK_PICTURE. Nếu bạn muốn tương thích Easytag thì bạn có thể chạy tập lệnh như thế này:

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

Đây là kịch bản:

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

Kịch bản được đăng vui ở đây. Bạn có thể tải xuống oggart.tar.gz @ murga-linux.com/puppy/viewtopic.php?mode=attach&id=44270
Jason

Tôi đã sửa định dạng script trong bài viết.
Gaff

1
Nếu bạn gặp "Lỗi cú pháp:" ("không mong muốn" trong Ubuntu thì có lẽ phải làm gì đó với trình bao được sử dụng để chạy. Tôi đã thay đổi dòng đầu tiên thành #! / Bin / bash và nó đã hoạt động.
Dan Gravell

1
kịch bản này không làm việc cho tôi. Như tôi có thể thấy nó chỉ sử dụng cơ sở 64 của hình ảnh nhưng cần phải có một tiêu đề đặc biệt trước nó
Sergey

2

Tôi không nhận thức được bất cứ điều gì tự động bằng cách chỉ vào hình ảnh.

Tuy nhiên, vorbiscomment có thể nhúng các thẻ tùy ý, bạn chỉ cần mã hóa hình ảnh trong base64 và sau đó xây dựng thẻ theo định dạng chính xác .

ví dụ vorbiscomment -a -t 'METADATA_BLOCK_PICTURE=...' file.ogg newfile.ogg

bạn sẽ phải hack các bước này thành một tập lệnh nào đó để nó hữu ích.


Điều này sẽ có thể thực hiện được, nhưng thật đáng buồn nếu hình ảnh trên 64kb thì vorbiscomments trả về "/ usr / bin / vorbiscomment: Danh sách đối số quá dài". Bất cứ ý tưởng làm thế nào để có được xung quanh này?
dmikalova

hệ thống của bạn là gì, và đầu ra là getconf ARG_MAXgì? Thật không may, không có cách nào xung quanh giới hạn này mà không biên dịch lại kernel. Ở đây trên 64-bit 2.6.32-24, tôi có 2 MB.
sml

Tôi đang chạy arch linux 64-bit 2.6.34.1-1 và tôi cũng có 2mb. Có thể đặt một điểm đánh dấu, ví dụ như vorbiscomment -a -t 'METADATA_BLOCK_PICTURE = Marker' file.ogg newfile.ogg, sau đó có một cái gì đó đọc tệp ogg và thay thế điểm đánh dấu bằng hình ảnh base64?
dmikalova

Chắc chắn rồi. Nếu bạn thấy thông số định dạng thẻ tôi đã liên kết, bạn có thể sử dụng vorbiscomment để chèn hình ảnh tạm thời (nhỏ), sau đó ghi trực tiếp vào tệp cập nhật hai phần cuối của thẻ - độ dài dữ liệu và chính dữ liệu. Rõ ràng là bạn sẽ phải tự mình hack một cái gì đó.
sml

Tôi đang thử mutagen, một thư viện python cấp thấp để gắn thẻ âm thanh và vẻ ngoài sơ bộ của tôi có vẻ như nó có thể làm những gì tôi cần. Tôi sẽ báo cáo lại khi tôi tìm ra mọi thứ trong đó.
dmikalova
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.