FFMPEG с утечкой памяти QT - PullRequest
0 голосов
/ 17 ноября 2010

Позвольте мне начать с фрагмента кода:

QByteArray ba;
ba.resize(500000);

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

То, что я делаю, - это кодирование данных из фрейма и помещение данных в буфер, указанный на QByteArray.Если я закомментирую строку avcodec_encode_video, утечка памяти исчезнет.unownedPointer () выглядит следующим образом:

 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;

Где this-> frame - это AVFrame *, а this-> img - QImage.

При скорости кодирования около 30 кадров в секунду я получаю утечку памяти около 50 МБ / с.Поэтому я не уверен, в чем проблема.Кажется, что avcodec_encode_video () копирует память и никогда не освобождает ее или что-то еще.Есть идеи?

Если avcodec_encode_video конвертирует мои данные RGB24 в YUV420P, будет ли это модифицировать данные, на которые указывает frame.unownedPointer ()?

1 Ответ

0 голосов
/ 17 ноября 2010

Взгляните на код для QtFFmpegwrapper , который использует сохраненный контекст для эффективной работы, или вы можете просто использовать QtFFMpegwrapper напрямую

...