Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ FFMPEG解码-内存泄漏_C++_Memory Leaks_Ffmpeg - Fatal编程技术网

C++ FFMPEG解码-内存泄漏

C++ FFMPEG解码-内存泄漏,c++,memory-leaks,ffmpeg,C++,Memory Leaks,Ffmpeg,在为测试开发应用程序时,我遇到了一个错误。在处理数据包的同时,我遇到了一个非常可怕的问题,内存泄漏 我认为av_free_数据包应用正确(参见代码)。当我运行应用程序时,内存会增长到500MB,同时播放音频文件,这是不正常的。VLC或WMplayer(Windows Media Player)读取该文件只需浪费30/20mb 代码如下: static AVPacket pkt; static uint8_t *audio_pkt_data = NULL; static int audio_pkt

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

我认为av_free_数据包应用正确(参见代码)。当我运行应用程序时,内存会增长到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;
}
静态AVPacket-pkt;
静态uint8_t*音频_pkt_数据=NULL;
静态int-audio\u-pkt\u-size=0;
静态AV帧;
静态布尔首次时间=真;
如果(第一次){
第一次=错误;
}
int len1,数据大小=0;
对于(;;){
bool do_rt=false;
同时(音频大小>0){
int obt_帧=0;
len1=avcodec\U decode\U audio 4(\u audio\u ccontext,&frame,&obt\u frame,&pkt);
if(len1<0){
音频大小=0;
打破
}
音频数据+=len1;
音频大小-=len1;
if(obt_帧){
数据大小=av采样获取缓冲大小(空、通道计数、采样帧、音频上下文->采样帧、1);
memcpy((int16_t*)音频,帧数据[0],数据大小);
}

如果(数据大小我想你也需要自由帧。根据ffmpeg参考

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

av_frame_unref(&frame)

当我这样做时,我的应用程序正在崩溃