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;
}