लिनक्स में कमांड लाइन के माध्यम से ओजीजी में एल्बम कला को एम्बेड करें


15

मैं अपने संगीत को flac से ogg में बदलना चाहता हूं, और वर्तमान में oggenc एल्बम कला को छोड़कर पूरी तरह से करता है। मेटाफ़्लैक एल्बम कला का उत्पादन कर सकता है, हालाँकि ओग में एल्बम कला को एम्बेड करने के लिए कोई कमांड लाइन टूल नहीं है। MP3Tag और EasyTag इसे करने में सक्षम हैं, और यहां इसके लिए एक विनिर्देश है जो छवि को बेस 64 एन्कोडेड होने के लिए कहता है। हालाँकि अभी तक मैं एक छवि फ़ाइल लेने में सक्षम होने में असफल रहा हूँ, इसे बेस 64 में परिवर्तित करके एक ओग फ़ाइल में एम्बेड कर रहा हूँ।

अगर मैं एक ओग फ़ाइल से बेस 64 एनकोडेड इमेज लेता हूं, जिसमें पहले से ही एंबेडेड इमेज है, तो मैं आसानी से वोरबिसकॉम्बमेंट का उपयोग करके इसे दूसरी इमेज में एम्बेड कर सकता हूं:

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

मेरी समस्या एक jpeg की तरह कुछ ले रही है और इसे base64 में परिवर्तित कर रही है। वर्तमान में मेरे पास है:

base64 --wrap=0 ./image.jpg

जो मुझे छवि फ़ाइल को बेस 64 में परिवर्तित कर देता है, vorbiscomment का उपयोग करता है और टैगिंग नियमों का पालन करता है, मैं उसे इस तरह एक ओग फ़ाइल में एम्बेड कर सकता हूं:

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

हालांकि इससे मुझे एक ओग मिलता है जिसकी छवि ठीक से काम नहीं करती है। जब मैंने देखा कि बेस 64 स्ट्रिंग्स की तुलना करते हुए कि सभी ठीक से एम्बेड किए गए चित्रों में हेडर लाइन है लेकिन मेरे द्वारा बनाए गए सभी बेस 64 स्ट्रिंग्स में इस हेडर की कमी है। हेडर का आगे का विश्लेषण:

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 सामने के कवर से मेल खाती है और छवि / जेपीएम माइम प्रकार है।

तो आखिरकार, मेरा सवाल यह है कि मैं किसी फ़ाइल को कैसे आरेखित करूं और इस हेडर को एक ओग फ़ाइल में एम्बेड करने के लिए कैसे उत्पन्न करूं?

जवाबों:


5

मैंने अभी एक स्क्रिप्ट लिखी है जो ओआरजी / वोरबिस फाइलों से vorbiscomment का उपयोग करके निर्यात / आयात करती है। यह एक संगीत पुस्तकालय रूपांतरण उपकरण का हिस्सा है।

इस उपकरण के 'mussync-tools-transfert_images' फ़ंक्शन में प्रचलित स्क्रिप्ट है:

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

असल में, मैंने मेटाडेटा_ब्लॉक_चित्र के प्रारूप के लिए एक पाठक और एक लेखक लिखा है।

कोड काफी जटिल है:

      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 /path/to/music_file.ogg /path/to/image_file

यह METADATA_BLOCK_PICTURE फ़ील्ड के साथ आपकी ogg फ़ाइल को टैग करता है। ईमाइटैटेग METADATA_BLOCK_PICTURE के बजाय COVERART फ़ील्ड के साथ ऐसा करने के पुराने तरीके का उपयोग करता है। अगर आपको ईजीटेग कम्पैटिबिलिटी चाहिए तो आप स्क्रिप्ट को इस तरह चला सकते हैं:

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
जेसन

मैंने पोस्ट में स्क्रिप्ट फॉर्मेटिंग को ठीक किया।
Gaff

1
यदि आपको उबंटू में "सिंटैक्स त्रुटि:" ("अप्रत्याशित" प्राप्त होती है, तो संभवतः यह शेल के साथ चलाने के लिए उपयोग किया जाने वाला कुछ है। मैंने पहली पंक्ति को #! / Bin / bash में बदल दिया और यह काम कर गया।
Dan Gravell

1
यह स्क्रिप्ट मेरे लिए काम नहीं कर रही है। जैसा कि मैं देख सकता हूं कि यह केवल छवि के बेस 64 का उपयोग करता है, लेकिन इसके पहले एक विशेष हेडर होने की आवश्यकता है
सर्गेई

2

मुझे ऐसी किसी भी चीज़ के बारे में पता नहीं है जो छवि को इंगित करके स्वचालित रूप से करती है।

हालाँकि, vorbiscomment मनमाने ढंग से टैग एम्बेड कर सकता है, आपको बस बेस 64 में छवि को एनकोड करना होगा और फिर टैग को सही प्रारूप में बनाना होगा

जैसे vorbiscomment -a -t 'METADATA_BLOCK_PICTURE=...' file.ogg newfile.ogg

आपको उपयोगी होने के लिए इन चरणों को किसी प्रकार की स्क्रिप्ट में हैक करना होगा।


यह उल्लेखनीय होगा, लेकिन दुख की बात है कि अगर तस्वीर 64kb से अधिक है तो vorbiscomments रिटर्न "/ usr / bin / vorbiscomment: तर्क सूची बहुत लंबी है"। किसी भी विचार कैसे इस के आसपास पाने के लिए?
dikikalova

आपका सिस्टम क्या है, और इसका आउटपुट क्या है getconf ARG_MAX? दुर्भाग्य से कर्नेल को फिर से देखे बिना इस सीमा के आसपास कोई रास्ता नहीं है। यहां 64-बिट 2.6.32-24 पर, मेरे पास 2 एमबी है।
sml करें

मैं आर्च लिनेक्स 64-बिट 2.6.34.1-1 चला रहा हूं और मेरे पास 2mb भी है। क्या मार्कर में दर्ज करना संभव होगा जैसे vorbiscomment -a -t 'METADATA_BLOCK_PICTURE = मार्कर' file.ogg newfile.ogg, तो कुछ ओग फ़ाइल पढ़ी है और मार्कर को base64 छवि के साथ बदलें?
dmikalova

पूर्ण रूप से। यदि आपको टैग प्रारूप युक्ति मैं जुड़ा हुआ दिखाई देता है, तो आप अस्थायी (छोटी) छवि डालने के लिए vorbiscomment का उपयोग कर सकते हैं, और फिर सीधे टैग के अंतिम दो भागों - डेटा की लंबाई और डेटा को अपडेट करने वाली फ़ाइल को लिख सकते हैं। जाहिर है आपको अपने आप को एक साथ कुछ हैक करना होगा।
sml करें

मैं म्यूजेन की कोशिश कर रहा हूं, ऑडियो टैगिंग के लिए एक निम्न स्तर का पायथन पुस्तकालय और मेरे प्रारंभिक रूप से ऐसा लगता है कि यह वही कर सकता है जो मुझे चाहिए। जब मैं इसमें चीजों का पता लगाऊंगा तो रिपोर्ट करूंगा।
dikikalova
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.