ffmpeg利用滤镜进行视频混合(命令行)

ffmpeg的滤镜是极其强大的,可以进行混音和混流,对于初学者而言,需要了解滤镜的编写规则,滤镜的编写规则,直观上不是很好懂,本文用命令行的方式,对视频进行混合,并给予对应的说明,后面会用代码的方式进行混合。

关于滤镜的说明,下面的这个文章写的不错,读者不妨先看看
https://www.cnblogs.com/vikings-blog/p/11512530.html

准备4个视频文件,每个视频文件1分钟时长,本人直接用自己写的程序抓取本地桌面,生成四个视频文件,相关的抓取可以参考我的博客ffmpeg录制桌面(自己用gdi抓图)
如下图所示,四个文件的背景分别是资源浏览器,桌面,e盘,vs2017。
ffmpeg利用滤镜进行视频混合(命令行)
现在分别打开给读者看看,本人是在qq影音里面打开的,分辨率为1920*1080
in-computer.mp4对应的视频如下:
ffmpeg利用滤镜进行视频混合(命令行)
in-desktop.mp4对应的视频如下:
ffmpeg利用滤镜进行视频混合(命令行)
in-e.mp4对应的视频如下:
ffmpeg利用滤镜进行视频混合(命令行)
in-vs.mp4对应的视频如下:
ffmpeg利用滤镜进行视频混合(命令行)
大家其实可以发现,四个文件的大小不一样,这跟图片背景的复杂度有关,图片越复杂,mp4文件越大。

下面开始进行图片混合,首先是两张图片的混合,一左一右,如下所示:
ffmpeg利用滤镜进行视频混合(命令行)
对应的命令如下:

ffmpeg -i in-desktop.mp4 -i in-computer.mp4 -filter_complex "[0:v]pad=iw*2:ih*1[myname];[myname][1:v]overlay=w" out1.mp4

现在做下简要说明,filter_complex表示的是复杂方式的混合,即两个文件以上(包含两个文件)的混合,pad和overlay分别代表两个过滤器,其中pad代表的是创建一个背景,前面的 [0:v]表示的是第一个视频文件,即in-desktop.mp4,iw,ih表示视频中的宽和高,[0:v]pad=iw2:ih1[myname]表示以第一个视频文件为基,创建一个宽度为其二倍,高度与视频文件一致的pad,并命名为myname,这个名字可以定义成其他字符串;
接着看下面的[myname][1:v]overlay=w,这个过滤器是overlay,代表的是视频混合功能,其前面有两个中括号代表两个源头,其中第一个源头为基,第二个源头往第一个源头里面混。overlay=w,代表的是第二个视频文件[1:v]在整个pad中的坐标,其中横坐标为w,纵坐标没写,为0。
混合的效果如下:
ffmpeg利用滤镜进行视频混合(命令行)
分辨率为3840*1080。

上面的滤镜写法直接是在第一个视频的基础上创建的pad,也可以独立创建pad,再依次混合两个视频文件,命令如下:

ffmpeg -i in-desktop.mp4 -i in-computer.mp4 -filter_complex "pad=3840:1080[x0];[x0][0:v]overlay=0[x1];[x1][1:v]overlay=w" out1.mp4

其中滤镜分为三段,如下所示,第一段创建pad(图片基),命名为x0,第二段是第一路视频[0:v]向x0混,混合后产生x1,第三段是第二路视频[1:v]向x1混合,并且[1:v]在x1中的位置是w:0。
ffmpeg利用滤镜进行视频混合(命令行)

我们再看下如下命令产生的效果:

ffmpeg -i in-desktop.mp4 -i in-computer.mp4 -filter_complex "[0:v]pad=iw*2:ih*1[myname];[myname][1:v]overlay=w/2" out2.mp4

这个跟上面的相比,只修改了一个地方,overlay=w/2,位置变了,代表第二张图片会覆盖第一张图的一半,同时由于pad的总宽度是2w,所以最终的图像,右边会有w/2个宽度没图像,背景呈现黑色,分辨率为3840*1080。
如下所示:
ffmpeg利用滤镜进行视频混合(命令行)

我们再看下如下命令产生的效果:

ffmpeg -i in-desktop.mp4 -i in-computer.mp4 -filter_complex "[0:v]pad=iw*3/2:ih*1[myname];[myname][1:v]overlay=w/2" out3.mp4

这个滤镜对应的宽度是3w/2,分辨率为2880*1080:效果如下:
ffmpeg利用滤镜进行视频混合(命令行)

上面的三个例子是两个视频的横排,我们再看下两视频的竖排:
ffmpeg利用滤镜进行视频混合(命令行)
输入如下命令:

ffmpeg -i in-desktop.mp4 -i in-computer.mp4 -filter_complex "[0:v]pad=iw*1:ih*2[myname];[myname][1:v]overlay=0:h" out4.mp4

产生的效果如下,分辨率为1920*2160:
ffmpeg利用滤镜进行视频混合(命令行)

再次输入命令如下:

ffmpeg -i in-desktop.mp4 -i in-computer.mp4 -filter_complex "[0:v]pad=iw*1:ih*2[myname];[myname][1:v]overlay=0:h/2" out5.mp4

产生的效果如下,分辨率为1920*2160:
ffmpeg利用滤镜进行视频混合(命令行)
可以看到,最下面有一块没有显示

再次输入命令如下:

ffmpeg -i in-desktop.mp4 -i in-computer.mp4 -filter_complex "[0:v]pad=iw*1:ih*3/2[myname];[myname][1:v]overlay=0:h/2" out6.mp4

产生的效果如下,分辨率为1920*1620:
ffmpeg利用滤镜进行视频混合(命令行)

接着我们来看下四个视频的混合,界面布局如下:
ffmpeg利用滤镜进行视频混合(命令行)
首先看没有V4,只有三个视频的混合,命令如下:

ffmpeg -i in-desktop.mp4 -i in-computer.mp4 -i in-e.mp4 -filter_complex "[0:v]pad=iw*2:ih*2[x0];[x0][1:v]overlay=w[x1];[x1][2:v]overlay=0:h" out7.mp4

产生的效果如下,分辨率为3840*2160:
ffmpeg利用滤镜进行视频混合(命令行)
再次看四个视频齐全的情况,命令如下:

ffmpeg -i in-desktop.mp4 -i in-computer.mp4 -i in-e.mp4 -i in-vs.mp4 -filter_complex "[0:v]pad=iw*2:ih*2[x0];[x0][1:v]overlay=w[x1];[x1][2:v]overlay=0:h[x2];[x2][3:v]overlay=w:h" out8.mp4

产生的效果如下,分辨率为38402160:
ffmpeg利用滤镜进行视频混合(命令行)
上面的四个视频的混合,分辨率也随之增加,很明显不现实,正常而言,我们想要的效果是,四个视频混合后,最终生成的混合视频的分辨率为1920
1080。

输入命令如下:

ffmpeg -i in-desktop.mp4 -i in-computer.mp4 -i in-e.mp4 -i in-vs.mp4 -filter_complex "[0:v]pad=iw:ih[x0];[x0][1:v]overlay=w/2[x1];[x1][2:v]overlay=0:h/2[x2];[x2][3:v]overlay=w/2:h/2" out9.mp4

产生的效果如下所示,混合视频分辨率为19201080:
ffmpeg利用滤镜进行视频混合(命令行)
很明显这里面有一个问题,第一块视频的右半部分和下部分被遮挡了。
这个是原有视频的尺寸依然没变有关,需要进行scale操作,即将1920
1080改变为960*540。
此时就需要新增加一个过滤器scale,命令如下:

ffmpeg -i in-desktop.mp4 -i in-computer.mp4 -i in-e.mp4 -i in-vs.mp4 -filter_complex "pad=1920:1080[x0];[0:v]scale=w=960:h=540[scale0];[x0][scale0]overlay=0[x1];[1:v]scale=w=960:h=540[scale1];[x1][scale1]overlay=960[x2];[2:v]scale=w=960:h=540[scale2];[x2][scale2]overlay=0:540[x3];[3:v]scale=w=960:h=540[scale3];[x3][scale3]overlay=960:540" out11.mp4

产生的效果如下所示,混合视频分辨率为1920*1080:
ffmpeg利用滤镜进行视频混合(命令行)
这次效果是正常的。

我们再看下四个视频的如下组合方式,左边一个,右边三个,左边视频的尺寸为19201080,右边三个视频的尺寸都是640360,注意批注缩写的V2,V3,V4相对于整个图形的坐标位置。
ffmpeg利用滤镜进行视频混合(命令行)
合成命令如下:

ffmpeg -i in-desktop.mp4 -i in-computer.mp4 -i in-e.mp4 -i in-vs.mp4 -filter_complex "pad=2560:1080[x0];[0:v]scale=w=1920:h=1080[scale0];[x0][scale0]overlay=0[x1];[1:v]scale=w=640:h=360[scale1];[x1][scale1]overlay=1920[x2];[2:v]scale=w=640:h=360[scale2];[x2][scale2]overlay=1920:360[x3];[3:v]scale=w=640:h=360[scale3];[x3][scale3]overlay=1920:720" out12.mp4

效果如下,分辨率为2560*1080:
ffmpeg利用滤镜进行视频混合(命令行)

最后,本人给出下载地址:
链接:https://pan.baidu.com/s/1UW0meYoi7rIvBPpiFxHo8w
提取码:1234
二维码如下:
ffmpeg利用滤镜进行视频混合(命令行)
读者如果遇到下载困难,可以联系我。

上一篇:36.求一元二次方程的根


下一篇:VS2010使用EventHandler发邮件