ffmpeg将rgba数据转成png图片

最近在做热区图分析,需要对视频中的一些热区信息产生热区图,并叠加到视频背景图上,主要工作有两部分:

1.分析热区数据,生成rgba数据(本文暂时先不讲具体实现);

2.用ffmepg将rgba数据生成png图(主要讲这部分内容);


具体实现代码如下:

bool save_pic(AVFrame *frm, AVPixelFormat pfmt, AVCodecID cid, const char* filename, int width, int height)
{
int outbuf_size = width * height*4;
uint8_t * outbuf = (uint8_t*)malloc(outbuf_size);
int got_pkt = 0;

FILE* pf;
pf = fopen(filename, "wb");
if (pf == NULL)
	return false;
AVPacket pkt;
AVCodec *pCodecRGB24;
AVCodecContext *ctx = NULL;
pCodecRGB24 = avcodec_find_encoder(cid);
if (!pCodecRGB24)
	return false;
ctx = avcodec_alloc_context3(pCodecRGB24);
ctx->bit_rate = 3000000;
ctx->width = width;
ctx->height = height;
AVRational rate;
rate.num = 1;
rate.den = 25;
ctx->time_base = rate;
ctx->gop_size = 10;
ctx->max_b_frames = 0;
ctx->thread_count = 1;
ctx->pix_fmt = pfmt;


int ret = avcodec_open2(ctx, pCodecRGB24, NULL);
if (ret < 0)
	return false;

//	int size = ctx->width * ctx->height * 4;
av_init_packet(&pkt);
static int got_packet_ptr = 0;
pkt.size = outbuf_size;
pkt.data = outbuf;
got_pkt = avcodec_encode_video2(ctx, &pkt, frm, &got_packet_ptr);
frm->pts++;
if (got_pkt == 0)
{
	fwrite(pkt.data, 1, pkt.size, pf);
}
else
{
	return false;
}
fclose(pf);
return true;
}
具体测试代码如下:

save_pic(pFrame,AV_PIX_FMT_RGBA,AV_CODEC_ID_PNG,pImagePath,OUT_PNG_PIC_WIDTH,OUT_PNG_PIC_HEIGHT);
测试结果如下:
ffmpeg将rgba数据转成png图片_第1张图片 ffmpeg将rgba数据转成png图片_第2张图片
左边是原始图,右边是生成的热区图


你可能感兴趣的:(ffmpeg)