2016-06-02 8 views
7

मैं H.264 स्ट्रीम में छवियों को एन्कोड करने के लिए FFMpeg की एपीआई का उपयोग करता हूं, कोड इस encode code जैसा है। जब मैंने avcodec_encode_video2 फ़ंक्शन को कॉल किया तो मुझे एक एवीपैकेट का डेटा मिला, फिर मैंने इसे फ़ाइल में सहेजा। परीक्षण के लिए कई फाइलें प्राप्त करने के लिए मैं कई छवियों का उपयोग करता हूं। स्टार्टकोड 00 00 00 01 या 00 00 01 के आधार पर, मैंने पाया कि पहली और दूसरी फाइलों के डेटा में कई H.264 NAL संकेत हैं। लेकिन तीसरी फाइल से शुरू करें, मुझे स्टार्टकोड नहीं मिला है। अनुवर्ती छवि की तरह। Pictureएफएफएमपीईजी और एच .264 एनएएल यूंट में AVPacket के बीच क्या संबंध है?

मुझे उलझन में लग रहा है। एफएफएमपीजी के कोड पर आधार मुझे लगता है कि एक एवीपैकेट के डेटा में कम से कम एक एनएएल यूंट होना चाहिए, लेकिन परिणाम अप्रत्याशित है। क्या इसका मतलब है कि एक एनएएल यूंट को दो एवीपैकेट्स डेटा में विभाजित किया जा सकता है? AVPacket और H.264 NAL Uint के बीच क्या संबंध है?

+0

क्या आप अपना कोड दिखा सकते हैं? मुझे संदेह है कि आपका एन्कोड कॉल वास्तव में एक पैकेट (got_packet_ptr == 0) या ऐसा कुछ नहीं लौटाता था। –

+0

से [एफएफएमपीईजी डॉक्सिजन] (http://ffmpeg.org/doxygen/trunk/group__lavc__encoding.html#gaa2dc9e9ea2567ebb2801a08153c7306b) 'avcodec_encode_video2' पर) * फ्रेम से इनपुट कच्चे वीडियो डेटा लेता है और अगली आउटपुट पैकेट लिखता है, अगर उपलब्ध हो, तो avpkt । आउटपुट पैकेट ** में सबसे हालिया फ्रेम ** के लिए डेटा शामिल नहीं है, क्योंकि एन्कोडर्स आंतरिक रूप से इनपुट फ्रेम को देरी और पुन: व्यवस्थित कर सकते हैं। * तो शायद यह विभाजित है। क्या आप डेटा को जोड़ सकते हैं और इसे डीकोडर को फ़ीड कर सकते हैं यह देखने के लिए कि क्या शिकायत है या नहीं? – incBrain

+0

@ रोनाल्डस। बुल्जे मैं अपने कार्यक्रम को डीबग करता हूं, 'got_output' वास्तव में हर बार सच होता है। – Ello

उत्तर

0

कुछ परीक्षणों के बाद, मैंने पाया कि यह सिर्फ मेरी बेवकूफ गलती है।
मुझे क्यूटी में QByteArray में avpkt और setRawData मिला, फिर फ़ाइल के लिए बाइटियर को सहेजें। सहेजने से पहले, मैंने avpkt को रीसेट करने के लिए av_packet_unref कहा। मैंने सोचा कि setRawData avpkt के डेटा की प्रतिलिपि बनायेगा, लेकिन वास्तव में QByteArray में केवल डेटा पॉइंटर होता है। तो एक एवीपैकेट के डेटा में कम से कम एक पूर्ण एनएएल यूंट होता है, यह सही है।

1
00 00 00 01 41..... 
........00 00 01 41 
....00 00 01 41...... 
....... 

बाद मैं परीक्षण किया है, शुरुआती के अतिरिक्त, निम्नांकित एनएएल सभी 00 00 01 के द्वारा अलग, और एनएएल प्रकार एक ही है, भी है। इसलिए प्रत्येक एवीपैकेट में कम से कम एक एनएएल शामिल होना चाहिए।

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