মিডিয়া কম্পোনেন্ট কাস্টমাইজ করা

আপনি ভেন্ডর এক্সটেনশন ব্যবহার করে মিডিয়া এক্সট্র্যাক্টর ও মিডিয়া কোডেক কম্পোনেন্ট এক্সটেন্ড করতে পারবেন। MediaSession2 এবং MediaParser API কাস্টমাইজ করা যাবে না (তবে আপনি পুরনো MediaPlayer এবং MediaSession API-এর জন্য আপস্ট্রিম পরিবর্তন করতে পারবেন)।

Android মিডিয়া ফ্রেমওয়ার্কে অতিরিক্ত মিডিয়া টাইপ কাজ করানোর জন্য, আপনাকে কাস্টম এক্সট্র্যাক্টর ও ডিকোডার তৈরি করতে হবে। যেমন, AVI ফাইলে Windows Media ভিডিওর জন্য সহায়তা যোগ করতে, আপনাকে একটি AVI এক্সট্র্যাক্টর এবং একটি Windows Media ভিডিও ডিকোডার তৈরি করতে হবে।

এক্সটেনশন সম্পর্কে

ডিফল্ট মিডিয়া এক্সট্র্যাক্টর আপনার প্রয়োজন পূরণ না করলে, আপনি /system/lib[64]/extractors/-এ কাস্টম এক্সট্র্যাক্টর প্লাগ-ইন রাখতে পারেন। এক্সট্র্যাক্টর প্রসেস Google-এর দেওয়া APEX প্যাকেজ থেকে এবং /system/lib[64]/extractors/ থেকে অটোমেটিক এক্সট্র্যাক্টর প্লাগ-ইন লোড করে।

একইভাবে, আপনি কাস্টম মিডিয়া কোডেক পরিষেবা সেট-আপ করতে পারেন যা frameworks/av/media/codec2/core/-এ সংজ্ঞায়িত Codec 2.0 ইন্টারফেস ব্যবহার করে। প্রাথমিক প্রয়োগের জন্য, frameworks/av/media/codec2/hidl/services/ দেখুন। C2ComponentStore ইন্টারফেস হল লাইব্রেরি এন্ট্রি পয়েন্ট। যেমন, frameworks/av/media/codec2/vndk/C2Store.cpp-এ ডিফল্ট সফ্টওয়্যার কোডেক স্টোর প্রয়োগের জন্য দেখুন।

নিজের APEX ব্যবহার করার সময়, কোডেক পরিষেবা স্ট্রাকচার করুন এবং mediaswcodec পরিষেবার মতো একই প্রসেস ব্যবহার করে APEX ফাইল লোড করুন। এটি করতে, একটি সর্বোচ্চ-লেভেলের শেয়ার করা লাইব্রেরি নির্ধারণ করুন যা সমস্ত C2 কম্পোনেন্ট রেজিস্টার করার জন্য দায়ী, তারপরে ভেন্ডর পার্টিশনে থাকা একটি APEX প্যাকেজ (ট্রানজিটিভ ডিপেন্ডেন্সি সহ) তৈরি করুন। ভেন্ডর কোডেক পরিষেবা প্রসেস শুরু হলে, এটি এই টপ-লেভেল এন্ট্রি পয়েন্ট লোড করতে পারে।

এক্সট্র্যাক্টর তৈরি করুন

নতুন ফর্ম্যাটের জন্য এক্সট্র্যাক্টর যোগ করার সময়, নিশ্চিত করুন যে এক্সট্র্যাক্টরটি শুধুমাত্র স্থিতিশীল NDK API-এর উপর নির্ভর করে এবং কোনও ব্যক্তিগত API-এর উপর নির্ভর করে না। এক্সট্র্যাক্টরদের frameworks/av/include/media/MediaExtractorPluginApi.h-এর মাধ্যমে সংজ্ঞায়িত API ইমপ্লিমেন্ট করতে হবে এবং তারা frameworks/av/include/media/MediaExtractorPluginHelper.h-এ C++ কনভেনিয়েন্স র‍্যাপার ব্যবহার করতে পারবেন। Android 10 বা তার পরবর্তী যেকোনও ভার্সন শুধুমাত্র সবচেয়ে উন্নত এক্সট্র্যাক্টর API-তে কাজ করে, তাই সবচেয়ে উন্নত API ভার্সন নাম্বারের এক্সট্র্যাক্টর অনুযায়ী আপনার এক্সট্র্যাক্টর মডেল করতে ভুলবেন না।

/system/lib/64/extractors বা ভেন্ডর APEX-এ কাস্টম এক্সট্র্যাক্টর প্লেস করুন, যা Google এক্সট্র্যাক্টর সহ Google APEX-এর সাথে খোলা হয়। ফ্রেমওয়ার্ক আপনার এক্সট্র্যাক্টর লোড করেছে কিনা তা যাচাই করতে, নিম্নলিখিত কমান্ড রান করুন।

adb shell dumpsys media.extractor

আপনি উপলভ্য এক্সট্র্যাক্টরদের একটি তালিকা পাবেন যা নিচে দেওয়া তালিকার মতো।

Available extractors:
AAC Extractor: plugin\_version(2), uuid(4fd80eae03d24d729eb948fa6bb54613), version(1), path(/system/lib64/extractors/libaacextractor.so)
AMR Extractor: plugin\_version(2), uuid(c86639c92f3140aca715fa01b4493aaf), version(1), path(/system/lib64/extractors/libamrextractor.so)
FLAC Extractor: plugin\_version(2), uuid(1364b048cc454fda9934327d0ebf9829), version(1), path(/system/lib64/extractors/libflacextractor.so)
MIDI Extractor: plugin\_version(2), uuid(ef6cca0af8a243e6ba5fdfcd7c9a7ef2), version(1), path(/system/lib64/extractors/libmidiextractor.so)
MP3 Extractor: plugin\_version(2), uuid(812a3f6cc8cf46deb5293774b14103d4), version(1), path(/system/lib64/extractors/libmp3extractor.so)
MP4 Extractor: plugin\_version(2), uuid(27575c6744174c548d3d8e626985a164), version(2), path(/system/lib64/extractors/libmp4extractor.so)
MPEG2-PS/TS Extractor: plugin\_version(1), uuid(3d1dcfebe40a436da574c2438a555e5f), version(1), path(/system/lib64/extractors/libmpeg2extractor.so)
Matroska Extractor: plugin\_version(2), uuid(abbedd9238c44904a4c1b3f45f899980), version(1), path(/system/lib64/extractors/libmkvextractor.so)
Ogg Extractor: plugin\_version(2), uuid(8cc5cd06f772495e8a62cba9649374e9), version(1), path(/system/lib64/extractors/liboggextractor.so)
WAV Extractor: plugin\_version(3), uuid(7d61385858374a3884c5332d1cddee27), version(1), path(/system/lib64/extractors/libwavextractor.so)

Google-এর দেওয়া এক্সট্র্যাক্টর আগে থেকেই সাপোর্ট করে এমন ফর্ম্যাট আপনার কাস্টম এক্সট্র্যাক্টর সাপোর্ট করলে, আপনি Sniff() ফাংশন ব্যবহার করে ফ্রেমওয়ার্ককে আপনার এক্সট্র্যাক্টর ব্যবহার করতে বাধ্য করতে পারেন। এর ফলে, Google-এর দেওয়া এক্সট্র্যাক্টরের চেয়ে বেশি কনফিডেন্স লেভেল রিটার্ন করা যাবে।

মিডিয়া ফ্রেমওয়ার্ক আপনার এক্সট্র্যাক্টর লোড করলে (/system/lib/64/extractors অথবা ভেন্ডর APEX থেকে), এটি ফাইলটি শনাক্ত করে এবং এর কন্টেন্ট সম্পর্কে তথ্য পায়। পরবর্তী ধাপ হল, ফর্ম্যাটের জন্য একটি ডিকোডার যোগ করা যাতে ফ্রেমওয়ার্কটি ফাইলের কন্টেন্ট কীভাবে পার্স করতে হয় তা বুঝতে পারে।

কাস্টম ডিকোডার তৈরি করুন

Google-এর দেওয়া ডিকোডার আগে থেকেই কাজ করে না এমন কোনও ফর্ম্যাটের জন্য আপনার কাস্টম ডিকোডার প্রয়োজন। যেমন:

  • MP3 সহ AVI ফাইলের জন্য মিডিয়া ফ্রেমওয়ার্ক সাপোর্ট যোগ করতে, আপনার AVI এক্সট্র্যাক্টর প্রয়োজন কিন্তু MP3 ডিকোডারের প্রয়োজন নেই কারণ একটি আগেই আছে।

  • Windows Media সহ AVI ফাইলের জন্য মিডিয়া ফ্রেমওয়ার্ক সাপোর্ট যোগ করতে, আপনার AVI এক্সট্র্যাক্টর এবং Windows Media ডিকোডার, দুটিই প্রয়োজন।

নতুন ডিকোডার যোগ করা, AVC বা HEVC-এর জন্য আপনার নিজস্ব হার্ডওয়্যার ডিকোডার যোগ করার মতোই।

এক্সট্র্যাক্টর সেটির মধ্যে থাকা মিডিয়া ট্র্যাকের MIME টাইপ প্রকাশ করলেও, ফাইলটি সম্পূর্ণভাবে কাজ করার জন্য এই MIME টাইপ কাজ করে এমন কোডেক থাকতে হবে। ব্যবহৃত প্রকৃত MIME টাইপ স্ট্রিং হল এক্সট্র্যাক্টর ও কোডেকের মধ্যে করা চুক্তি (MediaDefs.h ফাইলে স্ট্রিং যোগ করার প্রয়োজন নেই)।

মিডিয়া স্ক্যানারের সাথে ইন্টিগ্রেট করুন

মিডিয়া স্ক্যানার নতুন ফাইলের ধরন খোঁজে এবং মিডিয়া ডেটাবেসে সেগুলি যোগ করে। মিডিয়া স্ক্যানারকে আপনার কাস্টম ফাইল টাইপ ম্যানেজ করতে হলে, স্ক্যানারকে সেটি সম্পর্কে জানতে হবে। Android 10 বা তার পরবর্তী ভার্সনে, MimeUtils (libcore-এ) MIME-টু-এক্সটেনশন ম্যাপিং বজায় রাখে। আগে, এই ম্যাপিং MediaFile.java ফাইলে ম্যানেজ করা হত, যা MIME টাইপ থেকে MTP ফর্ম্যাট কনস্ট্যান্টে ম্যাপিং চালিয়ে যায়।

এক্সট্র্যাক্টর, সেটির কাজ করে এমন ফাইলের নামের এক্সটেনশনের একটি তালিকা এক্সপোর্ট করতে পারে (যেমন, MP3 বা MP4)। তবে, শুধুমাত্র LegacyMediaScanner এটি ব্যবহার করে; ডিফল্ট হিসেবে ব্যবহৃত ModernMediaScanner-এর উপর এর কোনও প্রভাব পড়ে না।