-1

さて、私はffmpegで作業しています。実行すると、ビデオの例が実行されます。メモリが増加し始めます。単純な小さなビデオはRAMで800MBかかりますが、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間の変換は問題ありません。

4

2 に答える 2

3

SwsContextループで作成するのではなく、1回だけ作成する必要があります。最後に、を呼び出してコンテキストを解放する必要があります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);
于 2012-11-21T09:30:43.230 に答える
0

ありがとう、私はすでにそれを解決しました(Satuonのおかげで)....

問題は、変数 'framecapsule' 変数内で新しいイメージを作成していたことでした。memset が機能しなかったため、最後に作成されたイメージがメモリ内にあり、そのすべての制御が失われました....

メモリリーク!どうもありがとうございます!

于 2012-11-21T19:42:39.973 に答える