FFmpeg | 画中画和视频多宫格处理
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进行不同位置平铺。
--完--
- 原文作者: 留白
- 原文链接: https://zfunnily.github.io/2020/09/ffmpegpicture/
- 更新时间:2024-04-16 01:01:05
- 本文声明:转载请标记原文作者及链接