Frage

Lassen Sie mich mit einem Code-Clip zu starten:

QByteArray ba;
ba.resize(500000);

int encsize = avcodec_encode_video(context, (uint8_t*)ba.data(), 500000, frame.unownedPointer());

Was mache ich die Daten aus dem Rahmen wird codiert, und die Daten in den Puffer setzen zeigte auf QByteArray. Wenn ich die avcodec_encode_video Linie geht mein Gedächtnis auf Kommentar Leck entfernt. unownedPointer () sieht wie folgt aus:

 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;

Wo this-> Rahmen ist ein AVFrame * und this-> img ist ein QImage.

Bei einer Codierungsrate von etwa 30 Bildern pro Sekunde, ich bin ein Speicherleck von etwa 50 MB / s bekommen. Also ich bin nicht sicher, was könnte das Problem sein. Es scheint, als ob avcodec_encode_video () wird der Speicher kopiert und nie oder etwas zu befreien. Irgendwelche Ideen?

Wenn avcodec_encode_video ist meine RGB24 Daten zu YUV420P Umwandlung würde es die Daten, auf die durch frame.unownedPointer werden modifiziert ()?

War es hilfreich?

Lösung

Werfen Sie einen Blick auf den Code für QtFFmpegwrapper verwendet es eine gespeicherte Kontext dieses efficently zu tun , oder Sie können nur die QtFFMpegwrapper direkt verwenden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top