0

コード クリップから始めましょう。

QByteArray ba;
ba.resize(500000);

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

私がやっていることは、フレームからのデータをエンコードし、データを QByteArray が指すバッファーに入れることです。avcodec_encode_video 行をコメント アウトすると、メモリ リークがなくなります。unownedPointer() は次のようになります。

 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;

this->frame は AVFrame * で、this->img は QImage です。

約 30fps のエンコード レートで、約 50MB/秒のメモリ リークが発生しています。したがって、何が問題なのかわかりません。avcodec_encode_video() がメモリをコピーしていて、メモリを解放していないようです。何か案は?

avcodec_encode_video が RGB24 データを YUV420P に変換している場合、frame.unownedPointer() が指すデータを変更しているのでしょうか?

4

1 に答える 1

0

保存されたコンテキストを使用してこれを効率的に行うQtFFmpegwrapperのコードを見てください。または、QtFFMpegwrapperを直接使用することもできます。

于 2010-11-17T05:08:01.663 に答える