在ffmpeg框架中,滤镜(filter)功能通过libavfilter库实现。 一个filter可以同时有多个输入和输出。以图为例:

图中的一系列操作共使用了四个filter,分别是
    splite:将输入的流进行分裂复制,分两路输出。 
    crop:根据给定的参数,对视频进行裁剪 
    vflip:根据给定参数,对视频进行翻转等操作 
    overlay:将一路输入覆盖到另一路之上,合并输出为一路视频 
    整个过程的命令为下图:

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

最终实现的效果是,视频的上半部分水平翻转,下半部分被覆盖,输出一个水平对称的视频。

命令行分析:splite有两路输出,分别被标签标记为[main]和[tmp],在命令中,可以用这种形式来标记输入输出,在后面命令中,对被标记的输出进行引用。其中一路输出[tmp]作为输入传递给crop。crop的参数格式为w:h:x:y,其中w、h为输出视频的宽和高,x、y标记输入视频中的某点,将该点作为基准点,向右下进行裁剪得到输出视频。示例中crop的参数为iw:ih/2:0:0,iw、ih分别为输入流视频的宽和高,因此该参数表明,以原视频左上角为基准点,宽度不变,裁剪原视频的上半部分。从crop得到的输出被传递给vflip,vflip对输入做水平翻转处理,得到输出[flip]。然后将splite的另一路输出[main]和[flip]一起传递给overlay,其中第一个输入[main]为主流,第二个输入[flip]是副流,overlay根据参数指定的规则将副流覆盖于主流之上。该命令中overlay的参数为0:H/2,即[flip]左上角对齐[mian]的坐标为(0,H/2)的点进行覆盖,H为[main]的高。

以上为ffmpeg滤镜的基本使用方式。其中有一些命令的格式需要注意:

1、命令中同一个滤镜链中的滤镜之间通过逗号分隔开,如上例中[crop]和[vflip]处于同一个滤镜链,而知以逗号分隔开。

2、不同的滤镜链之间以分号隔开,如上例中[crop]和[vflip]组成的滤镜链与[split]、[overlay]之间。

3、滤镜链的输入输出通过方括号标记命名,若示例中[split]滤镜产生了两路输出,分别被标记为[main]和[tmp]

4、有的滤镜可以指定参数列表,通过在滤镜名后面接一个等号,然后等号后指定需要的参数即可,不同的参数之间需要使用冒号隔开。如示例中[crop]的参数iw:ih/2:0:0

如果仅仅需要尺寸裁切,那么可以单独使用crop命令:

ffmpeg -i testInput.mp4 "crop=cropWidth:cropHeight:cropX:cropY"  testOutput.mp4

其中cropWidth, cropHeight为视频裁切后的长宽,cropX, cropY为视频裁切的左上角。

Tips:

1. 工程中如果需要对视频进行尺寸裁切,那么需要先将源视频解码,解码后的AVFrame作为avfilter的输入,crop字符串作为filter_description,具体实现可以参考FFmpeg源码中的FFmpeg\doc\examples\filtering_video.c文件;

2. 写代码时遇到问题,调试不出来时,可以搭建一下FFmpeg的调试环境,用命令行启动,调试到FFmpeg内部查看变量的值与自己写的代码有何区别。Mac下搭建调试环境:https://www.jianshu.com/p/226c19aa6e42。

部分内容转载自:https://blog.csdn.net/joee33/article/details/51946712

FFMpeg笔记(六) 滤镜命名规则及使用libavfilter对视频尺寸进行裁切的更多相关文章

  1. FFMpeg笔记(五) 录制小视频时几个问题解决

    1. YUV数据在使用avfilter scale时在特定的分辨率下UV分量不对 由于是小视频,那么分辨率不需要太高,但是有的视频源是1080p,甚至有的是4K的,所以对视频源进行scale非常有必要 ...

  2. 每天进步一点点------Allegro PCB命名规则

    PCB命名规则-allegro 一.焊盘命名规则 1. 贴片矩形焊盘  命名规则:SMD+长(L)+宽(W)(mil) 举例:SMD90X60 2. 贴片圆焊盘   命名规则:SMDC+焊盘直径(D) ...

  3. [ExtJS5学习笔记]第六节 Extjs的类系统Class System命名规则及定义和调试

    本文地址: http://blog.csdn.net/sushengmiyan/article/details/38479079 本文作者:sushengmiyan ----------------- ...

  4. thinkphp学习笔记1—目录结构和命名规则

    原文:thinkphp学习笔记1-目录结构和命名规则 最近开始学习thinkphp,在下不才,很多的问题看不明白所以想拿出来,恕我大胆发在首页上,希望看到的人能为我答疑解惑,这样大家有个互动,学起来快 ...

  5. css笔记1: html页面的CSS、DIV命名规则

    原地址:http://www.cnblogs.com/rising-fay/archive/2013/02/25/2932592.html CSS命名规则 头:header 内容:content/co ...

  6. Java学习笔记(基本数据类型和变量命名规则)

    java基本数据类型 变量 1.变量就是可变的量. 2.常量就是不可变的量. 3.字面量:Java的变量和常量中存放的具体的数据成为字面量. 变量 命名规则: (1)首字母是英文字母.$或下划线,由字 ...

  7. CSS学习笔记(7)--html页面的CSS、DIV命名规则

    html页面的CSS.DIV命名规则 CSS命名规则 头:header 内容:content/containe 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整 ...

  8. Java基础笔记(四)——命名规则、数据类型

    标识符即Java程序中需要自定义的名称,如变量名.方法名.类名.包名.工程名等. 标识符的命名规则: 1.可由字母.数字.下划线(_)和美元符($)组成,不能以数字开头. 2.严格区分大小写. 3.不 ...

  9. linux初级学习笔记二:linux操作系统及常用命令,文件的创建与删除和命名规则,命令行展开以及linux中部分目录的作用!(视频序号:02_3)

    本节学习的命令:tree,mkdir,rmdir,touch,stat,rm 本节学习的技能:Linux中主要的目录作用以及特殊的目录文件: 文件的命名规则,命令行展开: 文件的创建与删除: Linu ...

随机推荐

  1. 数据库迁移之从oracle 到 MySQL最简单的方法

    数据库迁移之从oracle 到 MySQL最简单的方法 因工作需要将oracle数据库换到MySQL数据库,数据量比较大,百万级别的数据,表也比较多,有没有一种既快捷又安全的方法呢?答案是肯定的,下面 ...

  2. MySQL基础之---mysqlimport工具和LOAD DATA命令导入文本文件

     1.mysqlimport工具的使用 看一下命令的使用方法: shell > mysqlimport -u root -p [--LOCAL] DBname File [option] --f ...

  3. spark任务调度和资源分配

    Spark调度模式 FIFO和FAIR     Spark中的调度模式主要有两种:FIFO和FAIR.    默认情况下Spark的调度模式是FIFO(先进先出),谁先提交谁先执行,后面的任务需要等待 ...

  4. QT5 视图坐标

    又出错了. . main.obj:-1: error: LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __th ...

  5. luogu P1891 疯狂LCM

    嘟嘟嘟 这题跟上一道题有点像,但是我还是没推出来--菜啊 \[\begin{align*} ans &= \sum_{i = 1} ^ {n} \frac{i * n}{gcd(i, n)} ...

  6. 关于ip判断

    php正则实现ip段判断 $ip = '22.18.10.2'; $arrayip = array('123.12.*.*','22.18.10.*');//ip段 $ipregexp = implo ...

  7. Spark项目之电商用户行为分析大数据平台之(六)用户访问session分析模块介绍

    一.对用户访问session进行分析 1.可以根据使用者指定的某些条件,筛选出指定的一些用户(有特定年龄.职业.城市): 2.对这些用户在指定日期范围内发起的session,进行聚合统计,比如,统计出 ...

  8. Solr建立索引时,过滤HTML标签

    原文地址  http://www.joyphper.net/article/201306/188.html 1.在数据库的读取文件data-config.xml 中的entity 标记里边添加 tra ...

  9. MP实战系列(十三)之批量修改操作(前后台异步交互)

    MyBatis的批量操作其实同MyBatis基本是一样的.并无多大区别,要说区别,除了封装的方法之外,主要就是注解方面的区别,比如@TableId.@TableField.@TableName等等区别 ...

  10. 记录因xen而导致lvs,realserver转发activeconn为0

    8.81----vip,keepalived 8.82----realserver 8.83----realserver 8.84----realserver 在8.81上ipvsadm -Ln的时候 ...