我正在使用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