2013-04-16 10 views
5

मुझे एक कस्टम 'रैपर' वीडियो कोडेक विकसित करने और इसे एंड्रॉइड (अब के लिए जेबी, बाद में आईसीएस) में एकीकृत करने की आवश्यकता है। हम सिम से कुछ कस्टम डिक्रिप्शन कुंजी का उपयोग करना चाहते हैं (पूछो मत!)। सबसे अच्छी विधि (जो इसे अन्य गैर-एन्क्रिप्टेड मीडिया के साथ काम करने और मानक मीडिया प्लेयर या अन्य का उपयोग करने की अनुमति देगी) ऐसा लगता है कि हमारे अपने माइम-प्रकार को परिभाषित करना है, और एक कस्टम रैपर कोडेक से लिंक करना जो कस्टम कर सकता है डिक्रिप्शन, और उसके बाद डेटा को एक वास्तविक कोडेक पर पास करें। (मान लीजिए कि फ़ाइल टाइप .mp4 है।)एंड्रॉइड में कस्टम रैपर कोडेक एकीकरण

(एक विकल्प हमारे स्वयं के मीडिया प्लेयर को लिखना हो सकता है, लेकिन हम उस मार्ग को नीचे नहीं जाना चाहते हैं क्योंकि हम वास्तव में मीडिया को अन्य मीडिया के साथ सहजता से दिखाना चाहते हैं)

मैं इस गाइड का पालन करने की कोशिश कर रहा है: how to integrate a decoder into multimedia framework

  1. मैं OMX कोर पंजीकरण में समस्या हो रही - make stagefright लिखकर लेकिन गाइड में मैं एंड्रॉयड स्रोत से libstagefright.so निर्माण कर सकते हैं वहका उपयोग करने के लिए कहते हैंजो जेबी के लिए उपयुक्त लगता है, लेकिन मुझे यकीन नहीं है कि इसे कैसे बनाया जाए, ऐसा लगता है कि यह make stagefright का उपयोग करने से नहीं बनाया गया है जब तक कि मैं कुछ गलत नहीं कर रहा हूं?

  2. दूसरी समस्या यह है कि अगर मुझे कस्टम रैपर कोडेक पंजीकृत हो जाता है, तो भी मुझे यकीन नहीं है कि डेटा को वास्तविक कोडेक में कैसे पास किया जाए।

किसी को कोई सुझाव है (या दर-चरण निर्देश कुछ बच्चे कदम दे सकते हैं), तो मैं सच में इसकी सराहना करता हूँ - समय सीमा अवधारणा के सबूत के लिए काफी तंग है और मैं कोडेक या के बारे में बहुत कम जानते हैं मीडिया ढांचे ...

बहुत धन्यवाद। (ps मैं DRM और एनालॉग छेद आदि के बारे में कीचड़ लड़ाई में प्राप्त करने के लिए नहीं करना चाहते हैं .., धन्यवाद)

उत्तर

9

इस पोस्ट में, मैं एक उदाहरण के रूप 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 के रूप में चुनने के लिए विकल्प का निरीक्षण कर सकते हैं।

चरणों का अनुसरण करें:

  1. अपने मंच में, जैसे OMX.H264.DECODER.decrypt या कुछ इसी तरह के कुछ नए विस्तार के साथ एक और घटक रजिस्टर। परिवर्तन केवल media_codecs.xml में आवश्यक है। नई फैक्ट्री विधि पंजीकृत करने या सामान्य फैक्ट्री विधि रखने का विकल्प आपकी पसंद है।

  2. अपने पार्सर से, जब आप विशिष्ट उपयोग-मामले का सामना करते हैं, तो kKeyDecryptionRequired जैसे नए ध्वज को सेट करें। इसके लिए आपको में एक नया झंडा परिभाषित करना होगा और OMXCodec.h में एक संबंधित क्विर्क परिभाषित करना होगा।

  3. ऊपर दिखाए गए .secure प्रत्यय के समान .decrypt प्रत्यय को जोड़ने के लिए OMXCodec::create विधि को संशोधित करने के लिए OMXCodec::create विधि संशोधित करें।

  4. OMXCodec, Metadata, MediaExtractor मॉड्यूल में सभी परिवर्तनों के साथ

    , आप केवल libstagefright.so के पुनर्निर्माण और अपने मंच पर एक ही बदलने के लिए होगा।

वोला !! आपका एकीकरण पूरा होना चाहिए। अब घटक के अंदर मुख्य चुनौती आता है। घटक कार्यान्वयन के हिस्से के रूप में, आप एक साधारण घटक निर्माण और .decrypt घटक निर्माण के बीच अंतर करने में सक्षम होना चाहिए।

एक क्रम दृष्टिकोण से, यह सोचते हैं कि अपने घटक तथ्य यह है कि यह एक .decrypt घटक है या नहीं के बारे में पता है, तो आप OMX_EmptyThisBuffer कॉल, आप डेटा जहां डिक्रिप्ट और फिर इसे करने के लिए दे सकते हैं के हिस्से के रूप decryption संभाल सकता अंतर्निहित कोडेक।

पेशेवर: एकीकृत करने में आसान, एंड्रॉइड फ्रेमवर्क में न्यूनतम परिवर्तन, अन्य कोडेक्स के लिए स्केलेबल, कोई नया MIME टाइप पंजीकरण आवश्यक है।

विपक्ष: आपको विशेष रूप से नए quirks, झंडे और .decrypt एक्सटेंशन की पसंद पर एंड्रॉइड के भविष्य के संशोधन को ट्रैक करने की आवश्यकता है। यदि Google कुछ समान नियोजित करने का निर्णय लेता है, तो आपको तदनुसार अपने समाधान को अनुकूलित/संशोधित करना होगा।

समाधान 2: नई MIME प्रकार

का पंजीकरण अपने प्रश्न से, यह स्पष्ट नहीं है कि आप या नहीं MIME प्रकार को परिभाषित करने में सक्षम थे और इसलिए, मैं स्पष्टता के लिए चरणों का कब्जा रहा हूँ।

चरणों का अनुसरण करें:

  1. MediaDefs में एक नया MIME प्रकार रजिस्टर दिखाया गया है here। उदाहरण के लिए, आप एक नया MIME प्रकार const char *MEDIA_MIMETYPE_VIDEO_AVC_ENCRYPT = "video/avc-encrypt";

  2. रूप media_codecs.xml में इस अद्यतन MIME प्रकार के साथ अपने नए घटक रजिस्टर रोजगार सकता है। कृपया ध्यान दें कि आपको यह सुनिश्चित करना होगा कि तदनुसार घटक क्विर्क भी संभाले जाएंगे।

  3. OMXCodec::setVideoOutputFormat विधि कार्यान्वयन में, आप के रूप में H.264here के लिए दिखाया अपना नया MIME प्रकार से निपटने के लिए समर्थन प्रस्तुत करना होगा। कृपया ध्यान दें कि नए MIME प्रकार का समर्थन करने के लिए आपको OMXCodec में समान परिवर्तनों को संभालना होगा।

  4. MediaExtractor में, आपको MIMEvideo के लिए नए परिभाषित प्रकार का उपयोग करके ट्रैक करना होगा।इन परिवर्तनों के साथ, आपका घटक चुना जाएगा और बनाया जाएगा।

हालांकि, चुनौती अभी भी बना हुआ: जहां डिक्रिप्शन प्रदर्शन करने के लिए? इसके लिए, आप पिछले अनुभाग में वर्णित वही समाधान भी नियोजित कर सकते हैं जैसे कि OMX_EmptyThisBuffer कॉल के हिस्से के समान ही संभाल लें।

सकारात्मक: कोई नहीं है कि मैं के बारे में सोच सकते हैं ..

विपक्ष: पहले, समाधान स्केलेबल नहीं है। आपको नए MIME प्रकारों को जोड़ना होगा और Stagefright ढांचे को संशोधित करना होगा। इसके बाद, OMXCodec में हुए परिवर्तनों को MediaExtractor में संबंधित परिवर्तनों की आवश्यकता होगी। इसलिए, भले ही आपका प्रारंभिक फोकस MP4 निकालने वाला है, यदि आप अन्य कंटेनर प्रारूपों जैसे AVI, MKV पर समाधान का विस्तार करना चाहते हैं, तो आपको इन निकालने वालों में नए MIME प्रकारों के लिए समर्थन शामिल करना होगा।

आखिरकार, कुछ नोट्स।

  1. एक पसंदीदा समाधान के रूप में, मैं समाधान 1 की सिफारिश करता हूं क्योंकि यह आसान और सरल है।

  2. मैंने कोडेक के ACodec आधारित कार्यान्वयन पर स्पर्श नहीं किया है। हालांकि, मुझे लगता है कि समाधान 1 लागू करने के लिए एक और अधिक आसान समाधान होगा, भले ही भविष्य में ऐसा समर्थन आवश्यक हो।

  3. यदि आप OMX कोर संशोधित नहीं कर रहे हैं, तो आपको libstagefrighthw.so को संशोधित करने की आवश्यकता नहीं है। बस एफवाईआई, यह आम तौर पर विक्रेताओं द्वारा उनके विक्रेता विशिष्ट मॉड्यूल के हिस्से के रूप में vendor/<xyz>/hardware/... में लागू किया जाता है। आपको libstagefrighthw.so के स्रोतों पर अपने प्लेटफ़ॉर्म प्रदाता से जांच करने की आवश्यकता है।

+1

धन्यवाद गणेश, यह बहुत ही बढ़िया है। हमें समय सीमाओं के कारण अब एक कस्टम मीडिया प्लेयर को लागू करना पड़ा है, लेकिन जल्द ही आपके समाधान 1 पर वापस आ जाएगा ... धन्यवाद। – Matthew

+0

@ मैथ्यू मैं तंग समयरेखा के साथ बिल्कुल वही आवश्यकता पर काम कर रहा हूं। डीकोडिंग से पहले फ़ाइलों को डिक्रिप्ट करना होगा। आपने इस खिलाड़ी के लिए कौन सा खिलाड़ी चुना है ?? कृपया मुझे एक सुझाव दें। धन्यवाद – CodeFury

+1

@ श्री अंत में मैंने एंड्रॉइड को संशोधित करने के लिए अभी छोड़ दिया है। मैं इस उदाहरण पर एक कस्टम प्लेयर आधारित हूं: [सेड्रिक फंग] (https://github.com/vecio/MediaCodecDemo)। लाइन 'int sampleSize = extractor.readSampleData (बफर, 0) के बाद;' आप बफर को डिक्रिप्ट कर सकते हैं। (मैंने नमूना डेटा एन्क्रिप्ट करने और एन्क मूवी फ़ाइल बनाने के लिए एक सरल एन्क्रिप्टर बनाया है - बस बॉक्स को पार्स करने और डेटा एन्क्रिप्ट करने के बाद लंबाई को फिर से कोड करने की आवश्यकता है)। उम्मीद है की वो मदद करदे! – Matthew

संबंधित मुद्दे