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

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

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

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

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

अपनी APEX सेवा का इस्तेमाल करते समय, कोडेक सेवा को स्ट्रक्चर करें और mediaswcodec सेवा वाली प्रोसेस का इस्तेमाल करके APEX फ़ाइल लोड करें. ऐसा करने के लिए, एक टॉप लेवल शेयर की गई लाइब्रेरी तय करें जो सभी C2 कॉम्पोनेंट को रजिस्टर करने के लिए ज़िम्मेदार है. इसके बाद, वेंडर पार्टिशन में मौजूद एक APEX पैकेज (ट्रांसफ़रिव डिपेंडेंसी के साथ) बनाएं. जब वेंडर कोडेक सेवा की प्रोसेस शुरू होती है, तब इस टॉप लेवल एंट्री पॉइंट को लोड किया जा सकता है.

डेटा इकट्ठा करने वाला टूल बनाएं

नए फ़ॉर्मैट के लिए डेटा इकट्ठा करने वाले टूल को जोड़ते समय, पक्का करें कि डेटा इकट्ठा करने वाला टूल सिर्फ़ स्टेबल एनडीके एपीआई पर निर्भर हो और किसी निजी एपीआई पर निर्भर न हो. एक्सट्रैक्टर को 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 डिकोडर दोनों की आवश्यकता होगी.

नया डिकोडर जोड़ना, एवीसी या एचईवीसी के लिए अपने हार्डवेयर डिकोडर जोड़ने जैसा ही है.

डेटा इकट्ठा करने वाला टूल, इसमें शामिल मीडिया ट्रैक के MIME टाइप को पब्लिश करता है. हालांकि, फ़ाइल के पूरी तरह से काम करने के लिए, इन MIME टाइप के साथ काम करने वाले कोडेक मौजूद होने चाहिए. इस्तेमाल की जाने वाली असल MIME टाइप स्ट्रिंग, डेटा इकट्ठा करने वाले टूल और कोडेक के बीच का एक समझौता है. (स्ट्रिंग को MediaDefs.h फ़ाइल में जोड़ना ज़रूरी नहीं है).

मीडिया स्कैनर के साथ इंटिग्रेट करें

मीडिया स्कैनर नए फ़ाइल टाइप खोजता है और उन्हें मीडिया डेटाबेस में जोड़ता है. मीडिया स्कैनर से आपका कस्टम फ़ाइल टाइप हैंडल किया जा सके, इसके लिए स्कैनर को इसके बारे में जानना होगा. Android 10 या उसके बाद के वर्शन में, MimeUtils (libcore में) एमआईएमई-टू-एक्सटेंशन मैपिंग को बनाए रखता है. पहले, इस मैपिंग को MediaFile.java फ़ाइल में मैनेज किया जाता था. इसमें MIME टाइप से MTP फ़ॉर्मैट कॉन्सटेंट तक की मैपिंग शामिल होती है.

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