मीडिया घटकों को अनुकूलित करें

आप विक्रेता एक्सटेंशन का उपयोग करके मीडिया एक्सट्रैक्टर और मीडिया कोडेक घटकों का विस्तार कर सकते हैं। MediaSession2 और MediaParser API को कस्टमाइज़ नहीं किया जा सकता (लेकिन आप लीगेसी MediaPlayer और MediaSession API के लिए अपस्ट्रीम परिवर्तन कर सकते हैं)।

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

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

यदि डिफ़ॉल्ट मीडिया एक्सट्रैक्टर आपकी आवश्यकताओं को पूरा नहीं करते हैं, तो आप कस्टम एक्सट्रैक्टर प्लगइन्स को /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++ सुविधा रैपर का उपयोग कर सकते हैं। क्योंकि एंड्रॉइड 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-प्रदत्त एक्सट्रैक्टर द्वारा समर्थित है, तो आप Google-प्रदत्त की तुलना में उच्च आत्मविश्वास स्तर वापस करने के लिए Sniff() फ़ंक्शन का उपयोग करके फ़्रेमवर्क को अपने एक्सट्रैक्टर का उपयोग करने के लिए मजबूर कर सकते हैं।

जब मीडिया फ्रेमवर्क आपके एक्सट्रैक्टर को लोड करता है ( /system/lib/64/extractors से या विक्रेता APEX से), तो यह फ़ाइल को पहचानता है और इसकी सामग्री के बारे में जानकारी प्राप्त करता है। अगला कदम प्रारूप के लिए एक डिकोडर जोड़ना है ताकि फ्रेमवर्क समझ सके कि फ़ाइल सामग्री को कैसे पार्स किया जाए।

एक कस्टम डिकोडर बनाएं

आपको किसी भी प्रारूप के लिए एक कस्टम डिकोडर की आवश्यकता है जो पहले से ही Google द्वारा प्रदत्त डिकोडर द्वारा समर्थित नहीं है। उदाहरण के लिए:

  • MP3 युक्त AVI फ़ाइलों के लिए मीडिया फ्रेमवर्क समर्थन जोड़ने के लिए, आपको एक AVI एक्सट्रैक्टर की आवश्यकता है लेकिन MP3 डिकोडर की आवश्यकता नहीं है क्योंकि एक पहले से ही मौजूद है।

  • विंडोज़ मीडिया वाली एवीआई फ़ाइलों के लिए मीडिया फ्रेमवर्क समर्थन जोड़ने के लिए, आपको एक एवीआई एक्सट्रैक्टर और एक विंडोज़ मीडिया डिकोडर दोनों की आवश्यकता होगी।

एक नया डिकोडर जोड़ना AVC या HEVC के लिए अपने स्वयं के हार्डवेयर डिकोडर जोड़ने के समान है।

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

मीडिया स्कैनर के साथ एकीकृत करें

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

एक एक्सट्रैक्टर उन फ़ाइल नाम एक्सटेंशन की सूची निर्यात कर सकता है जिनका वे समर्थन करते हैं (जैसे एमपी3 या एमपी4)। हालाँकि, केवल LegacyMediaScanner ही इसका उपयोग करता है; इसका ModernMediaScanner पर कोई प्रभाव नहीं है, जो डिफ़ॉल्ट रूप से उपयोग किया जाता है।