PJSIP增加保存AVI文件功能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenquangobeijing/article/details/51472346

PJSIP库没有保存视频文件的功能。保存为AVI文件是因为图像是RGB格式的,有一个avilib类可以写AVI文件。

PJSIP库中的ffmpeg解码后,格式是I420,即YUV420P。宽高是720*480。利用ffmpeg的sws_scale可将YUV转为RGB格式。

注意格式是PIX_FMT_BGR24,否则颜色不对,红蓝反了

图像是颠倒的,需要进行转换

具体代码如下:

使用前调用avi_create()函数。

在ffmpeg_codec_decode_whole(…)中
output->type = PJMEDIA_FRAME_TYPE_VIDEO;
output->size = vafp->framebytes;后添加
if(g_nFlag==1)
{			avframe.data[0]=avframe.data[0]+avframe.linesize[0]*(g_nheight-1);
	avframe.linesize[0]=avframe.linesize[0]*-1;
avframe.data[1]=avframe.data[1]+avframe.linesize[1]*(g_nheight/2-1);
	avframe.linesize[1]=avframe.linesize[1]*-1;
avframe.data[2]=avframe.data[2]+avframe.linesize[2]*(g_nheight/2-1); avframe.linesize[2]=avframe.linesize[2]*-1;
sws_scale(g_sws_ctx, avframe.data, avframe.linesize, 0, g_nheight, 
				g_dst_data, g_dst_linesize);
if(g_ntotalindex<50)  //前面的帧是粉红色,过滤掉
{  ++g_ntotalindex;  }
else  if(g_ntotalindex>=50)
{
	g_ntotalindex++;
AVI_write_frame(g_avi, g_dst_data[0], g_nwidth*g_nheight*3, g_navi++);
}
}

PJ_DEF(pj_status_t)   yuv2rgb_init()
{
	int  nLen;
	g_sws_ctx = sws_getContext(g_nwidth, g_nheight, AV_PIX_FMT_YUV420P,g_nwidth, g_nheight, PIX_FMT_BGR24,
	SWS_BICUBIC, NULL, NULL, NULL);
	if (g_sws_ctx == NULL)
		return PJ_ENOTSUP;

	nLen = av_image_alloc(g_dst_data, g_dst_linesize, g_nwidth, g_nheight, PIX_FMT_BGR24, 1);
	if(nLen<0)
	{
		return   PJ_FALSE;
	}
	return  PJ_TRUE;
}

PJ_DEF(pj_status_t)  avi_create( const char *filename)
{
	yuv2rgb_init();
	g_avi=AVI_open_output_file(filename);
	AVI_set_video(g_avi, g_nwidth, g_nheight, 15, "RGB");
	return  PJ_TRUE;
}



猜你喜欢

转载自blog.csdn.net/chenquangobeijing/article/details/51472346