音频解码内存泄漏ffmpeg

时间:2016-06-19 12:24:00

标签: c++ audio memory-leaks ffmpeg decoding

我正在使用ffmpeg库开发用于音频解码的应用程序。

我正在使用avcodec_decode_audio4()函数,但它有非常重要的内存泄漏。我尝试了av_frame_unref(),但仍然存在漏洞。

之后,我切换到了不推荐avcodec_decode_audio4()的库的最新版本以及其他一些东西。

有人能指出我如何解析帧而不使用avcodec_decode_audio4()或如何摆脱内存泄漏。

谢谢,

编辑:

我找到了方法。查看有关avcodec_decode_audio4()的ffmpeg文档的给定示例,我做了一些更改。

AVCodec *codec;
AVCodecContext *c = NULL;

c = avcodec_alloc_context3(NULL);

for (int i = 0; i < m_ctx->nb_streams; ++i) {
    AVCodecParameters* tc = m_ctx->streams[i]->codecpar;
    if (tc->codec_type == AVMEDIA_TYPE_AUDIO) {
        if(avcodec_parameters_to_context(c,tc) < 0){
            return false;
        }
        break;
    }
}

if(avcodec_open2(c, codec, 0) < 0)
    return false;

AVPacket avpkt;
AVFrame *decoded_frame = NULL;  

decoded_frame = av_frame_alloc();
av_init_packet(&avpkt);

while(av_read_frame(m_ctx, &avpkt) >= 0){

    if(!getFrame(&avpkt, c, decoded_frame)){
        av_frame_unref(decoded_frame);
        av_packet_unref(&avpkt);
        continue;
    }

    // your code here

    av_frame_unref(decoded_frame);
    av_packet_unref(&avpkt);
}

GetFrame方法:

bool getFrame(AVPacket* avpkt, AVCodecContext* c, AVFrame* frame){
    if(avcodec_send_packet(c,avpkt) < 0){
        return false;
    }

    if(avcodec_receive_frame(c, frame) < 0){
        return false;
    }
    return true;
}

m_ctx是类字段变量AVFormatContext *,它是先前初始化的。

无论如何问题是AVPacket缓冲区在使用数据包后未释放,而av_packet_unref

0 个答案:

没有答案