سؤال

اسمحوا لي أن أبدأ بمقطع رمز:

QByteArray ba;
ba.resize(500000);

int encsize = avcodec_encode_video(context, (uint8_t*)ba.data(), 500000, frame.unownedPointer());

ما أقوم به هو ترميز البيانات من الإطار ووضع البيانات في المخزن المؤقت المشار إليه في QbyTearray. إذا قمت بتعليق خط AVCODEC_ENCODE_VIDEO ، فإن تسرب الذاكرة الخاص بي يختفي. لا يبدو أن unaledPointer () هكذا:

 if (this->frame != NULL) return this->frame;
    this->frame =  avcodec_alloc_frame();
    uchar *data = this->img.bits();
    frame->data[0] = (uint8_t *)data;
    frame->data[1] = (uint8_t *)data + 1;
    frame->data[2] = (uint8_t *)data + 2;
    frame->linesize[0] = width * lineSize(this->fmt);
    frame->linesize[1] = width * lineSize(this->fmt);
    frame->linesize[2] = width * lineSize(this->fmt);
    return this->frame;

حيث يكون هذا الإطار هو AVFRAME *، وهذا-> IMG هو Qimage.

بمعدل تشفير يبلغ حوالي 30 إطارًا في الثانية ، أحصل على تسرب ذاكرة يبلغ حوالي 50 ميجابايت/ثانية. لذلك لست متأكدًا مما يمكن أن تكون عليه المشكلة. يبدو كما لو أن AVCODEC_ENCODE_VIDEO () تقوم بنسخ الذاكرة ولا تحررها أبدًا أو شيء من هذا القبيل. أيه أفكار؟

إذا قام AVCODEC_ENCODE_VIDEO بتحويل بيانات RGB24 الخاصة بي إلى YUV420P ، فهل من الممكن تعديل البيانات التي يتم توجيهها إلى Frame.unownedPointer ()؟

هل كانت مفيدة؟

المحلول

ألقِ نظرة على الكود qtffmpegwrapper يستخدم سياقًا محفوظًا للقيام بذلك بشكل فعال ، أو يمكنك فقط استخدام QTFFMPegWrapper مباشرة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top