FFMPEG 解码 - 内存泄漏

3

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

我认为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;
}

我希望您能帮助我。非常感谢。

这是需要翻译的内容。
1个回答

0

我认为您也需要释放帧。根据FFmpeg参考

avcodec_decode_audio4()

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

av_frame_unref(&frame)

我的应用程序在执行该操作时崩溃了。 - Spamdark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接