前言

哈哈,回来继续填坑了,前段时间较忙没时间写,现在继续~

简介

滤镜是ffmpeg的一个很强大的功能,它支持许多有用的视频处理功能,常见的滤镜如:缩放、旋转、水印、裁剪等

一个比较经典的滤镜使用方法如下(来自ffmpeg官网):

                [main]
input --> split ---------------------> overlay --> output
| ^
|[tmp] [flip]|
+-----> crop --> vflip -------+

上面的示意图的流程是:将input复制A B两份,A当作主画面,B先裁剪,再垂直翻转,然后将B覆盖在A上当作水印

如果上面的事情用ffmpeg来实现的话,命令最终会是这样

ffmpeg -i buck.mp4 -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" out.mp4 -y

如果是不了解滤镜的同学,猛一看肯定是懵逼的,反正我当时是完全懵逼的状态,没关系,慢慢来

看过之前文章(ffmpeg第2篇:简单滤镜与复杂滤镜的区别)的同学应该知道,滤镜分简单滤镜和复杂滤镜,用-vf-lavfi来表示

而上面的命令用的是-vf,显然这是一个简单的滤镜,因为它只有一个输入和输出

语法规则

分段

将滤镜代码单独拿出来

split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2

可以看到有分号(;)和逗号(,)两种分隔符

那什么时候用分号,什么时候用逗号呢?简单来说,规则就是:同一路的滤镜间用逗号进行分割,不同路的滤镜间用分号进行分割

怎么理解上面的规则呢,不妨将整体滤镜逐个拆解

  • split [main][tmp];

    这个动作就是将input复制两份,一份名字是main,另一份名字叫tmp,后面跟了分号,因为拆完后已经两路流了,不能再当一路流处理了,所以用分号隔开

  • [tmp] crop=iw:ih/2:0:0, vflip [flip];

    这个动作就是将tmp先剪裁(crop)再做垂直翻转(vflip),输出名字为flip的新数据流,对于裁剪和翻转来说,都是处理的tmp这一路流,用逗号隔开即可。翻转后面跟了分号,因为翻转完咱们对它的操作结束了,后面要用它与main合并了,如果你还想继续处理,那可以加个逗号继续处理,比如咱们还想再给它压缩一下分辨率为640x360,就可以这样

    [tmp] crop=iw:ih/2:0:0, vflip, scale=640:360 [flip];

    怎么样,现在能明白了吧

  • [main][flip] overlay=0:H/2

    将最初的main流与经过处理的flip流合并

表达式

看一个新的命令

ffmpeg -i buck.mp4 -vf "split [main][tmp]; [tmp] crop=iw/4:ih/4:0:0 [crop]; [main][crop] overlay=y='if(lte(t,2),0,H-h)'" out.mp4 -y

相比上个命令,这个命令多了一对单引号包括起来的表达式:'if(lte(t,2),0,H-h)'

这个表达式中的t是ffmpeg内置的参数,表示的是timestamp时间戳的意思

其实对于程序员来说,一看就明白,它其实是个表达式,相当于在ffmpeg命令中执行程序,对于这种形式的命令(其它的还有诸如 gt、mod、between),ffmpeg要求使用单引号包括起来,便于ffmpeg解析,这是硬性要求,没什么不好理解的,知道有这个规则就好。

输入输出

每一个滤镜都应该有输入输出,上面的命令ffmpeg -i buck.mp4 -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" out.mp4 -y中,咱们在分段章节拆分出了三个滤镜,但是可以看到只有中间的滤镜是有输入([tmp])和输出([flip])的,第一个没有输入,只有两个输出([main][tmp]),而最后一个只有两个输入([main][flip]),没有输出,为什么?

因为这个命令中,只有一个输入和输出,所以:

  • 对于第一个滤镜来说,默认将输入(buck.mp4)当作它的输入
  • 对于最后一个滤镜来说,默认将输出文件(out.mp4)当作它的输出

再看看这个命令

ffmpeg -i buck.mp4 -stream_loop -1 -i 3.mp4 -lavfi "[0:v] transpose [trans];[trans][1:v] overlay" -shortest out.mp4 -y

这个命令中,有两个输入(buck.mp4、3.mp4),对于第一个滤镜([0:v] transpose [trans];)则需要手动指定具体是哪个输入

结语

对于ffmpeg滤镜来说,我觉得最难明白的就是它的语法,反正我学习下来感受是这样的

对于掌握的同学来说,这些很简单,但是对于不熟悉ffmpeg的同学来说,这个门槛可一点都不低

等了解了它的语法规则后我感觉你就学会了一半,剩下的无非是熟悉它支持哪些滤镜,每个滤镜的功能是什么样子的

文章目录

ffmpeg第1篇:日志级别控制、保存日志到指定文件、处理进度查询

ffmpeg第2篇:简单滤镜与复杂滤镜的区别

ffmpeg第3篇:为视频添加静态水印

ffmpeg第4篇:为视频添加动态水印

ffmpeg第5篇:让水印图片旋转起来

ffmpeg第6篇:滤镜语法

番外篇

ffmpeg番外篇:听说这款水印曾经在某音很火?办它!

有问题请留言沟通,欢迎转载,转载请注明出处

更多精彩内容,欢迎点击个人博客地址:愉快编程

ffmpeg第6篇:滤镜语法的更多相关文章

  1. ffmpeg第7篇:数据流选择神器-map指令

    自动选择规则 ffmpeg在处理视频时,如果只提供了输入和输出参数,ffmpeg会自动地去选择相应的视频流和音频流来合成文件 自动选择的方式根据如下规则: 视频流:选分辨率最高的,比如有两个视频,一个 ...

  2. Python入门篇-基础语法

    Python入门篇-基础语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编程基础 1>.程序 一组能让计算机识别和执行的指令. 程序 >.算法+ 数据结构= 程 ...

  3. .net 开源模板引擎jntemplate 教程:基础篇之语法

    一.基本概念 上一篇我们简单的介绍了jntemplate并写了一个hello world(如果没有看过的,点击查看),本文将继续介绍jntemplate的模板语法. 我们在讲解语法前,首先要了解一下标 ...

  4. 鸿蒙内核源码分析(GN应用篇) | GN语法及在鸿蒙的使用 | 百篇博客分析OpenHarmony源码 | v60.01

    百篇博客系列篇.本篇为: v60.xx 鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

  5. ffmpeg入门篇-滤镜的基本使用

    转发自白狼栈:查看原文 滤镜 什么是滤镜?百度百科介绍说"滤镜主要是用来实现图像的各种特殊效果......". 我们最早在ffmpeg是如何转码的一文中了解过滤镜,来回顾下当时的转 ...

  6. ffmpeg第2篇:简单滤镜与复杂滤镜的区别

    在ffmpeg的滤镜中,有简单滤镜(simple filter)和复杂滤镜(complex filter)两种. 使用简单滤镜时,用-vf选项,使用复杂滤镜时,使用-filter_complex或-l ...

  7. FFmpeg原始帧处理-滤镜API用法详解

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10429145.html 在FFmpeg中,滤镜(filter)处理的是未压缩的原始音视频 ...

  8. ffmpeg第4篇:为视频添加动态水印

    动态分为三种: 水印本身变化 水印显示时间变化 水印位置变化 水印本身变化 看过上一篇的小伙伴可能觉得第一种很简单,把jpg格式的图片换成gif格式的不就可以了吗,然而亲自试一下就会发现,把gif图片 ...

  9. 4、JavaScript进阶篇①——基础语法

    一.认识JS 你知道吗,Web前端开发师需要掌握什么技术?也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HTML+CSS创建一个漂亮的页面,但这还不够,它只是静态页面 ...

随机推荐

  1. 第二章 python基本语法元素

    python有两种编程方式,交互式和文件式. 交互式:对每个输入语句即时运行结果------适合语法练习 文件式:批量执行一组语句并运行结果------编程的主要方式 实例1:圆面积的计算(根据半径r ...

  2. WPF项目升级sqlite-net-pcl时遇到Library e_sqlite3 not found的问题解决办法记录

    项目中为了方便的存储本地数据,使用了SQLite数据库作为数据存储,再设计时DB.models引用了sqlite-net-pcl,那么项目再升级sqlite-net-pc 1.7.335l版本后后,遇 ...

  3. ARM汇编指令-STM32单片机启动

    EQU 给数字常量取一个符号名,相当于c中的define. AREA  告诉汇编器汇编一个新的代码段. SPACE 分配内存空间. PRESERVE   当前文件堆栈按照8字节对齐. EXPORT 声 ...

  4. 入门Kubernetes-Service

    一.前言 前一篇文章通过 Deployment 实现了Pod中服务实现滚动更新/回滚等操作:在真实应用场景中,需要将一组Pod提供给外部访问.而且Pod生命周期是短暂的,在 Pod 的生命周期过程中, ...

  5. static能修饰什么

    简洁易懂讲清原理,讲不清你来打我~ 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在main函数运行前就分配空间,有初始值就初始值,没有初始值就系统默认值初始化 修饰普通函数,修改函 ...

  6. 「干货」面试官问我如何快速搜索10万个矩形?——我说RBush

    「干货」面试官问我如何快速搜索10万个矩形?--我说RBUSH 前言 亲爱的coder们,我又来了,一个喜欢图形的程序员‍,前几篇文章一直都在教大家怎么画地图.画折线图.画烟花,难道图形就是这样嘛,当 ...

  7. CSAPP:bomblab

    BOMBLAB实验总结 CSAPP实验BOMB,很头疼,看不懂,勉强做完了. 答案是这样的: Border relations with Canada have never been better. ...

  8. ThinkPHP3.2.3使用PHPExcel类操作excel导出excel

    如何导入excel请看:ThinkPHP3.2.3使用PHPExcel类操作excel导入读取excel // 引入PHPExcel类 import("Org.Util.PHPExccel& ...

  9. 【LeetCode】面试题62. 圆圈中最后剩下的数字

    题目:面试题62. 圆圈中最后剩下的数字 这题很有意思,也很巧妙,故记录下来. 官方题解思路,是约瑟夫环的数学解法: 我们将上述问题建模为函数 f(n, m),该函数的返回值为最终留下的元素的序号. ...

  10. 《手把手教你》系列技巧篇(十三)-java+ selenium自动化测试-元素定位大法之By partial link text(详细教程)

    1.简介 本文按计划就要开始介绍partial link text,顾名思义是通过链接定位的(官方说法:超链接文本定位).什么是partial link text呢,看到part这个单词我们就可以知道 ...