2013-02-15 48 views
5

मैं h264 संकुचित फ्रेम को डीकोड करने के लिए libstagefright का उपयोग करने का प्रयास कर रहा हूं। मेरे पास MP4 फ़ाइल नहीं है, इसके बजाय मैं फ्रेम द्वारा फ्रेम को डीकोड करना चाहता हूं। मैं a link से नमूना की खोज कर रहा हूं। यह नमूना mp4 फ़ाइल को पार्स करने के लिए ffmpeg का उपयोग करता है। और ffmpeg के avcodeccontext का उपयोग करके यह आवश्यक मेटाडेटा सेट करें और ढूंढें। अब मैं kKeyAVCC, kKeyWidth, kKeyHeight, kKeyIsSyncFrame और kKeyTime सेट करना चाहता हूं। मैं इन पैरामीटर में से प्रत्येक के बारे में स्पष्ट नहीं हूं। तो, मैं बस इतना जानना चाहता हूं कि क्या इन सभी पैरामीटर को सेट करने की आवश्यकता है? फ्रेम पैराकोडिंग द्वारा फ्रेम के लिए मेटा डेटा के लिए इन पैरामीटर का उद्देश्य क्या है और उनमें क्या सेट करना है। जब मैं केकेटाइम सेट नहीं करता हूं, तो ओडीएक्सकोड पढ़ने वाले मेडियाबफर पर दुर्घटनाग्रस्त हो जाता है। और अगर मुझे पढ़ने के ऑपरेशन पर सफलता मिलती है, तो मुझे मीडियाबफर की व्युत्पन्न रीड विधि में सेट मेटा डेटा वैल्यू नहीं मिल रही हैं। मुझे फ्रेम के वीडियो dimesiones और INFO_FORMAT_CHANGED के त्रुटि कोड मिलते हैं।libstagefright के माध्यम से एंड्रॉइड में एचडब्ल्यू डिकोडर का उपयोग करने के लिए, एमपी 4 प्लेबैक के बजाय फ्रेम बेस डिकोडिंग के लिए मेटा डेटा में केकेएएवीसीसी के लिए क्या सेट करना है?

उत्तर

9

जब कोई नया कोडेक बनाया जाता है, तो मेटाडाटा OMXCodec::Create विधि के हिस्से के रूप में पार्सर से डीकोडर तक पास किया जाता है। मैं आपके कार्यान्वयन में मानता हूं कि आपने सादे वेनिला android कार्यान्वयन में निर्दिष्ट अनुसार MetaData प्रारूप में मेटाडेटा पास करने के लिए सावधानी बरतनी होगी।

उदाहरण के लिए, कृपया AwesomePlayer::initVideoDecoder देखें जिसमें mVideoTrack->getFormat() वीडियो ट्रैक के मेटाडेटा को प्राप्त करने के लिए आमंत्रित किया गया है। कृपया ध्यान दें कि यह MediaBuffer का हिस्सा नहीं है, लेकिन एक अलग वस्तु के रूप में पारित किया गया है।

एक बार डीकोडर बनने के बाद, configureCodec लागू किया जाता है। इस विधि में, OMXCodec डिकोडर प्रारंभ करने के लिए विभिन्न कॉन्फ़िगरेशन पैरामीटर पढ़ता है।

kKeyAVCCCodec Specific Data या csd जो अनिवार्य रूप से SPS और अंतर्निहित H.264 धारा के PPS है से मेल खाती है।

kKeyWidth और kKeyHeight वीडियो फ्रेम के width और height से मेल खाता है। डिकोडर को प्रारंभ करने के लिए, आप कुछ और अतिरिक्त पैरामीटर सेट कर सकते हैं। उदाहरण के लिए, यदि आप डिकोडर के आउटपुट के लिए एक विशिष्ट colorFormat सेट करना चाहते हैं, तो आप इसे kKeyColorFormat के माध्यम से सेट कर सकते हैं।

एक बार डीकोडर बनने के बाद, आपको मानक openmax इंटरफेस के माध्यम से व्यक्तिगत फ्रेम पारित करना होगा। डिकोडर OMXCodec::read विधि के आविष्कार के साथ शुरू किया गया है जो इनपुट और आउटपुट बफर भरने में बाढ़ आएगा।

इनपुट बफर OMXCodec::drainInputBuffer विधि से भरा हुआ है जो पार्सर मॉड्यूल से MediaBuffer पढ़ता है (जो आपके मामले में आपका विशिष्ट मॉड्यूल है)। MediaBuffer की सामग्री को OMX घटक के input port पर बफर किए गए बफर पर कॉपी किया गया है। इस डेटा के साथ, इस बफर के timestamp भी पास किए गए हैं। टाइमस्टैम्प जानकारी kKeyTime पैरामीटर के माध्यम से पढ़ी जाती है जिसे MediaBuffer के साथ पास किया जाता है।

इसलिए, MediaBuffer में पारित प्रत्येक फ्रेम के लिए, आपको यह सुनिश्चित करने की आवश्यकता है कि वैध timestamp भी अंतर्निहित डिकोडर को पास किया गया है जो डीकोडर के आउटपुट पोर्ट पर दिखाई देता है।

आपके प्रश्न में, आपने kKeyIsSyncFrame पर पूछताछ की थी। यह ध्वज Encoder द्वारा FillBufferDone कॉलबैक के हिस्से के रूप में सेट किया गया है यानी।जब एक एन्कोडर IDR frame जैसे एक महत्वपूर्ण फ्रेम को एन्कोड करता है, तो यह एन्कोडर के आउटपुट पोर्ट पर कॉलबैक के हिस्से के रूप में इस विशिष्ट ध्वज के माध्यम से इस जानकारी को संचारित करता है। डिकोडिंग के लिए, यह प्रासंगिक नहीं है।

यदि आप OMXCodec लॉग सक्षम के साथ कुछ और लॉग पोस्ट कर सकते हैं, तो अधिक सटीक उत्तर प्रदान करना आसान हो सकता है।

पीएस एंड्रॉइड फ्रेमवर्क में, एक कमांड लाइन उपयोगिता है जिसे Stagefright कहा जाता है जो एक पार्सर और डिकोडर बनाता है और बिना किसी प्रतिपादन के कमांड लाइन डिकोडिंग करता है। यह आपके लिए अपने पार्सर को प्लगइन करने के लिए एक अच्छा संदर्भ हो सकता है।

+0

सबसे पहले आपको विस्तृत विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद। आपने बहुत अच्छी जानकारी प्रदान की है। मैं अपनी परियोजना में android.mk के माध्यम से libstagfright.so को जोड़ रहा हूँ। मुझे एंड्रॉइड स्रोत से सभी संबंधित हेडर्स शामिल करने की आवश्यकता है। मैंने कस्टममीडियासोर्स और कस्टम डिकोडर नामक दो कक्षाएं लिखी हैं। CustomMediaSource MediaSource से लिया गया है और कस्टम विधि को लागू करता है जबकि कस्टमडिकोडर में, मैं OMXCodec :: विधि बनाएं को कॉल कर रहा हूं। अब, मेरा संदेह यह है कि libstagefright सभी एंड्रॉइड उपकरणों के लिए उपयोग करने के लिए स्थिर है या नहीं। मेरा मतलब है कि यह टीआई, क्वालकॉम इत्यादि जैसे विक्रेताओं के अनुसार हो सकता है? – sam18

+0

एक 'एपीआई' परिप्रेक्ष्य से, libstagefright लाइब्रेरी विक्रेताओं के बावजूद वही होगी। हालांकि, अगर आप कुछ प्रदर्शन संख्याओं को देख रहे हैं, तो विक्रेताओं एसओसी के लिए विशिष्ट अनुकूलन हो सकते हैं। मैं यह नहीं कह रहा हूं कि यह हमेशा मामला होगा, लेकिन संभव है। यदि आपके पास स्रोतों तक पहुंच नहीं है, तो आप अंतर करने में सक्षम नहीं हो सकते हैं। – Ganesh

+0

अच्छा धन्यवाद। मैं एक मंच स्वतंत्र एंड्रॉइड ऐप विकसित करना चाहता हूं। इसलिए स्थिर एपीआई पसंद करना महत्वपूर्ण हो जाता है। इसलिए, जैसा कि आपने कहा था, मुझे सभी एंड्रॉइड फोन में libstagefright.so मिलेगा और इसमें एक ही एपीआई संरचनाएं होंगी और मैं मीडिया स्रोत प्राप्त कर सकता हूं और ओएमएक्सकोडेक :: विधि बनाएं के लिए व्युत्पन्न कक्षा के उदाहरण का उपयोग कर सकता हूं। । । सही? – sam18