欢迎光临散文网 会员登陆 & 注册

(9)ffmpeg滤镜概念入门,了解并尝试简单滤镜

2020-02-29 23:34 作者:思思陆思思  | 我要投稿

往期回顾。

第六和第八期的最后我们都提到了“滤镜”:一个是硬嵌字幕的“-vf subtitles”,一个是拼接媒体文件的“-filter_complex "concat"”。这期我们就来讲讲什么是ffmpeg的“滤镜”。

注意这里的“滤镜”和在我们平常生活中理解的比如说手机“美颜滤镜”,ps、lr里的“调色滤镜”有点不同。除了画面,ffmpeg的“滤镜”还能处理音频和字幕。

说白了,这个意义上的ffmpeg“滤镜”就像某种“预设”。我们通过使用某个这些“预设”的操作,设定相关参数,来把音视频、字幕处理成某种想要的效果。



一、滤镜相关概念

上面所说的ffmpeg“滤镜”,是我们平时讨论这整块内容的概称。当要进一步讨论时,它通常包含如下概念:

滤镜输入流:输入给滤镜处理的流。简称输入流

滤镜输出流:滤镜处理完后输出的流。简称输出流

注意两点。一是“被滤镜处理”。如果所输入或输出的流没有被滤镜处理过,那不能算是输入流和输出流。二是,这里的输入输出流和第六篇说的“流”的概念不同。“流”、轨道流是针对音视频、字幕这些类型来说,不同类型就是不同的“流”。输入输出流是针对“滤镜处理对象”来说,滤镜对A进行了处理,A就是它的输入流,滤镜处理完后输出了B,B就是它的输出流。比如把两个视频轨输入给overlay滤镜处理之后输出了一个视频轨,那就说这个滤镜现在有两个输入流,一个输出流。


简单滤镜:指输入流和输出流都只有一个,而且输入流和输出流的类型相同的滤镜。例如subtitles滤镜,它只是利用所输入的字幕文件来对输入流进行处理,字幕文件本身没有得到任何处理也没有被输出。因此它的输入流是待硬嵌字幕的视频,输出流是字幕硬嵌完的视频。这样,输入流和输出流都只有一个,且都是视频流,所以subtitles滤镜是简单滤镜。

复杂滤镜:指存在不止一个输入流或输出流,或者存在不同类型的输入输出流的滤镜。例如concat、overlay滤镜。

滤镜:泛指单个的滤镜。像subtitles、concat、overlay,这里是三个滤镜。

滤镜链:按一定顺序方向运作的一组滤镜。比如同时使用a、b、c这三个滤镜,它们按从左到右这个确定顺序运行,那就称它们是一个滤镜链。注意a、b、c是可以任意搭配起来的滤镜,这里没有特指一定是哪个,也没有特指一定要按某种搭配才是一个滤镜链。在这例子里少了c,或者多加一个任意的d,都仍称为一个滤镜链。

简单滤镜链:按一定顺序方向运作的一组只有一个且类型都相同的输入输出流的简单滤镜。

复杂滤镜链:按一定顺序方向运作的一组存在不止一个或类型不同输入输出流的滤镜。

(注:简单、复杂滤镜链是up为了方便思考理解所提出的广念,目前up没有在其它地方阅到这两个概念的说明

滤镜图:单个或多个按一定顺序方向运作的滤镜、滤镜链都统称滤镜图。滤镜图是这里最大最广义的概念。就像工程图纸,滤镜图描述的是整个的“滤镜处理”过程。

简单滤镜图:只有简单滤镜或简单滤镜链的滤镜图。

复杂滤镜图:存在复杂滤镜或复杂滤镜链的滤镜图。


滤镜的运行方向顺序也一样默认是按命令行从左到右。命令行其它参数操作和滤镜之间,各滤镜链之内、之间都是默认前者的输出内容作为后者的输入内容。没有输入流的滤镜称为“源(source)”,没有输出流的滤镜称为“槽(sink)"。



二、滤镜的分类,相关参数介绍,滤镜图的写法

如上文所说,ffmpeg滤镜按“处理过程”可以分为简单滤镜、复杂滤镜。但通常在查询上我们是按“处理对象”分为视频滤镜、音频滤镜。“ffmpeg -filters”可以查看其所有支持的滤镜。

注意,这个分类是从滤镜所处理的“流”类型来分类的,处理的是视频流就是视频滤镜,是音频流就是音频滤镜。它们与简单、复杂滤镜的关系如下图:

至此,对滤镜分类概念的认识非常清楚了。在判断音视频滤镜上,我们就看被滤镜所处理的“流”的类型;在判断简单或复杂滤镜上,既看“流”类型,也看输入输出流的数量。输入输出流都各只有一个且“流”类型都相同,就是简单滤镜,否则就是复杂滤镜。


滤镜的简易使用形式例如:-vf 滤镜图=相应设置,-af 滤镜图=相应设置,-filter_complex 滤镜图 "相 应 设 置"(空格和引号的道理都一样)。下面介绍使用各种滤镜时所采用的参数:

“-vf”,视频简单滤镜参数,也可给图像使用。如“-vf subtitles=.\in.ass”,表示以in.ass字幕文件在所输入该滤镜的视频流上绘制文本字幕。注意图像也属于视频流。

“-af”,音频简单滤镜参数。如“-af "volume=1.5"”,表示增大原音量的一半。

“-filer_complex”,复杂滤镜参数。如“-filer_complex overlay”。

“-lavfi”,复杂滤镜参数。如“-lavfi amerge”。


注意,复杂滤镜参数可以用上视频或音频简单滤镜,相当于可代替“-vf”或“-af”,当然也可以用上各种滤镜或滤镜链。像“-lavfi volume”、“-lavfi subtitles”。

另外类似“-c”,在旧版本中的“-filter:v”、“-filter:a”分别就是现在的“-vf”、“-af”,这些至今都依然适用。


最后说说滤镜图的写法:滤镜链使用";"分隔,滤镜链中的滤镜使用","分隔。

例如-af "atempo=2.0,atempo=2.0"、-lavfi "[0:v]steps=0.5*PTS[v];[0:a]atempo=2.0[a]"。这里像“-map”的道理,在每个滤镜的前后设置所输入输出的轨道流。如[v]表示steps滤镜输出的视频流标记为[v]。[a]同理。

一个完整的滤镜命令行例如:ffmpeg -y -i in1.mp4 -i in2.jpg -filter_complex "[1:v]crop=1920:1080:0:100,format=yuv420p,loop=loop=120:size=1,framerate=30[v1];[0:v][v1]concat=n=2:v=1:a=0[v]" -map "[v]" -map 0:a -crf 20 -r 30 -c:a copy out.mp4



三、简单滤镜的介绍及尝试运用

这里介绍几个简单滤镜,大家可以尝试运用,感受一下~

scale,-vf scale=1920:1080,缩放输入视频的尺寸并/或改变图像格式。(-vf scale=iw/2:-1,意为将输入媒体的宽高尺寸缩放为原来的一半且宽高比不变,iw 是指输入媒体的宽度,-1是通知缩放滤镜在输出时保持原始的宽高比)

steps,-vf "steps=0.5*PTS",二倍速播放视频,设置输出视频帧的显示时间戳(Presentation Time Stamp),可以用于快放或慢放等。(注:可能会导致丢帧,要想避免丢帧,可用设置输出的帧率比输入的帧率高的办法。如四倍速播放,输入帧率为4,则设置输出帧率为16)

crop,-vf crop=w:h:x:y,以给定的视频尺寸截取输入视频。(w:h是所要截取所宽和高,x:y是以视频最左上角为原点(0,0)的坐标)

pad,-vf pad=w:h:x:y:color,给输入视频添加填充新的显示区域。(w:h是最后输出带上新区域的宽和高,x:y是以视频最左上角为原点的坐标,color是所填充的颜色,如black)

atempo,-af atempo=2.0,二倍速播放音频,调整音频播放速度,范围是0.5~2.0。(-af "atempo=2.0,atempo=2.0",可用多个atempo滤镜来实现四倍速音频)


更多滤镜介绍请看这个网址:

ffmpeg滤镜中英文对照:https://www.cnblogs.com/nlsoft/p/5195172.html



感谢你观看到这里。

(9)ffmpeg滤镜概念入门,了解并尝试简单滤镜的评论 (共 条)

分享到微博请遵守国家法律