FFMPEG con pérdida de memoria QT
-
25-09-2019 - |
Pregunta
Permítanme comenzar con un clip de código:
QByteArray ba;
ba.resize(500000);
int encsize = avcodec_encode_video(context, (uint8_t*)ba.data(), 500000, frame.unownedPointer());
Lo que estoy haciendo es codificar los datos de marco y poner los datos en el buffer apuntado en QByteArray. Si comento hacia fuera de la línea de avcodec_encode_video mi pérdida de memoria desaparece. unownedPointer () es el siguiente:
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;
Cuando this-> marco es un AVFrame *, y this-> img es un QImage.
A una velocidad de codificación de alrededor de 30 cuadros por segundo, estoy recibiendo una pérdida de memoria de 50 MB aproximadamente / seg. Así que no estoy seguro de lo que el problema podría ser. Parece como si avcodec_encode_video () es la copia de la memoria y nunca liberándola o algo así. Algunas ideas?
Si avcodec_encode_video es convertir mis datos RGB24 a YUV420P tendría que estar modificando los datos apuntado por frame.unownedPointer ()?
Solución
Tome un vistazo al código para QtFFmpegwrapper que utiliza un contexto guardado para hacer esto eficientemente , o puede simplemente usar el QtFFMpegwrapper directamente