2013-05-01 131 views
3

为测试开发应用程序,我遇到了一个错误。同时,数据包被处理,我有一个非常可怕的问题,内存泄漏。FFMPEG解码 - 内存泄漏

av_free_packet正确应用,我认为(请参阅代码)。当我运行应用程序时,内存增长到500MB,同时播放音频文件,这是不正常的。 VLC或WMplayer(Windows Media Player)只是浪费30/20mb读取该文件。

下面是代码:

static AVPacket pkt; 
static uint8_t *audio_pkt_data = NULL; 
static int audio_pkt_size = 0; 
static AVFrame frame; 
static bool first_time = true; 

if(first_time){ 
    first_time=false; 
} 

int len1, data_size = 0; 

for(;;){ 
    bool do_rt = false; 

    while(audio_pkt_size > 0){ 
     int obt_frame = 0; 

     len1 = avcodec_decode_audio4(_audio_ccontext,&frame,&obt_frame,&pkt); 
     if(len1 < 0){ 
      audio_pkt_size = 0; 
      break; 
     } 
     audio_pkt_data+=len1; 
     audio_pkt_size-=len1; 
     if(obt_frame){ 
      data_size = av_samples_get_buffer_size(NULL,channel_count,sample_fr,_audio_ccontext->sample_fmt,1); 
      memcpy((int16_t*)audio_buf,frame.data[0],data_size); 

     } 
     if(data_size <= 0){ 
      continue; 
     } 
     do_rt = true; 
    } 

    if(pkt.data){ 
     //MessageBox(0,"hi","Hi",MB_OK); // This is only for test if the app si reaching this av_free_packet 
     av_free_packet(&pkt); 
    } 

    if(do_rt){ 
     return data_size; 
    } 

    // Try to get a new packet 
    if(!audio_packets.empty()){ 
     WaitForSingleObject(Queue_Audio_Mutex,INFINITE); 
      pkt = *audio_packets.front(); 
      audio_packets.pop(); 
     ReleaseMutex(Queue_Audio_Mutex); 

     audio_pkt_size = pkt.size; 
     audio_pkt_data = pkt.data; 
    }else{ 
     return -1; 
    } 
} 
return 0; 
} 

我会感谢你的帮助。非常感谢你。

回答

0

我认为你也需要释放帧。按照FFMPEG参考

avcodec_decode_audio4()

的解码器将通过调用AVCodecContext.get_buffer2()回调分配用于解码帧的缓冲器。当AVCodecContext.refcounted_frames设置为1时,帧被引用计数,返回的引用属于调用者。当帧不再需要时,调用者必须使用av_frame_unref()释放帧。请点击链接。 您可以尝试添加

av_frame_unref(&frame) 
+0

当我这样做时,我的应用程序崩溃 – Spamdark 2013-05-01 17:26:34