0
回答
使用FFMPEG和opencv进行RTSP流 解码播放出现内存泄漏
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

使用ffmpeg接收的RTSP流,然后把YUV420P转换成BGR24给opencv显示,死循环出现了内存泄漏问题,检查了该释放的位置,还是没解决,求大神。

代码如下:

AVFrame *pFrame;
pFrame=av_frame_alloc();
int ret, got_picture;
static struct SwsContext *img_convert_ctx;
int y_size = pCodecCtx->width * pCodecCtx->height;


AVPacket *packet=(AVPacket *)malloc(sizeof(AVPacket));
av_new_packet(packet, y_size);
//输出一下信息-----------------------------
printf("文件信息-----------------------------------------\n");
av_dump_format(pFormatCtx,0,filepath,0);
printf("-------------------------------------------------\n");
//------------------------------
while(av_read_frame(pFormatCtx, packet)>=0)
{
if(packet->stream_index==videoindex)
{
ret = avcodec_decode_video2(pCodecCtx, pFrame, &got_picture, packet);
if(ret < 0)
{
printf("解码错误\n");
return -1;
}
if(got_picture)
{
img_convert_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height, pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height, AV_PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL);
}
if (img_convert_ctx != NULL)
{
ffmpegget(pCodecCtx, img_convert_ctx, pFrame);
}
}
av_free_packet(packet);
}
av_free(pFrame);
avcodec_close(pCodecCtx);
avformat_close_input(&pFormatCtx);
cvDestroyWindow("RTSP画面");
return 0;
}
void ffmpegget(AVCodecContext * pCodecCtx, SwsContext * img_convert_ctx, AVFrame * pFrame)
{
Mat pCvMat;
if (pCvMat.empty())
{
pCvMat.create(pCodecCtx->height, pCodecCtx->width, CV_8UC3);
}


AVFrame *pFrameRGB = NULL;
uint8_t  *out_bufferRGB = NULL;
pFrameRGB = av_frame_alloc();
//给pFrameRGB帧加上分配的内存;
int size = avpicture_get_size(AV_PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height);
out_bufferRGB = new uint8_t[size];                                               //分派大小
avpicture_fill((AVPicture *)pFrameRGB, out_bufferRGB, AV_PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height);
//YUV to RGB
sws_scale(img_convert_ctx, pFrame->data, pFrame->linesize, 0, pCodecCtx->height, pFrameRGB->data, pFrameRGB->linesize);
memcpy(pCvMat.data, out_bufferRGB, size);
namedWindow("RTSP画面");
imshow("RTSP画面", pCvMat);
waitKey(40);
delete[] out_bufferRGB; //释放
av_free(pFrameRGB);
}


举报
我爱调BUG
发帖于1年前 0回/625阅
顶部