c++ - ffmpeg内存增加

标签 c++ qt memory ffmpeg ram

好吧,我正在使用 ffmpeg,当我执行它时,它会运行一个视频示例,嗯,内存开始增加,一个简单的小视频需要 800MB 的 RAM,而 Windows Media Player 只需要 50MB 来运行该文件,我不知道发生了什么,这是循环,问题来自这里(我认为......)

while(av_read_frame(formatContext,&framepacket)>= 0){
    pausecontrol.lock();


    if(framepacket.stream_index==gotVideoCodec){
        int framereaded;

        avcodec_decode_video2(videoCodecContext,videoFrame,&framereaded,&framepacket);

        if(framereaded){

            struct SwsContext *ctx = sws_getContext(videoCodecContext->width, videoCodecContext->height, videoCodecContext->pix_fmt, showinWidget->width(),
            showinWidget->height(), PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL);
            sws_scale(ctx,videoFrame->data,videoFrame->linesize,0,videoCodecContext->height,videoFrame->data,videoFrame->linesize);
            memset(&framecapsule,0,sizeof(QImage));
            framecapsule=QImage(showinWidget->width(),showinWidget->height(),QImage::Format_RGB888);
            for(int y=0;y<showinWidget->height();y++){
                memcpy(framecapsule.scanLine(y),videoFrame->data[0]+y*videoFrame->linesize[0],showinWidget->width()*3);
            }
            emit newFrameReady();
        }
    }
    if(framepacket.stream_index==gotAudioCodec){
        // Audio? Ok
    }
    pausecontrol.unlock();
    av_free_packet(&framepacket);
}

哦,我也在使用 QT,但是 AVFrame-QImage 之间的转换不是问题。

最佳答案

您必须创建 SwsContext一次,而不是循环创建它。最后,您必须通过调用 sws_freeContext 来释放上下文。

struct SwsContext *ctx = sws_getContext(videoCodecContext->width, videoCodecContext->height, videoCodecContext->pix_fmt, showinWidget->width(),
 showinWidget->height(), PIX_FMT_RGB24, SWS_BICUBIC, NULL, NULL, NULL);

 while(av_read_frame(formatContext,&framepacket)>= 0)
 {
   /// .....
 }

sws_freeContext(ctx);

关于c++ - ffmpeg内存增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13484296/

相关文章:

c++ - QCheckBox->isChecked() 问题

python - 停用 QT Designer 中的复选框

R:如何在没有 RAM 限制的情况下快速读取大型 .dta 文件

c++ - Visual C++ 2008 中的函数 try block

c++ - 在 Qt Quick 2 中嵌入 QWidget 对象

c++ - 涉及链表和指针的结构

c++ - 如何使用可变长度序列容器的内容初始化结构内部的std::array字段?

python - 如何快速绘制 10000+ 二维图形对象?

java - 为什么 netbeans java profiler 在 ~64mb 处崩溃并出现堆溢出错误?

c++ - 数组内容在运行时随机改变