FFmpeg生成画中画

静态画中画

将视频sub.mp4视频文件缩放成宽 480 、高 320 的视频,然后显示在 视频 input.mp4,x坐标为0,y 坐标为0 的位置

ffmpeg -re -i input.mp4 -vf "movie=sub.mp4, scale=480x320[test]; [in][test]overlay [out]" -vcodec libx264 output.flv

显示在画面的右下角,则需要用到 overlay 中x坐标与y坐标的内部变量:

ffmpeg -re -i input.mp4 -vf "movie=sub.mp4, scale=480x320[test]; [in][test]overlay=x=main_w-480:y=main_h-320 [out]" -vcodec libx264 output.flv

根据命令行可以分析出,除了显示在 overlay 画面中,子视频将会定位在主画面的 右边减去子视频的宽度,最下边减去子视频的高度的位置

动态画中画

使用 overlay 还可以配合正则表达式 进行跑马灯式画中画处理,动态改变子画面的 x坐标与 y坐标即可

ffmpeg -re -i input.mp4 -vf "movie=sub.mp4, scale=480x320[test]; [in][test]overlay=x='if(gte(t,2), -w+(t-2)*20, NAN)':y=0 [out]" -vcodec libx264 output.flv

命令行执行之后,子视频将会从主视频的左侧开始渐入视频从左向右游动

总结:视频画中画的基本处理至此已介绍完毕,重点为 overlay 滤镜的使用

FFmpeg视频多宫格处理

通过 nullsrc 创建一个 overlay 画布,画布的大小为宽 640 像素、高 480 像素, 使用[O:v][l :v ][2:v ][3 :v ]将输入的 个视频流去除,分别 进行缩放处理,处理为宽 320 、高 240 的视频,然后基于 nullsrc 生成的画布进行视频平铺,

ffmpeg -re -i input1.mp4 -re -i input2.mp4 -re -i input3.m2t -re -i input4.mp4 \
-filter_complex
"nullsrc=size=640x480 [base]; 
[0:v] setpts=PTS-STARTPTS,scale=320x240 [upperleft];  
[1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright];
[2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft];
[3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright];
[base][upperleft] overlay=shortest=1[tmp1];
[tmp1][upperright] overlay=shortest=1:x=320 [tmp2];
[tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3];
[tmp3][lowerright] overlay=shortest=1:x=320:y=240"
 -c:v libx264 out.mp4

直播视频流的多宫格展现形式将 input 更改为直播流地址即可

简单明了,1.2.3.4.mp4为文件路径,out.MP4为输出文件路径,通过nullsrc创建overlay画布,画布大小640:480, 使用[0:v][1:v][2:v][3:v]将输入的4个视频流去除,分别进行缩放处理,然后基于nullsrc生成的画布进行视频平铺,命令中自定义upperleft,upperright,lowerleft,lowerright进行不同位置平铺。

--完--