मीडिया कॉम्पोनेंट को पसंद के मुताबिक बनाना

वेंडर एक्सटेंशन का इस्तेमाल करके, मीडिया एक्सट्रैक्टर और मीडिया कोडेक कॉम्पोनेंट को बढ़ाया जा सकता है. MediaSession2 और MediaParser एपीआई को पसंद के मुताबिक नहीं बनाया जा सकता. हालांकि, लेगसी MediaPlayer और MediaSession एपीआई के लिए, अपस्ट्रीम बदलाव किए जा सकते हैं.

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 पैकेज (ट्रांज़िटिव डिपेंडेंसी के साथ) बनाएं. यह पैकेज, वेंडर पार्टिशन में मौजूद होता है. जब वेंडर कोडेक सेवा की प्रोसेस शुरू होती है, तब यह टॉप-लेवल एंट्री पॉइंट को लोड कर सकती है.

एक्सट्रैक्टर बनाना

नए फ़ॉर्मैट के लिए एक्सट्रैक्टर जोड़ते समय, पक्का करें कि एक्सट्रैक्टर सिर्फ़ स्टेबल NDK एपीआई पर निर्भर हो और किसी भी निजी एपीआई पर निर्भर न हो. एक्सट्रैक्टर को frameworks/av/include/media/MediaExtractorPluginApi.h में तय किए गए एपीआई को लागू करना चाहिए. साथ ही, वे frameworks/av/include/media/MediaExtractorPluginHelper.h में C++ के सुविधा रैपर का इस्तेमाल कर सकते हैं. Android 10 या इसके बाद के वर्शन में, सिर्फ़ एक्सट्रैक्टर एपीआई का सबसे नया वर्शन काम करता है. इसलिए, पक्का करें कि आपने एक्सट्रैक्टर को एक्सट्रैक्टर एपीआई के सबसे नए वर्शन के हिसाब से मॉडल किया हो.

कस्टम एक्सट्रैक्टर को /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 पर कोई असर नहीं पड़ता, जिसका इस्तेमाल डिफ़ॉल्ट रूप से किया जाता है.