LinuxのコマンドラインからOGGにアルバムアートを埋め込む


15

私は自分の音楽をflacからoggに変換したいのですが、現在oggencはアルバムアート以外は完全にそれを行っています。Metaflacはアルバムアートを出力できますが、アルバムアートをoggに埋め込むコマンドラインツールはないようです。MP3TagとEasyTagはそれを行うことができ、base64でエンコードされる画像を要求する仕様がここにあります。ただし、これまでのところ、画像ファイルを取得してbase64に変換し、oggファイルに埋め込むことができませんでした。

既に画像が埋め込まれているoggファイルからbase64でエンコードされた画像を取得する場合、vorbiscommentを使用して別の画像に簡単に埋め込むことができます。

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

私の問題は、jpegのようなものを取得してbase64に変換することです。現在私は持っています:

base64 --wrap=0 ./image.jpg

これにより、vorbiscommentを使用してタグ付け規則に従ってbase64に変換された画像ファイルが得られ、次のように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はMIMEタイプです。

最後に、私の質問は、ファイルをbase64でエンコードし、oggファイルに埋め込むためにこのヘッダーをヘッダーとともに生成するにはどうすればよいですか?

回答:


5

vorbiscommentを使用してOGG / Vorbisファイルから画像をエクスポート/インポートするスクリプトを作成しました。これは、音楽ライブラリ変換ツールの一部です。

すばらしいスクリプトは、このツールの「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は、METADATA_BLOCK_PICTUREの代わりにCOVERARTフィールドでこれを行う古い方法を使用します。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
ジェイソン

投稿のスクリプトの書式を修正しました。
ガフ

1
あなたは、「構文エラー: 『を取得した場合のUbuntuで(』予想外の」それはおそらく実行するために使用されているシェルとは何かだ、私は#/ binに/ bashのに最初の行を変更し、それが働いた。!。
ダンGravell

1
このスクリプトは機能していません。私はそれが唯一の画像のBASE64を使用しますが、その前に特別なヘッダが必要である見ることができるように
セルゲイ

2

画像を指すだけで自動的にそれを行うものは知りません。

しかしvorbiscomment缶は任意のタグを埋め込む、あなただけのために必要BASE64で画像を符号化し、その後、正しい形式でタグを構築します

例えば vorbiscomment -a -t 'METADATA_BLOCK_PICTURE=...' file.ogg newfile.ogg

これらの手順をハッキングして、何らかのスクリプトを作成する必要があります。


これは実行可能ですが、悲しいことに、画像が64kbを超える場合、vorbiscommentsは「/ usr / bin / vorbiscomment:Argument list too long」を返します。これを回避する方法はありますか?
-dmikalova

あなたのシステムは何であり、出力はgetconf ARG_MAX何ですか?残念ながら、カーネルを再コンパイルせずにこの制限を回避する方法はありません。64ビット2.6.32-24では、2 MBです。
sml

Arch Linux 64ビット2.6.34.1-1を実行していますが、2MBもあります。vorbiscomment -a -t 'METADATA_BLOCK_PICTURE = marker' file.ogg newfile.oggなどのマーカーを配置し、oggファイルを読み取ってマーカーをbase64イメージに置き換えることは可能でしょうか?
-dmikalova

絶対に。リンクしたタグ形式の仕様が表示される場合、vorbiscommentを使用して一時的な(小さな)イメージを挿入し、タグの最後の2つの部分(データ長とデータ自体)を更新するファイルに直接書き込むことができます。ただし、明らかに自分で何かを一緒にハックする必要があります。
sml

私はmutagenを試してみました。これは、オーディオタギング用の低レベルPythonライブラリであり、私の予備的な外観は必要なことを実行できるようです。私はその中に物事を把握したときに報告します。
-dmikalova
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.