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

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

Android मीडिया फ़्रेमवर्क में अन्य मीडिया टाइप के साथ काम करने के लिए, आपको कस्टम एक्सट्रैक्टर और डीकोडर बनाना होगा. उदाहरण के लिए, AVI फ़ाइलों में Windows Media वीडियो के लिए सहायता जोड़ने के लिए, आपको AVI एक्सट्रैक्टर और Windows Media वीडियो डिकोडर बनाना होगा.

एक्सटेंशन के बारे में जानकारी

अगर डिफ़ॉल्ट मीडिया एक्सट्रैक्टर आपकी ज़रूरतों के मुताबिक नहीं हैं, तो /system/lib[64]/extractors/ में कस्टम एक्सट्रैक्टर प्लग इन डाले जा सकते हैं. एक्सट्रैक्टर प्रोसेस, Google के दिए गए APEX पैकेज और /system/lib[64]/extractors/ से, एक्सट्रैक्टर प्लग इन को अपने-आप लोड करती है.

इसी तरह, frameworks/av/media/codec2/core/ में बताए गए कोडेक 2.0 इंटरफ़ेस का इस्तेमाल करने वाली कस्टम मीडिया कोडेक सेवाएं सेट अप की जा सकती हैं. इसे लागू करने का बुनियादी तरीका जानने के लिए, 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 फ़ाइल में मैनेज किया जाता था. इसमें एमआईएम टाइप से एमटीपी फ़ॉर्मैट के कॉन्स्टेंट तक की मैपिंग होती है.

एक्सट्रैक्टर, फ़ाइल के उन एक्सटेंशन की सूची एक्सपोर्ट कर सकता है जिनमें वह काम करता है. जैसे, MP3 या MP4. हालांकि, सिर्फ़ LegacyMediaScanner इसका इस्तेमाल करता है. इसका ModernMediaScanner पर कोई असर नहीं पड़ता, जिसका इस्तेमाल डिफ़ॉल्ट रूप से किया जाता है.