2012-02-16 9 views
5

मैं H264 पैकेट को डीकोड करने के लिए संघर्ष कर रहे FFmpeg के लिए नया हूं जिसे uint8_t की सरणी के रूप में प्राप्त किया जा सकता है।FFmpeg का उपयोग करके, H264 पैकेट को डीकोड करने के लिए कैसे करें

जांच के कई के बाद, मुझे लगता है कि यह सिर्फ avcodec_decode_video2 से नीचे

AVPacket *avpkt = (AVPacket *)malloc(sizeof(AVPacket) * 1); 
av_init_packet(avpkt); 
avpkt->data = ct; // ct is the array 
avpkt->length =.... 

और डिकोड की तरह एक AVPacket में सरणी डाल करने के लिए सक्षम होना चाहिए()। कोड का एक हिस्सा

... 
codec = avcodec_find_decoder(CODEC_ID_H264); 
gVideoCodecCtx = avcodec_alloc_context(); 
gFrame = avcodec_alloc_frame(); 
avcodec_decode_video2(gVideoCodecCtx, gFrame, &frameFinished, packet); 
... 

की तरह है मुझे लगता है मैं सभी आवश्यक गुण ठीक से सेट, लेकिन इस समारोह केवल -1 :(

मैं सिर्फ पाया -1 लौटने से

सेवानिवृत्त आ रहा है = avctx-> codec-> डिकोड (avctx, चित्र, got_picture_ptr, avpkt);

avcodec_decode_video2 में

();

वास्तव में, अगर मैं एच डिकोड कर सकते हैं कि मैं क्या सोच रहा हूँ है Avcodec_decode_video2() द्वारा 264 पैकेट (आरटीपी हेडर के बिना)।

अग्रिम सहायता के लिए धन्यवाद।


/////////// जोड़ा

ठीक है, मैं अभी भी एक समाधान खोजने के लिए कोशिश कर रहा हूँ। क्या मैं अब कर रहा हूँ है नीचे

** इस आरटीपी धारा में H264 धारा के द्वारा इनकोडिंग FU-ए

  1. एक RTP पैकेट

  2. देखो अगर की दूसरी बाइट प्राप्त आरटीपी हेडर> 0 है जिसका मतलब है कि यह पहला पैकेट है (और संभवतः इसका पालन किया जाएगा)

  3. देखें कि अगला आरटीपी पैकेट इसके दूसरे बाइट पर> 0 है, तो इसका मतलब है कि पिछला फ्रेम एक पूर्ण एनएएल था या अगर यह < 0 है, तो पैकेट को पिछले पैकेट में जोड़ा जाना चाहिए।

  4. पैकेट के सभी आरटीपी हेडर को हटा दें ताकि यह केवल एफयू सूचक की तरह हो। एफयू हेडर | एनएएल

  5. कोशिश avcodec_decode_video2()

साथ इसे खेलने लेकिन यह केवल -1 लौटा रहा है ..... मैं FU सूचक को हटाने और भी शीर्षक करना चाहिए ??

किसी भी सुझाव की बहुत सराहना की जाएगी

अग्रिम धन्यवाद।

उत्तर

1

मुझे नहीं लगता कि आप आरटीपी हेडर के बिना H264 पैकेट को डीकोड करने में सक्षम होंगे क्योंकि आरटीपी हेडर में वीडियो स्ट्रीम की जानकारी बहुत अधिक है। साथ ही, मुझे लगता है कि यह संभव है कि सभी वीडियो स्ट्रीम जानकारी आरटीपी वीडियो पैकेट में डुप्लिकेट की जा सके। तो यह भी निर्भर करता है कि धारा कैसे उत्पन्न होती है।

Vibgyor

+0

धन्यवाद Vibgyor है वास्तव में इस spydroid खुला स्रोत है और उसके आरटीपी हैडर बहुत सी बातें शामिल नहीं लगती है .. यह पेलोड प्रकार, क्रम संख्या, टाइमस्टैम्प का बना है, सिंक स्रोत पहचानकर्ता .. उनमें से किसी का मतलब वीडियो स्ट्रीम जानकारी है ?? मुझे ऐसा नहीं लगता .. मैं अभी भी इस पर काम कर रहा हूं और मेरी प्रगति को अपडेट करूंगा। – Jun

5

वास्तव में, अगर मैं H264 पैकेट (आरटीपी हेडर के बिना) avcodec_decode_video2 द्वारा डिकोड कर सकते हैं कि मैं क्या सोच रहा हूँ है()।

आप की आवश्यकता हो सकती पूर्व प्रक्रिया आरटीपी पेलोड (रों) (फिर से इकट्ठा खंडित Nalus, विभाजन के लिए एकत्रित Nalus) विकोडक के लिए एनएएल इकाइयों गुजर अगर आप एक एनएएल इकाई मोड के अलावा अन्य packetization मोड का उपयोग करने से पहले। धारा में अनुमत एनएएल इकाई प्रकार (एसटीएपी, एमटीएपी, एफयू) पैकेटिज़ेशन मोड पर निर्भर करता है। पैकेटेशन मोड पर अधिक जानकारी के लिए RFC 6184 पढ़ें।

दूसरा, जबकि मैं एफएफएमपीईजी से परिचित नहीं हूं, यह सामान्य एच .264 डिकोडिंग समस्या से अधिक हो सकता है: आपको हमेशा एच .264 अनुक्रम (एसपीएस) और चित्र पैरामीटर सेट (पीपीएस) के साथ डिकोडर प्रारंभ करना होगा। इससे पहले कि आप अन्य फ्रेम डीकोड करने में सक्षम होंगे। आपने उसे किया है?

+0

धन्यवाद राल्फ, यह पता चला है कि spydroid एकल नाल मोड और fu-1 मोड में rtp pakcets भेजता है, इसलिए मुझे लगता है कि मुझे fu-1 केस के लिए हेडर के साथ आरटीपी के रूप में पैकेट को संभालने की आवश्यकता है, लेकिन मुझे पता नहीं है कि ffmpeg लाइब्रेरी का उपयोग करके आरटीपी को कैसे डीकोड करना है । मुझे लगता है कि आरटीपी स्तर के साथ कोई काम नहीं कर रहा है और यही कारण है कि मैं इस काम को H264 के साथ शुरू कर रहा हूं :(.. क्या मुझे इस पर कोई सलाह मिल सकती है? – Jun

+0

अगर एफएमपीपीजी आरटीपी परत पर काम नहीं करता है तो आपको या तो एफएफएमपीईजी (यह बुरा नहीं है) या किसी अन्य तृतीय पक्ष लाइब्रेरी का उपयोग करने से पहले स्वयं को कोड लिखें। लाइव 555 (www.live555.com) एक ओपन सोर्स एलजीपीएल लाइब्रेरी होगी जो आरटीपी को एच 264 पेलोड विशिष्ट पैकेटिज़ेशन सहित अन्य चीजों के साथ संभालती है – Ralf

+0

@ राल्फ मेरा मानना ​​है कि सिंगल एनएएल यूनिट पैकेट मोड आरएफसी 6184 का भी हिस्सा है, आरएफसी के लिए सेक्शन 5.6 देखें। मुझे यकीन नहीं है कि आप क्यों कह रहे हैं कि इसे आरटीपी हेडर की आवश्यकता नहीं है। कृपया मुझे सही करें अगर मैं गलत है। –

0

यह, मेरे कार्य कोड

bool VideoDecoder::decode(const QByteArray &encoded) 
{ 
    AVPacket packet; 
    av_new_packet(&packet, encoded.size()); 
    memcpy(packet.data, encoded.data(), encoded.size()); 
    //TODO: use AVPacket directly instead of Packet? 
    //TODO: some decoders might in addition need other fields like flags&AV_PKT_FLAG_KEY 

    int ret = avcodec_decode_video2(d->codec_ctx, d->frame, &d->got_frame_ptr, &packet); 
    av_free_packet(&packet); 

    if ((ret < 0) || (!d->got_frame_ptr)) 
     return false; 

    d->sws_ctx = sws_getCachedContext(d->sws_ctx 
     , d->codec_ctx->width, d->codec_ctx->height, d->codec_ctx->pix_fmt 
     , d->width, d->height, d->pix_fmt 
     , (d->width == d->codec_ctx->width && d->height == d->codec_ctx->height) ? SWS_POINT : SWS_BICUBIC 
     , NULL, NULL, NULL 
     ); 

    int v_scale_result = sws_scale(
     d->sws_ctx, 
     d->frame->data, 
     d->frame->linesize, 
     0, 
     d->codec_ctx->height, 
     d->picture.data, 
     d->picture.linesize 
     ); 
    Q_UNUSED(v_scale_result); 

    if (d->frame->interlaced_frame) 
     avpicture_deinterlace(&d->picture, &d->picture, d->pix_fmt, d->width, d->height); 
    return true; 
} 
संबंधित मुद्दे

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