在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. Django2.0路由层-URLconf

    目录 DJango2.0路由层-URLconf 概述 urlpatterns 实例 path转换器 自定义path转换器 使用正则表达式 命名组(有名分组) URLconf匹配请求URL中的哪些部分 ...

  2. spring mvc 接收 put参数

    web.xml中: <!-- 用户put提交参数 --> <filter> <filter-name>HttpMethodFilter</filter-nam ...

  3. Linux运维之--zabbix使用(实时更新)

    之前安装的是zabbix3.x版本,今天尝试安装zabbix4.2版本,并做个总结.建议生产环境还是使用3.4版本比较好,因为4.2版本上可能语法又增加了一些,所以建议使用熟练的版本 1.首先是安装z ...

  4. Linux启动一个服务后,服务的某个文件所在的目录下出现类似:systemd-private.xxxxxx的目录

    Linux的目录下面形如: [root@:vg_adn_tidbCkhsTest:172.31.17.203 /var/lib/mysql]#ll /tmp total drwxr root root ...

  5. Alpha冲刺报告(10/12)(麻瓜制造者)

    今日已完成 邓弘立: 实现了登录的所有功能 符天愉: 有点事没有参与冲刺- 江郑: 刘双玉: 写商品下架接口说明的时候,就发现一个bug,因为私人原因中间离开了很长时间,最后修改完成就很晚了. 困难: ...

  6. linux 的常用命令---------第八阶段

            raid 磁盘阵列-------raid 0     raid1                              raid5      raid10 mdadm 命令常用参数 ...

  7. apache,R,P,url重写,伪静态,反向代理

    需求: 1,浏览器地址栏中URL不变 2,伪静态重写生效 ===================== <VirtualHost *> ServerName xinwen.888.com.c ...

  8. multi-voltage design apr

    在先进制程中,为了降低芯片功耗,经常会采用 muti-voltage design,在一颗芯片内部划分出多个 power domain,不同 domain 采用不同的电压,有时候还会将其中某些 pow ...

  9. python_基础硬件知识

    通过学习这一篇章的内容,回顾了<数字逻辑><计算机组成原理><操作系统> 这几门课的相关知识 有时候,总是要了解一些基本,才能更容易理解程序 以下是我的一些听课记录 ...

  10. Java基础系列篇:JAVA多线程 并发编程

    一:为什么要用多线程: 我相信所有的东西都是以实际使用价值而去学习的,没有实际价值的学习,学了没用,没用就不会学的好. 多线程也是一样,以前学习java并没有觉得多线程有多了不起,不用多线程我一样可以 ...