FFMPEG مع تسرب الذاكرة QT
-
25-09-2019 - |
سؤال
اسمحوا لي أن أبدأ بمقطع رمز:
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 مباشرة