Вопрос

Позвольте мне начать с кода клип:

QByteArray ba;
ba.resize(500000);

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

Что я делаю, кодирует данные из кадра и вкладывая данные в буфер, указанный на QbytearRay. Если я прокомментирую строку avcodec_encode_video, моя утечка памяти уходит. UnoundedPointer () выглядит так:

 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.

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

Если avcodec_encode_video - это преобразование моих данных RGB24 для YUV420P, это будет модифицировать данные, указанные на кадре.

Это было полезно?

Решение

Посмотрите на код для Qtffmpegwrapper Он использует сохраненный контекст, чтобы сделать это эффективно, или вы можете просто использовать QTFFMPEGWRAPPER напрямую напрямую

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top