您的位置:首页 > Web前端 > JavaScript

PJSIP增加保存AVI文件功能

2016-05-21 21:07 501 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: