PJSIP增加保存AVI文件功能

来源:互联网 发布:树莓派能做什么 知乎 编辑:程序博客网 时间:2024/06/05 09:15

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


0 0
原创粉丝点击