Permettez-moi de commencer par un clip de code:FFMPEG avec mémoire QT fuite
QByteArray ba;
ba.resize(500000);
int encsize = avcodec_encode_video(context, (uint8_t*)ba.data(), 500000, frame.unownedPointer());
Ce que je fais est coder les données du cadre et de mettre les données dans le tampon pointé à QByteArray. Si je commente la ligne avcodec_encode_video, ma fuite de mémoire disparaît. unownedPointer() ressemble à ceci:
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;
Où this-> est un cadre AVFrame * et this-> img est un QImage.
À un taux de codage d'environ 30fps, j'obtiens une fuite de mémoire d'environ 50MB/sec. Donc, je ne suis pas sûr de ce que le problème pourrait être. Il semble que avcodec_encode_video() copie la mémoire et ne la libère jamais. Des idées?
Si avcodec_encode_video convertit mes données RGB24 en YUV420P, modifierait-il les données pointées par frame.unownedPointer()?
complètement inutilisable dans ma situation. Il ne supporte que la lecture/écriture dans un fichier, et cela ne répond pas à ce qui cause la fuite de mémoire. –
Après l'avoir regardé de nouveau, il semble que cela pourrait fonctionner ... Je devrais cependant éditer un peu de code pour que cela se produise. –
Désolé - ne peut pas voir ce qui ne va pas avec votre code, cela dépend de la façon dont ffmpeg gère la mémoire. Juste pensé que je voudrais souligner une alternative - vous pouvez utiliser l'exampel dans leur sur comment appeler swscale pour faire RVB-> conversion YUV, il y a aussi un échantillon de la fonction directe RGB-> YUV –