代码之家  ›  专栏  ›  技术社区  ›  Timothy Baldridge

带qt内存泄漏的ffmpeg

  •  0
  • Timothy Baldridge  · 技术社区  · 14 年前

    让我从一个代码片段开始:

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

    我要做的是对帧中的数据进行编码,并将数据放入指向qbytearray的缓冲区中。如果我对avcodec编码视频线发表评论,我的内存泄漏就会消失。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;
    

    其中,此->帧是avframe*,而此->img是qImage。

    以大约30fps的编码速率,我得到了大约50MB/秒的内存泄漏。所以我不知道问题可能是什么。似乎avcodec_encode_video()正在复制内存,但从未释放内存或其他内容。有什么主意吗?

    如果avcodec_encode_video正在将我的rgb24数据转换为yuv420p,它会修改frame.unownedpointer()指向的数据吗?

    1 回复  |  直到 14 年前
        1
  •  0
  •   Martin Beckett    14 年前

    看看代码 QtFFmpegwrapper 它使用保存的上下文来有效地执行此操作,或者您可以直接使用qtfmpegwrapper