FFMPEG con perdita di memoria QT
-
25-09-2019 - |
Domanda
Vorrei iniziare con una clip codice:
QByteArray ba;
ba.resize(500000);
int encsize = avcodec_encode_video(context, (uint8_t*)ba.data(), 500000, frame.unownedPointer());
Quello che sto facendo è la codifica dei dati da telaio e mettere i dati nel buffer puntato QByteArray. Se io commento la linea avcodec_encode_video mia perdita di memoria se ne va. unownedPointer () è simile al seguente:
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;
Dove this-> telaio è un AVFrame *, e this-> img è un QImage.
Ad una velocità di codifica di circa 30 fps, sto diventando una perdita di memoria di circa 50MB / sec. Quindi io non sono sicuro di quale sia il problema potrebbe essere. Sembra come se avcodec_encode_video () sta copiando la memoria e mai liberandola o qualcosa del genere. Tutte le idee?
Se avcodec_encode_video sta convertendo i miei dati RGB24 per YUV420P vorrebbe essere modificando i dati a cui punta frame.unownedPointer ()?
Soluzione
Date un'occhiata al codice per QtFFmpegwrapper utilizza un contesto salvato per fare questo modo efficiente , oppure si può semplicemente utilizzare il QtFFMpegwrapper direttamente