इस पोस्ट में, मैं एक उदाहरण के रूप H.264
उपयोग कर रहा हूँ, लेकिन समाधान (रों) बढ़ाया जा सकता है MPEG-4
, VC-1
, VP8
इत्यादि जैसे अन्य कोडेक्स का समर्थन करने के लिए। आपकी समस्या को हल करने के लिए 2 संभावित समाधान हैं, जिन्हें मैं नीचे सूचीबद्ध कर रहा हूं, प्रत्येक को अपने स्वयं के पेशेवरों और विपक्ष के साथ एक सूचित निर्णय लेने में मदद करने के लिए।
समाधान 1: नई विधा का समर्थन करने के
JellyBean
में कोडेक का विस्तार, एक 2 अलग घटकों के नाम अर्थात, OMX.ABC.XYZ
और OMX.ABC.XYZ.secure
रूप में एक ही MIME
प्रकार के साथ एक ही OMX
घटक रजिस्टर कर सकते हैं।। पूर्व को सामान्य प्लेबैक के लिए उपयोग किया जाता है और यह आमतौर पर उपयोग किया जाने वाला घटक होता है। उत्तरार्द्ध का उपयोग तब किया जाता है जब पार्सर i.e. MediaExtractor
सुरक्षित सामग्री की उपस्थिति को इंगित करता है। OMXCodec::Create
में, findMatchingCodecs
के बाद कोडेक्स की एक सूची लौटाती है, हम घटक here के रूप में चुनने के लिए विकल्प का निरीक्षण कर सकते हैं।
चरणों का अनुसरण करें:
अपने मंच में, जैसे OMX.H264.DECODER.decrypt
या कुछ इसी तरह के कुछ नए विस्तार के साथ एक और घटक रजिस्टर। परिवर्तन केवल media_codecs.xml
में आवश्यक है। नई फैक्ट्री विधि पंजीकृत करने या सामान्य फैक्ट्री विधि रखने का विकल्प आपकी पसंद है।
अपने पार्सर से, जब आप विशिष्ट उपयोग-मामले का सामना करते हैं, तो kKeyDecryptionRequired
जैसे नए ध्वज को सेट करें। इसके लिए आपको में एक नया झंडा परिभाषित करना होगा और OMXCodec.h
में एक संबंधित क्विर्क परिभाषित करना होगा।
ऊपर दिखाए गए .secure
प्रत्यय के समान .decrypt
प्रत्यय को जोड़ने के लिए OMXCodec::create
विधि को संशोधित करने के लिए OMXCodec::create
विधि संशोधित करें।
OMXCodec
, Metadata
, MediaExtractor
मॉड्यूल में सभी परिवर्तनों के साथ , आप केवल libstagefright.so
के पुनर्निर्माण और अपने मंच पर एक ही बदलने के लिए होगा।
वोला !! आपका एकीकरण पूरा होना चाहिए। अब घटक के अंदर मुख्य चुनौती आता है। घटक कार्यान्वयन के हिस्से के रूप में, आप एक साधारण घटक निर्माण और .decrypt
घटक निर्माण के बीच अंतर करने में सक्षम होना चाहिए।
एक क्रम दृष्टिकोण से, यह सोचते हैं कि अपने घटक तथ्य यह है कि यह एक .decrypt
घटक है या नहीं के बारे में पता है, तो आप OMX_EmptyThisBuffer
कॉल, आप डेटा जहां डिक्रिप्ट और फिर इसे करने के लिए दे सकते हैं के हिस्से के रूप decryption
संभाल सकता अंतर्निहित कोडेक।
पेशेवर: एकीकृत करने में आसान, एंड्रॉइड फ्रेमवर्क में न्यूनतम परिवर्तन, अन्य कोडेक्स के लिए स्केलेबल, कोई नया MIME
टाइप पंजीकरण आवश्यक है।
विपक्ष: आपको विशेष रूप से नए quirks, झंडे और .decrypt
एक्सटेंशन की पसंद पर एंड्रॉइड के भविष्य के संशोधन को ट्रैक करने की आवश्यकता है। यदि Google कुछ समान नियोजित करने का निर्णय लेता है, तो आपको तदनुसार अपने समाधान को अनुकूलित/संशोधित करना होगा।
समाधान 2: नई MIME प्रकार
का पंजीकरण अपने प्रश्न से, यह स्पष्ट नहीं है कि आप या नहीं MIME
प्रकार को परिभाषित करने में सक्षम थे और इसलिए, मैं स्पष्टता के लिए चरणों का कब्जा रहा हूँ।
चरणों का अनुसरण करें:
MediaDefs
में एक नया MIME
प्रकार रजिस्टर दिखाया गया है here। उदाहरण के लिए, आप एक नया MIME
प्रकार const char *MEDIA_MIMETYPE_VIDEO_AVC_ENCRYPT = "video/avc-encrypt";
रूप media_codecs.xml
में इस अद्यतन MIME
प्रकार के साथ अपने नए घटक रजिस्टर रोजगार सकता है। कृपया ध्यान दें कि आपको यह सुनिश्चित करना होगा कि तदनुसार घटक क्विर्क भी संभाले जाएंगे।
OMXCodec::setVideoOutputFormat
विधि कार्यान्वयन में, आप के रूप में H.264
here के लिए दिखाया अपना नया MIME
प्रकार से निपटने के लिए समर्थन प्रस्तुत करना होगा। कृपया ध्यान दें कि नए MIME
प्रकार का समर्थन करने के लिए आपको OMXCodec
में समान परिवर्तनों को संभालना होगा।
MediaExtractor
में, आपको MIME
video
के लिए नए परिभाषित प्रकार का उपयोग करके ट्रैक करना होगा।इन परिवर्तनों के साथ, आपका घटक चुना जाएगा और बनाया जाएगा।
हालांकि, चुनौती अभी भी बना हुआ: जहां डिक्रिप्शन प्रदर्शन करने के लिए? इसके लिए, आप पिछले अनुभाग में वर्णित वही समाधान भी नियोजित कर सकते हैं जैसे कि OMX_EmptyThisBuffer
कॉल के हिस्से के समान ही संभाल लें।
सकारात्मक: कोई नहीं है कि मैं के बारे में सोच सकते हैं ..
विपक्ष: पहले, समाधान स्केलेबल नहीं है। आपको नए MIME
प्रकारों को जोड़ना होगा और Stagefright
ढांचे को संशोधित करना होगा। इसके बाद, OMXCodec
में हुए परिवर्तनों को MediaExtractor
में संबंधित परिवर्तनों की आवश्यकता होगी। इसलिए, भले ही आपका प्रारंभिक फोकस MP4
निकालने वाला है, यदि आप अन्य कंटेनर प्रारूपों जैसे AVI
, MKV
पर समाधान का विस्तार करना चाहते हैं, तो आपको इन निकालने वालों में नए MIME
प्रकारों के लिए समर्थन शामिल करना होगा।
आखिरकार, कुछ नोट्स।
एक पसंदीदा समाधान के रूप में, मैं समाधान 1 की सिफारिश करता हूं क्योंकि यह आसान और सरल है।
मैंने कोडेक के ACodec
आधारित कार्यान्वयन पर स्पर्श नहीं किया है। हालांकि, मुझे लगता है कि समाधान 1 लागू करने के लिए एक और अधिक आसान समाधान होगा, भले ही भविष्य में ऐसा समर्थन आवश्यक हो।
यदि आप OMX
कोर संशोधित नहीं कर रहे हैं, तो आपको libstagefrighthw.so
को संशोधित करने की आवश्यकता नहीं है। बस एफवाईआई, यह आम तौर पर विक्रेताओं द्वारा उनके विक्रेता विशिष्ट मॉड्यूल के हिस्से के रूप में vendor/<xyz>/hardware/...
में लागू किया जाता है। आपको libstagefrighthw.so
के स्रोतों पर अपने प्लेटफ़ॉर्म प्रदाता से जांच करने की आवश्यकता है।
धन्यवाद गणेश, यह बहुत ही बढ़िया है। हमें समय सीमाओं के कारण अब एक कस्टम मीडिया प्लेयर को लागू करना पड़ा है, लेकिन जल्द ही आपके समाधान 1 पर वापस आ जाएगा ... धन्यवाद। – Matthew
@ मैथ्यू मैं तंग समयरेखा के साथ बिल्कुल वही आवश्यकता पर काम कर रहा हूं। डीकोडिंग से पहले फ़ाइलों को डिक्रिप्ट करना होगा। आपने इस खिलाड़ी के लिए कौन सा खिलाड़ी चुना है ?? कृपया मुझे एक सुझाव दें। धन्यवाद – CodeFury
@ श्री अंत में मैंने एंड्रॉइड को संशोधित करने के लिए अभी छोड़ दिया है। मैं इस उदाहरण पर एक कस्टम प्लेयर आधारित हूं: [सेड्रिक फंग] (https://github.com/vecio/MediaCodecDemo)। लाइन 'int sampleSize = extractor.readSampleData (बफर, 0) के बाद;' आप बफर को डिक्रिप्ट कर सकते हैं। (मैंने नमूना डेटा एन्क्रिप्ट करने और एन्क मूवी फ़ाइल बनाने के लिए एक सरल एन्क्रिप्टर बनाया है - बस बॉक्स को पार्स करने और डेटा एन्क्रिप्ट करने के बाद लंबाई को फिर से कोड करने की आवश्यकता है)। उम्मीद है की वो मदद करदे! – Matthew