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 ()?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top