質問

私は、コードクリップを見てみましょう。

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->フレームがAVFrame *である

、およびthis-> IMGはQImageのです。

はおよそ30fpsの符号化率では、私は約50メガバイト/秒のメモリリークを取得しています。だから私は、問題は何ができるかわかりません。 avcodec_encode_video()はそれか何かを解放決してメモリをコピーしていないとされているかのように思えます。任意のアイデア?

avcodec_encode_videoがYUV420Pに私のRGB24のデータを変換している場合は、データを修正されるだろうが)frame.unownedPointer(で指さ?

役に立ちましたか?

解決

それはefficentlyこれを実行するために保存したコンテキストを使用して QtFFmpegwrapper のコードを見てみましょう、またはあなただけの直接QtFFMpegwrapperを使用することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top