原因
在用ffmpeg解码rtsp流的任务时,出现内存,泄露,每次打开流–读取一帧图片–关闭流,都会有10+M的内存泄露的现象。
定位
通过将解码过程中每个步骤一个个逐渐放开,看内存的增长情况。最终确定是解码的frame出现的内存泄露。
while (!stop) {
err_code = av_read_frame(i_fmt_ctx, &pkt);
// ...
ret = avcodec_send_packet(codecContext, &pkt);
// ...
while (!stop) {
ret = avcodec_receive_frame(codecContext, frame);
// ...
av_frame_unref(frame);
}
av_packet_unref(&pkt);
}
出现内存泄露的地方有两个:
- av_read_frame(), 这个网上有很多教程,成功后会为pkt.data分配内存,所有在出现异常需要跳出或者continue的时候都需要av_packet_unref(&pkt);
- avcodec_receive_frame(),在frame用完后,需要解引用,av_frame_unref(frame);