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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top