वेंडर एक्सटेंशन का इस्तेमाल करके, मीडिया एक्सट्रैक्टर और मीडिया कोडेक कॉम्पोनेंट को बढ़ाया जा सकता है. MediaSession2 और MediaParser API को पसंद के मुताबिक नहीं बनाया जा सकता. हालांकि, लेगसी MediaPlayer और MediaSession API के लिए, अपस्ट्रीम बदलाव किए जा सकते हैं.
Android मीडिया फ़्रेमवर्क में अन्य मीडिया टाइप इस्तेमाल करने के लिए, आपको कस्टम एक्सट्रैक्टर और डिकोडर बनाना होगा. उदाहरण के लिए, AVI फ़ाइलों में Windows Media वीडियो के लिए सहायता जोड़ने के लिए, आपको एक AVI एक्सट्रैक्टर और एक Windows Media वीडियो डिकोडर बनाना होगा.
एक्सटेंशन के बारे में
अगर डिफ़ॉल्ट मीडिया एक्सट्रैक्टर आपकी ज़रूरतों को पूरा नहीं करते हैं, तो /system/lib[64]/extractors/ में कस्टम एक्सट्रैक्टर प्लगिन जोड़े जा सकते हैं. एक्सट्रैक्टर प्रोसेस, Google की ओर से उपलब्ध कराए गए APEX पैकेज और /system/lib[64]/extractors/ से एक्सट्रैक्टर प्लगिन अपने-आप लोड करती है.
इसी तरह, Codec 2.0 इंटरफ़ेस का इस्तेमाल करने वाली कस्टम मीडिया कोडेक सेवाएं सेट अप की जा सकती हैं. यह इंटरफ़ेस frameworks/av/media/codec2/core/ में तय किया गया है. बुनियादी तौर पर लागू करने के लिए, frameworks/av/media/codec2/hidl/services/ देखें. लाइब्रेरी का एंट्री पॉइंट, C2ComponentStore इंटरफ़ेस है. उदाहरण के लिए, frameworks/av/media/codec2/vndk/C2Store.cpp पर डिफ़ॉल्ट सॉफ़्टवेयर कोडेक स्टोर को लागू करने का तरीका देखें.
अपने एपीईएक्स का इस्तेमाल करते समय, कोडेक सेवा को स्ट्रक्चर करें और एपीईएक्स फ़ाइल को लोड करें. इसके लिए, mediaswcodec सेवा की तरह ही प्रोसेस का इस्तेमाल करें. इसके लिए, एक टॉप-लेवल की शेयर की गई लाइब्रेरी तय करें. यह लाइब्रेरी, सभी C2 कॉम्पोनेंट को रजिस्टर करने के लिए ज़िम्मेदार होगी. इसके बाद, वेंडर पार्टिशन में मौजूद एक APEX पैकेज (ट्रांज़िटिव डिपेंडेंसी के साथ) बनाएं. जब वेंडर कोडेक सेवा की प्रोसेस शुरू होती है, तब यह टॉप-लेवल एंट्री पॉइंट को लोड कर सकती है.
एक्सट्रैक्टर बनाना
किसी नए फ़ॉर्मैट के लिए एक्सट्रैक्टर जोड़ते समय, पक्का करें कि एक्सट्रैक्टर सिर्फ़ स्टेबल एनडीके एपीआई पर निर्भर हो और किसी भी निजी एपीआई पर निर्भर न हो. एक्सट्रैक्टर को frameworks/av/include/media/MediaExtractorPluginApi.h में तय किए गए एपीआई को लागू करना चाहिए. साथ ही, वे frameworks/av/include/media/MediaExtractorPluginHelper.h में C++ के सुविधा रैपर का इस्तेमाल कर सकते हैं. Android 10 या इसके बाद के वर्शन में, सिर्फ़ एक्सट्रैक्टर एपीआई का सबसे नया वर्शन काम करता है. इसलिए, पक्का करें कि आपने एक्सट्रैक्टर को एक्सट्रैक्टर एपीआई के सबसे नए वर्शन के हिसाब से मॉडल किया हो.
कस्टम एक्सट्रैक्टर को /system/lib/64/extractors या वेंडर एपीईएक्स में रखें. यह Google एक्सट्रैक्टर वाले Google एपीईएक्स के साथ खुलता है. यह पुष्टि करने के लिए कि फ़्रेमवर्क ने आपके एक्सट्रैक्टर को लोड किया है, यह कमांड चलाएं.
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 के लिए अपने हार्डवेयर डिकोडर जोड़ने के तरीके से मिलता-जुलता है.
एक्सट्रैक्टर, मीडिया ट्रैक के एमआईएमई टाइप पब्लिश करता है. हालांकि, फ़ाइल के साथ पूरी तरह से काम करने के लिए, इन एमआईएमई टाइप के साथ काम करने वाले कोडेक मौजूद होने चाहिए. इस्तेमाल की गई एमआईएमई टाइप स्ट्रिंग, एक्सट्रैक्टर और कोडेक के बीच एक समझौता है. इस स्ट्रिंग को MediaDefs.h फ़ाइल में जोड़ने की ज़रूरत नहीं है.
मीडिया स्कैनर के साथ इंटिग्रेट करना
मीडिया स्कैनर, नई तरह की फ़ाइलें ढूंढता है और उन्हें मीडिया डेटाबेस में जोड़ता है.
अगर आपको मीडिया स्कैनर से अपने कस्टम फ़ाइल टाइप को मैनेज कराना है, तो स्कैनर को इसके बारे में जानकारी देनी होगी. Android 10 या इसके बाद के वर्शन में, MimeUtils (libcore में) MIME टाइप से एक्सटेंशन की मैपिंग को बनाए रखता है. इससे पहले, इस मैपिंग को MediaFile.java फ़ाइल में मैनेज किया जाता था. इसमें अब भी एमआईएमई टाइप से लेकर MTP फ़ॉर्मैट के कॉन्स्टेंट तक की मैपिंग होती है.
एक्सट्रैक्टर, फ़ाइलनाम एक्सटेंशन की एक सूची एक्सपोर्ट कर सकता है. इसमें वे एक्सटेंशन शामिल होते हैं जिनके साथ एक्सट्रैक्टर काम करता है. जैसे, MP3 या MP4. हालांकि, इसका इस्तेमाल सिर्फ़ LegacyMediaScanner करता है. इसका ModernMediaScanner पर कोई असर नहीं पड़ता, जिसका इस्तेमाल डिफ़ॉल्ट रूप से किया जाता है.