увеличение памяти ffmpeg

Ну, я работаю с ffmpeg. Когда я запускаю его, он запускает пример видео, ну, память начинает увеличиваться, простое маленькое видео занимает 800 МБ в ОЗУ, в то время как Windows Media Player просто требуется 50 МБ для запуска этого файла, я не знаю, что происходит, вот петля, отсюда проблемы (я думаю …)

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 это не проблема.

-1

Решение

Вы должны создать 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);
2

Другие решения

Спасибо, я уже решил это (спасибо Satuon) ….

Проблема заключалась в том, что я создавал новое изображение внутри переменной ‘framecapsule’, memset не работал, поэтому последнее созданное изображение находилось в памяти, теряя контроль над ним ….

Утечка памяти! Большое вам спасибо!

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector