লিনাক্সের কমান্ড লাইনের মাধ্যমে ওজিজিতে অ্যালবাম আর্ট এম্বেড করুন


15

আমি আমার সংগীতকে ফ্ল্যাক থেকে ওগিতে রূপান্তর করতে চাই, এবং বর্তমানে ওগজেঙ্ক অ্যালবাম আর্ট ব্যতীত পুরোপুরি এটি করে। মেটাফ্ল্যাক অ্যালবাম আর্টকে আউটপুট দিতে পারে, তবে অ্যালবাম আর্টকে ওগিতে এম্বেড করার জন্য কোনও কমান্ড লাইন সরঞ্জাম নেই বলে মনে হয়। এমপি 3 ট্যাগ এবং ইজিট্যাগ এটি করতে সক্ষম হয় এবং এটির জন্য এখানে একটি স্পেসিফিকেশন রয়েছে যা চিত্রটি বেস 64 কে এনকোড করতে বলে। তবে এখনও অবধি আমি একটি চিত্র ফাইল নিতে সক্ষম হয়েছি, এটি বেস64 এ রূপান্তর করে এবং এটি একটি ওগ ফাইলে এম্বেড করতে ব্যর্থ হয়েছি।

আমি যদি ইতিমধ্যে এম্বেড থাকা ছবিটি কোনও ওজিগ ফাইল থেকে একটি বেস 64 এনকোডযুক্ত চিত্রটি গ্রহণ করি তবে আমি খুব সহজেই ভোরবিস্কোমেন্ট ব্যবহার করে এটি অন্য চিত্রটিতে এম্বেড করতে পারি:

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

আমার সমস্যাটি জেপিগের মতো কিছু নিয়েছে এবং এটিকে বেস 64 এ রূপান্তর করছে। বর্তমানে আমার আছে:

base64 --wrap=0 ./image.jpg

যা আমাকে ভোরবিস্কোমেন্ট ব্যবহার করে এবং ট্যাগিং নিয়ম অনুসরণ করে বেস 64 এ রূপান্তরিত ইমেজ ফাইলটি দেয়, আমি এটিকে একটি ওগ ফাইলটিতে এম্বেড করতে পারি:

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

আমি সবেমাত্র একটি স্ক্রিপ্ট লিখেছি যা ভেরবিস্কোমেন্ট ব্যবহার করে ওজিজি / ভারবিস ফাইলগুলি থেকে চিত্রগুলি রফতানি / আমদানি করে। এটি একটি সঙ্গীত লাইব্রেরি রূপান্তর সরঞ্জামের অংশ।

সম্মানজনক স্ক্রিপ্টটি এই সরঞ্জামটির 'মিস্টিঙ্ক-সরঞ্জাম-স্থানান্তর_ চিত্রসমূহ' ফাংশনে রয়েছে:

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 এর জন্য আমার সমাধান এখানে: আর্গুমেন্টের তালিকা খুব দীর্ঘ সমস্যার। আমি একটি স্ক্রিপ্ট তৈরি করেছি এবং এর নাম রেখেছি gগার্ট। কমান্ড লাইন থেকে কেবল এটির মতো চালান:

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

এটি আপনার ওগ ফাইলটিকে METADATA_BLOCK_PICTURE ক্ষেত্রের সাথে ট্যাগ করে। ইজিস্ট্যাগ 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
জেসন

আমি স্ক্রিপ্ট বিন্যাস পোস্টে স্থির করেছি।
গাফ

1
যদি আপনি "সিন্ট্যাক্স ত্রুটি:" (উবুন্টুতে "অপ্রত্যাশিত" পেয়ে থাকেন তবে শেলটি চালানোর জন্য সম্ভবত এটি করার কিছু ছিল I আমি প্রথম লাইনটিকে #! / বিন / বাশে পরিণত করেছি এবং এটি কার্যকর হয়েছে
ড্যান গ্র্যাভেল

1
এই স্ক্রিপ্টটি আমার পক্ষে কাজ করছে না। আমি দেখতে পাচ্ছি এটি কেবল চিত্রের বেস 64 ব্যবহার করে তবে এর আগে একটি বিশেষ শিরোনাম হওয়া দরকার
সের্গেই

2

আমি কেবল চিত্রটির দিকে ইশারা করে এটি স্বয়ংক্রিয়ভাবে ঘটে এমন কোনও কিছুই সম্পর্কে আমি সচেতন নই।

তবে ভোরবিস্কোমেন্ট স্বেচ্ছাসেবী ট্যাগ এম্বেড করতে পারে, আপনার কেবলমাত্র ইমেজটি বেস 64 এ এনকোড করতে হবে এবং তারপরে সঠিক বিন্যাসে ট্যাগটি তৈরি করতে হবে

যেমন vorbiscomment -a -t 'METADATA_BLOCK_PICTURE=...' file.ogg newfile.ogg

এটি কার্যকর হওয়ার জন্য আপনাকে কোনও ধরণের স্ক্রিপ্টে এই পদক্ষেপগুলি হ্যাক করতে হবে।


এটি করণীয় হবে, তবে দুঃখের বিষয় যদি ছবিটি k৪ কেবি এর বেশি হয় তবে ভোরবিস্কোমেন্টগুলি "/ usr / bin / vorbiscomment: আর্গুমেন্টের তালিকাটি বেশ দীর্ঘ"। এই সম্পর্কে কিভাবে পেতে কোন ধারণা?
dmikalova

আপনার সিস্টেম কি এবং এর ফলাফল কি getconf ARG_MAX? দুর্ভাগ্যক্রমে কার্নেলটি পুনরায় সংশোধন না করে এই সীমাটির চারপাশের কোনও উপায় নেই। এখানে 64-বিট 2.6.32-24 এ, আমার 2 এমবি রয়েছে।
SML

আমি খিলান লিনাক্স -৪-বিট ২.6.৩৪.১-১ চালাচ্ছি এবং আমার কাছেও 2 এমবি রয়েছে। একটি মার্কার যেমন ভোরবিস্কোমেন্ট -a -t 'মেটাডাটা_ব্লকপিকচার = মার্কার' ফাইল.ogg newfile.ogg স্থাপন করা সম্ভব হবে, তারপরে ogg ফাইলটি পড়তে হবে এবং চিহ্নিতকরণটিকে বেস 64 এর সাথে প্রতিস্থাপন করতে পারে?
dmikalova

একেবারে। আমি যদি সংযুক্ত ট্যাগ ফর্ম্যাটটি দেখেছি তবে আপনি একটি অস্থায়ী (ছোট) চিত্র সন্নিবেশ করানোর জন্য ভোরবিস্কোমেন্ট ব্যবহার করতে পারেন, এবং তারপরে সরাসরি ট্যাগের শেষ দুটি অংশ আপডেট করার ফাইলটিতে লিখতে পারেন - ডেটা দৈর্ঘ্য এবং নিজেই ডেটা। অবশ্যই আপনাকে নিজের সাথে কিছু হ্যাক করতে হবে।
sml

আমি মিউটেজেন চেষ্টা করছি, অডিও ট্যাগিংয়ের জন্য একটি নিম্ন স্তরের পাইথন লাইব্রেরি এবং আমার প্রাথমিক চেহারা দেখে মনে হচ্ছে এটি আমার যা প্রয়োজন তা করতে পারে। আমি এর মধ্যে জিনিসগুলি বের করার পরে আমি প্রতিবেদন করব।
dmikalova
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.