मैं h264 संकुचित फ्रेम को डीकोड करने के लिए libstagefright का उपयोग करने का प्रयास कर रहा हूं। मेरे पास MP4 फ़ाइल नहीं है, इसके बजाय मैं फ्रेम द्वारा फ्रेम को डीकोड करना चाहता हूं। मैं a link से नमूना की खोज कर रहा हूं। यह नमूना mp4 फ़ाइल को पार्स करने के लिए ffmpeg का उपयोग करता है। और ffmpeg के avcodeccontext का उपयोग करके यह आवश्यक मेटाडेटा सेट करें और ढूंढें। अब मैं kKeyAVCC, kKeyWidth, kKeyHeight, kKeyIsSyncFrame और kKeyTime सेट करना चाहता हूं। मैं इन पैरामीटर में से प्रत्येक के बारे में स्पष्ट नहीं हूं। तो, मैं बस इतना जानना चाहता हूं कि क्या इन सभी पैरामीटर को सेट करने की आवश्यकता है? फ्रेम पैराकोडिंग द्वारा फ्रेम के लिए मेटा डेटा के लिए इन पैरामीटर का उद्देश्य क्या है और उनमें क्या सेट करना है। जब मैं केकेटाइम सेट नहीं करता हूं, तो ओडीएक्सकोड पढ़ने वाले मेडियाबफर पर दुर्घटनाग्रस्त हो जाता है। और अगर मुझे पढ़ने के ऑपरेशन पर सफलता मिलती है, तो मुझे मीडियाबफर की व्युत्पन्न रीड विधि में सेट मेटा डेटा वैल्यू नहीं मिल रही हैं। मुझे फ्रेम के वीडियो dimesiones और INFO_FORMAT_CHANGED के त्रुटि कोड मिलते हैं।libstagefright के माध्यम से एंड्रॉइड में एचडब्ल्यू डिकोडर का उपयोग करने के लिए, एमपी 4 प्लेबैक के बजाय फ्रेम बेस डिकोडिंग के लिए मेटा डेटा में केकेएएवीसीसी के लिए क्या सेट करना है?
उत्तर
जब कोई नया कोडेक बनाया जाता है, तो मेटाडाटा OMXCodec::Create
विधि के हिस्से के रूप में पार्सर से डीकोडर तक पास किया जाता है। मैं आपके कार्यान्वयन में मानता हूं कि आपने सादे वेनिला android
कार्यान्वयन में निर्दिष्ट अनुसार MetaData
प्रारूप में मेटाडेटा पास करने के लिए सावधानी बरतनी होगी।
उदाहरण के लिए, कृपया AwesomePlayer::initVideoDecoder
देखें जिसमें mVideoTrack->getFormat()
वीडियो ट्रैक के मेटाडेटा को प्राप्त करने के लिए आमंत्रित किया गया है। कृपया ध्यान दें कि यह MediaBuffer
का हिस्सा नहीं है, लेकिन एक अलग वस्तु के रूप में पारित किया गया है।
एक बार डीकोडर बनने के बाद, configureCodec
लागू किया जाता है। इस विधि में, OMXCodec
डिकोडर प्रारंभ करने के लिए विभिन्न कॉन्फ़िगरेशन पैरामीटर पढ़ता है।
kKeyAVCC
Codec 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
कहा जाता है जो एक पार्सर और डिकोडर बनाता है और बिना किसी प्रतिपादन के कमांड लाइन डिकोडिंग करता है। यह आपके लिए अपने पार्सर को प्लगइन करने के लिए एक अच्छा संदर्भ हो सकता है।
सबसे पहले आपको विस्तृत विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद। आपने बहुत अच्छी जानकारी प्रदान की है। मैं अपनी परियोजना में android.mk के माध्यम से libstagfright.so को जोड़ रहा हूँ। मुझे एंड्रॉइड स्रोत से सभी संबंधित हेडर्स शामिल करने की आवश्यकता है। मैंने कस्टममीडियासोर्स और कस्टम डिकोडर नामक दो कक्षाएं लिखी हैं। CustomMediaSource MediaSource से लिया गया है और कस्टम विधि को लागू करता है जबकि कस्टमडिकोडर में, मैं OMXCodec :: विधि बनाएं को कॉल कर रहा हूं। अब, मेरा संदेह यह है कि libstagefright सभी एंड्रॉइड उपकरणों के लिए उपयोग करने के लिए स्थिर है या नहीं। मेरा मतलब है कि यह टीआई, क्वालकॉम इत्यादि जैसे विक्रेताओं के अनुसार हो सकता है? – sam18
एक 'एपीआई' परिप्रेक्ष्य से, libstagefright लाइब्रेरी विक्रेताओं के बावजूद वही होगी। हालांकि, अगर आप कुछ प्रदर्शन संख्याओं को देख रहे हैं, तो विक्रेताओं एसओसी के लिए विशिष्ट अनुकूलन हो सकते हैं। मैं यह नहीं कह रहा हूं कि यह हमेशा मामला होगा, लेकिन संभव है। यदि आपके पास स्रोतों तक पहुंच नहीं है, तो आप अंतर करने में सक्षम नहीं हो सकते हैं। – Ganesh
अच्छा धन्यवाद। मैं एक मंच स्वतंत्र एंड्रॉइड ऐप विकसित करना चाहता हूं। इसलिए स्थिर एपीआई पसंद करना महत्वपूर्ण हो जाता है। इसलिए, जैसा कि आपने कहा था, मुझे सभी एंड्रॉइड फोन में libstagefright.so मिलेगा और इसमें एक ही एपीआई संरचनाएं होंगी और मैं मीडिया स्रोत प्राप्त कर सकता हूं और ओएमएक्सकोडेक :: विधि बनाएं के लिए व्युत्पन्न कक्षा के उदाहरण का उपयोग कर सकता हूं। । । सही? – sam18