আপনি ভেন্ডর এক্সটেনশন ব্যবহার করে মিডিয়া এক্সট্র্যাক্টর এবং মিডিয়া কোডেক কম্পোনেন্টগুলো সম্প্রসারিত করতে পারেন। MediaSession2 এবং MediaParser API-গুলো কাস্টমাইজ করা যায় না (কিন্তু আপনি লিগ্যাসি MediaPlayer এবং MediaSession API-গুলোর জন্য পরিবর্তনগুলো আপস্ট্রিম করতে পারেন)।
অ্যান্ড্রয়েড মিডিয়া ফ্রেমওয়ার্কে অতিরিক্ত মিডিয়া টাইপ সমর্থন করার জন্য, আপনাকে একটি কাস্টম এক্সট্র্যাক্টর এবং ডিকোডার তৈরি করতে হবে। উদাহরণস্বরূপ, AVI ফাইলে উইন্ডোজ মিডিয়া ভিডিওর জন্য সমর্থন যোগ করতে, আপনাকে একটি AVI এক্সট্র্যাক্টর এবং একটি উইন্ডোজ মিডিয়া ভিডিও ডিকোডার তৈরি করতে হবে।
এক্সটেনশন সম্পর্কে
যদি ডিফল্ট মিডিয়া এক্সট্র্যাক্টরগুলি আপনার প্রয়োজন মেটাতে না পারে, তাহলে আপনি /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-এ রাখুন, যা গুগল এক্সট্র্যাক্টর ধারণকারী গুগল 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)
আপনার কাস্টম এক্সট্র্যাক্টর যদি এমন কোনো ফরম্যাট সমর্থন করে যা ইতিমধ্যেই গুগল-প্রদত্ত কোনো এক্সট্র্যাক্টর দ্বারা সমর্থিত, তাহলে আপনি Sniff() ফাংশন ব্যবহার করে গুগল-প্রদত্তটির চেয়ে উচ্চতর কনফিডেন্স লেভেল রিটার্ন করার মাধ্যমে ফ্রেমওয়ার্ককে আপনার এক্সট্র্যাক্টরটি ব্যবহার করতে বাধ্য করতে পারেন।
যখন মিডিয়া ফ্রেমওয়ার্ক আপনার এক্সট্র্যাক্টরটি লোড করে ( /system/lib/64/extractors থেকে অথবা কোনো ভেন্ডরের APEX থেকে), তখন এটি ফাইলটিকে শনাক্ত করে এবং এর বিষয়বস্তু সম্পর্কে তথ্য সংগ্রহ করে। পরবর্তী ধাপ হলো ফরম্যাটটির জন্য একটি ডিকোডার যুক্ত করা, যাতে ফ্রেমওয়ার্কটি ফাইলের বিষয়বস্তু কীভাবে পার্স করতে হবে তা বুঝতে পারে।
একটি কাস্টম ডিকোডার তৈরি করুন
গুগল-প্রদত্ত ডিকোডার দ্বারা ইতিমধ্যে সমর্থিত নয় এমন যেকোনো ফরম্যাটের জন্য আপনার একটি কাস্টম ডিকোডার প্রয়োজন। উদাহরণস্বরূপ:
MP3 ধারণকারী AVI ফাইলগুলিতে মিডিয়া ফ্রেমওয়ার্ক সাপোর্ট যোগ করতে আপনার একটি AVI এক্সট্র্যাক্টর প্রয়োজন, কিন্তু MP3 ডিকোডারের প্রয়োজন নেই, কারণ সেটি আগে থেকেই বিদ্যমান।
উইন্ডোজ মিডিয়া ধারণকারী AVI ফাইলগুলিতে মিডিয়া ফ্রেমওয়ার্ক সাপোর্ট যোগ করতে হলে, আপনার একটি AVI এক্সট্র্যাক্টর এবং একটি উইন্ডোজ মিডিয়া ডিকোডার উভয়েরই প্রয়োজন হবে।
একটি নতুন ডিকোডার যোগ করা, AVC বা HEVC-এর জন্য আপনার নিজস্ব হার্ডওয়্যার ডিকোডার যোগ করার মতোই।
যদিও এক্সট্র্যাক্টর তার অন্তর্ভুক্ত মিডিয়া ট্র্যাকগুলির MIME টাইপ প্রকাশ করে, ফাইলটির সম্পূর্ণ সমর্থনের জন্য এই MIME টাইপগুলিকে সমর্থনকারী কোডেকগুলির উপস্থিত থাকা প্রয়োজন। ব্যবহৃত প্রকৃত MIME টাইপ স্ট্রিংটি কঠোরভাবে এক্সট্র্যাক্টর এবং কোডেকের মধ্যে একটি চুক্তিভিত্তিক বিষয় (স্ট্রিংটি MediaDefs.h ফাইলে যোগ করার প্রয়োজন নেই)।
মিডিয়া স্ক্যানারের সাথে সংযুক্ত করুন
মিডিয়া স্ক্যানার নতুন ফাইলের ধরন খুঁজে বের করে এবং সেগুলোকে মিডিয়া ডেটাবেসে যুক্ত করে। আপনার কাস্টম ফাইলের ধরনটি পরিচালনা করার জন্য, স্ক্যানারটিকে সে সম্পর্কে জানতে হবে। অ্যান্ড্রয়েড ১০ বা তার পরবর্তী সংস্করণগুলোতে, MimeUtils ( libcore এর মধ্যে) MIME-থেকে-এক্সটেনশন ম্যাপিংটি রক্ষণাবেক্ষণ করে। পূর্বে, এই ম্যাপিংটি MediaFile.java ফাইলে পরিচালিত হতো, যেখানে এখনও MIME টাইপ থেকে MTP ফরম্যাট কনস্ট্যান্টের একটি ম্যাপিং রয়েছে।
একটি এক্সট্র্যাক্টর তাদের সমর্থিত ফাইল এক্সটেনশনের (যেমন MP3 বা MP4) একটি তালিকা এক্সপোর্ট করতে পারে। তবে, শুধুমাত্র LegacyMediaScanner সেটি ব্যবহার করে; ModernMediaScanner উপর এর কোনো প্রভাব নেই, যা ডিফল্টভাবে ব্যবহৃত হয়।