最近在预研融屏/多画面显示,接触ffmpeg比较多,首先想到的是将多YUV合成一个YUV,然后再渲染显示,立马动手起来。
首先,先从简单的来,选取两个YUV,分辨率分别为480*272、352*288,然后合成目标702*288的YUV,这样是考虑多画面时有不一致的分辨率,把它们弄成统一的分辨率再合成,YUV的格式都是YUV420P采样格式,统一分辨率是352*288。
第二,裁减YUV,利用到ffmpeg的sws_scale函数去裁减,先初始化SwsContext
/*
in_w --- 源分辨率的宽, in_h ---- 源分辨率的高
frame_msg->width/height --- 需要裁减成的分辨率
SWS_BICUBLIN --- 裁减时使用的算法
*/
code_msg->pSwsCtx = sws_getContext(in_w, in_h, AV_PIX_FMT_YUV420P,
frame_msg->width, frame_msg->height, AV_PIX_FMT_YUV420P,
SWS_BICUBLIN, NULL, NULL, NULL);
然后进行裁减
/*
code_msg->pFrame->data --- 源YUV
code_msg->pCodecCtx->height --- 源YUV的高
code_msg->pSwsframe->data --- 裁减后的YUV
*/
ret = sws_scale(code_msg->pSwsCtx, code_msg->pFrame->data, code_msg->pFrame->linesize, 0,