好吧,我正在使用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之间的转换并不是问题。
答案 0 :(得分:2)
您必须创建一次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);
答案 1 :(得分:0)
谢谢,我已经解决了(感谢Satuon)....
问题是,我在变量'framecapsule'变量中创建了新图像,memset不起作用,所以最后创建的图像在内存中,失去了对它的所有控制....
内存泄漏!非常感谢你!