2012-07-04 30 views
19

हाल ही में मुझे दो डिवाइसों के साथ काम करने का मौका मिला जो आरटीएसपी के माध्यम से एच 264 स्ट्रीम कर रहे हैं। और मैं FFmpeg लाइब्रेरी का उपयोग करके इस स्ट्रीम को डिकंप्रेस करने की कोशिश कर रहा कुछ समस्या में भाग गया हूं।एफएफएमपीजी एच 264 स्ट्रीम/फ्रेम डेटा डीकोड नहीं कर सकता

हर बार "avcodec_decode_video2" कहा जाता है - FFmpeg बस कुछ की तरह कहते हैं:

[h264 @ 00,339,220] कोई फ्रेम!

मेरे कच्चे H264 धारा मैं फ्रेम डेटा इस तरह शुरू होता है: " 88 84 21 3F F8 F8 0D ..." (जहाँ तक मैं समझता हूँ कि इस 0x65 इंगित करता है कि यह एक IDR फ्रेम है?)

एक डिवाइस के लिए अन्य फ्रेम की तरह शुरू होता है: " 9 ए 22 07 F3 4E 48 सीसी ...."

और अन्य डिवाइस के लिए - इस तरह: " 9 ए 25 सी 1 1C 45 62 39 .... "

  • क्या मुझे यहां कुछ फ्रेम डेटा याद आ रहा है?
  • क्या एफएफएमपीईजी को कुछ अतिरिक्त पैरामीटर स्थापित करने की आवश्यकता है?

मैं उम्मीद कर रहा था कम से कम "" फ्रेम डेटा के लिए शुरू में बाइट्स ... लेकिन यह मैं क्या मिल गया है है ..

उत्तर

21

ठीक है, चीजों को बनाने में कामयाब काम कर रहे।

  • मैं अनुक्रम (एसपीएस) और चित्र पैरामीटर शामिल करने के लिए की जरूरत FFmpeg को फ्रेम भेजने से पहले मेरी फ्रेम डेटा के लिए सेट (पीपीएस)।
  • मुझे एसपीएस और पीपीएस डेटा के बाद 4 अतिरिक्त बाइट्स "00 00 00 01" जोड़ने की आवश्यकता थी।

यह एक छोटा सा दिखा रहा क्या मतलब तस्वीर है: enter image description here

बाइट "65 88 ..." जहाँ मेरे मूल फ्रेम डेटा शुरू होता है।

यह एसपीएस और पीपीएस जानकारी आरटीपी पैकेट में शामिल नहीं थी। मैं RTSP स्ट्रीमिंग के लिए Live555 लाइब्रेरी का उपयोग कर रहा हूं, इसलिए मैंने सब्सक्रिप्शन का उपयोग किया है "fmtp_spropparametersets" मुझे जो चाहिए उसे प्राप्त करने के लिए फ़ंक्शन। यह जानकारी बेस 64 एन्कोडेड थी। (नमूना: इस तरह कुछ "Z0KAKNoC0EkQ, aM48gA ==") ध्यान दें कि दो "पैरामीटर" एसपीएस और पीपीएस "," से अलग हैं और उन पैरामीटर में "00 00 00 01" शामिल नहीं है, इसलिए आप उन्हें जोड़ने की जरूरत है।

कुछ कोड नमूने (मैं क्यूटी यहाँ पुस्तकालय का उपयोग कर रहा):

QByteArray ba = QByteArray(4, 0); // Prepare the "00 00 00 01" 
      ba[3] = 0x01; 

mpTrackVideo->buffer.insert(0, mExtraData); 
mpTrackVideo->buffer.insert(mExtraData.size(), ba); 

वर्ष पहले मैंने सोचा कि मैं H264 धारा समर्थन प्राप्त था:

QByteArray  ba   = pSubSession->fmtp_spropparametersets(); 
QList<QByteArray> recordsList = ba.split(','); 

for (int i = 0; i < recordsList.size(); i++) 
{ 
    mExtraData.append(char(0x00)); 
    mExtraData.append(char(0x00)); 
    mExtraData.append(char(0x00)); 
    mExtraData.append(char(0x01)); 

    mExtraData += QByteArray::fromBase64(recordsList.at(i)); 
} 

अब हर फ्रेम के लिए मैं कुछ इस तरह करते हैं मेरे प्रोजेक्ट में एकीकृत होने तक मुझे कुछ अन्य उपकरणों के साथ परीक्षण करने का मौका मिला है ... तो आपको यह ध्यान रखना होगा कि कुछ डिवाइस प्रत्येक फ्रेम के लिए एसपीएस और पीपीएस डेटा भेज सकते हैं ... और कुछ शायद नहीं!