文章目录

  • 滤镜示例
  • 滤镜的格式
  • 滤镜语法规则
  • 滤镜图
  • 基于时间的滤镜控制
  • 滤镜API介绍
  • 常用滤镜

FFmpeg的滤镜模块(libavfilter)提供了各种各样的滤镜特效。通过滤镜模块,我们可以实现各种各样的视频效果。这里对FFmpeg滤镜语法进行一下介绍,同时对那些常用的滤镜特效进行了汇总。

滤镜示例

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

滤镜链图中split滤镜把输入流分离成了两路流分别为[main]和[tmp],其中[tmp]路通过crop滤镜裁剪之后的结果被vfilp滤镜进行镜像翻转处理,处理之后的结果输出为[flip],[flip]和另外一路[main]一起通过overlay滤镜进行合并输出。
原始视频的效果如下:

经过滤镜处理的视频效果如下图所示:

滤镜的格式

[in_link_1]...[in_link_N]filter_name=arguments[out_link_1]...[out_link_M]

滤镜语法规则

1.命令中同一个滤镜链中的滤镜之间通过逗号分隔开。
2.不同的滤镜链之间以分号进行分隔。
3.滤镜链的输入输出通过方括号进行标记命名。
4.有的滤镜可以指定参数列表,通过在滤镜名后面接一个等号,然后等号后指定需要的参数即可,不同的参数之间需要使用冒号隔开。
5.如果参数的选项的值是一个列表,那么列表的元素之间通常用“|”分隔开。
6.一个滤镜链中包含一系列顺序连接的滤镜,滤镜之间通过逗号分隔开。一个滤镜图中包含一系列滤镜链,滤镜链之间通过分号分隔。
7.如果一个滤镜的输出端没有关联任何link label,那么它将在滤镜图中往后查找第一个有未关联link label的输入端的滤镜,并与之连接。
8.在写滤镜的命令时,如果没有指定第一个滤镜的输入端,那么将会假设一个“in”作为输入端;如果没有指定最后一个滤镜的输出端,那么将会假设一个“out”作为输出端。
9.一个完整的滤镜链中,所有未关联link lable的输出输入端都必须正常连接。一个有效的滤镜图中所有滤镜链里面的输入端和输出端都必须连接的。

滤镜图

多个滤镜链按照一定的方向连接起来成为滤镜图。滤镜图中可以包含循环,两个滤镜之间也可以同时存在多条连接。每个连接(link)通过一个输入端(input pad)和输出端(output pad),其中输入端从上一个滤镜接收数据,输出端向下一个滤镜输出数据。
滤镜图中的每个滤镜都是注册到应用中的某个类型的滤镜的实例,每种类型的滤镜都定义了它的特点,以及每个实例拥有输入端和输出端的数量。
没有输入端的滤镜称为“源(source)”,没有输出端的滤镜称为“槽(sink)”。

基于时间的滤镜控制

smartblur = enable='between(t,10,3*60)'
//t:时间戳(单位为s),如果时间戳未知,则值为NAN
//n:输出数据帧的序号,从0开始
//pos:输入数据帧在整个文件中的位置,若位置未知则值为NAN
//w、h:输入视频帧的宽和高。
//滤镜还支持enable命令,用于使能这些表达式

滤镜API介绍

//创建滤镜容器
avfilter_graph_allc();
//根据名称找到滤镜
avfilter_get_by_name();
//根据AVFilter创建滤镜上下文
//将新创建的滤镜上下文放到滤镜容器中去
avfilter_graph_create_filter();
//链接两个滤镜上下文
avfilter_link();
//根据传递的字符串语法创建一个或者多个滤镜上下文
//多个滤镜会根据语法自动连接。同时会把新创建的滤镜上下文放进去滤镜容器。
avfilter_graph_parse2();
//正式打开滤镜容器
avfilter_graph_config();
//根据名称获取滤镜容器内部的某个滤镜上下文。
avfilter_graph_get_filter();
//往滤镜上下文发送一AVFrame让滤镜进行处理
av_buffersrc_add_frame_flags();
//从滤镜上下文读取已经处理好的AVFrame
av_buffersink_get_frame_flags();
//FFmpeg里面有两个特殊滤镜 buffer输入滤镜 buffersink输出滤镜。
//一个滤镜容器里面可以有多个buffer输入滤镜实例
//但只能有一个buffersink输出滤镜实例
//输出滤镜的调用关系图
avfilter_graph_dump(filterGraph, NULL);

常用滤镜

滤镜名称 滤镜介绍
crop 根据给定的尺寸对视频画面进行裁剪
drawtext 根据给定的格式在视频画面的特定位置添加文字
drawgrid 在视频的画面上根据设置的参数绘制网格
overlay 将一个视频的视频帧放到另一个视频的视频帧上面,可以用来制作图片水印
rotate 根据指定的参数对视频画面进行旋转操作
scale 根据指定的参数对视频画面进行缩放
vflip 对图像进行镜像翻转
alphaextract 从输入视频中提取出alpha分量,输出为一个灰度视频。
alphamerge 该滤镜有两个输入端,滤镜用第二个输入的灰度值添加或者替换第一个输入的alpha分量。配合alphaextract滤镜,就可以将一个包含alpha分量的视频转换或者保存为没有alpha分量格式的视频。
subtitles 该滤镜调用libass库,将字幕添添加到输入视频中。如果要使用该滤镜,需要在编译FFmpeg时使用–enable-libass配置项。这个滤镜需要配合使用 libavcodec和libavformat将输入的字幕文件转换为ASS格式。
ass ass滤镜与subtitles滤镜一样,都是用于给视频添加字幕。不同之处在于ass不需要依赖libavcodec和libavformat,且只能处理ASS格式的字幕文件。
atadenoise 提供一个自适应时域平均降噪器(Adaptive Temporal Averaging Denoiser)给输入视频
bbox 计算输入帧的亮度平面中非黑色像素的边界框
blackdetect 检查视频中纯黑色画面的时间段。在检查视频中的过渡片段、广告或者非法数据等黑屏画面时很有效。输出数据包含黑屏片段的起始点,以及黑屏时长,单位为秒。
blackframe 检测全黑的视频帧。在检查视频中的过渡片段、广告等黑屏画面时很有效。输出包括被检查帧的帧号、视频帧中黑色的百分比、视频帧在文件中的位置、视频帧的时间戳(精确到s)。
blend, tblend 将两个视频帧重叠在一起,blend接受两个输入流,将第一个流叠加到第二个输入流上,然后输出混合后的图像。当有一个输入流结束时,操作停止。Tblend(time blend)以一个流的连续两个帧为输入,并将新的一帧叠加到旧的一帧上作为结果输出。
boxblur 对输入视频使用均值模糊算法进行过滤。现在很火的直播中的美颜功能,也是通过模糊算法对图像进行处理的。
bwdif 反隔行扫描输入视频。动态自适应去隔行操作以yadif滤镜为基础,使用w3fdif滤镜以及(cubic interpolation algorithms)立方插值算法来实现。
chromakey 色键滤镜。色键合成技术是指将前景图像的背景设置为一种纯色(蓝色、绿色)的幕,其色调有极大的高饱和度彩色,与前景图像中的事务形成鲜明区别。后期的处理中利用这个差别抠出前景图中的事物,再将抠出的事物图像置于需要的背景图像上,得到完整的合成画面。该滤镜可以将图像中的指定颜色部分的像素替换为透明。
ciescope 将输入图像的像素点显示到ICE色度图的对应位置上。
codecview 将编解码器导出的信息可视化。
colorbalance 修改输入帧中主色(红、绿、蓝)的强度。该滤镜可以调整输入帧的阴影、中间色调、亮度来平衡红-蓝绿、绿-品红、蓝-黄等颜色。取正值时,调整平衡向主色靠近;取负值时调整平衡想补色靠近。

FFmpeg进阶:音视频滤镜概述相关推荐

  1. FFmpeg进阶: 音视频常用开源库

    文章目录 多媒体处理 FFmpeg Gstreamer libav 流媒体传输 WebRTC Live555 开源播放器 ijkplayer exoplayer vlc 编解码 av1 vp8.vp9 ...

  2. FFmpeg Android 学习(一):Android 如何调用 FFMPEG 编辑音视频

    一.概述 在Android开发中,我们对一些音视频的处理比较无力,特别是编辑音视频这部分.而且在Android上对视频编辑方面,几乎没有任何API做支持,MediaCodec(硬编码)也没有做支持.那 ...

  3. 音视频开发——概述(含TUTK demo iOS)

    开发一款播放器,难不难,要怎么做?想必每个进入到音视频领域的新人都有这样的疑问. 如果仅仅是完成项目,可以说很简单.对于iOS开发人员,网上有不少的开源播放器,如kxmovie.ikjplayer,g ...

  4. 【FFmpeg】使用 FFmpeg 处理音视频格式转换流程 ( 解复用 | 解码 | 帧处理 | 编码 | 复用 )

    FFmpeg 系列文章目录 [FFmpeg]Windows 搭建 FFmpeg 命令行运行环境 [FFmpeg]FFmpeg 相关术语简介 [FFmpeg]FFmpeg 相关术语简介 二 [FFmpe ...

  5. 使用ffmpeg打印音视频的详细信息

    使用ffmpeg打印音视频的详细参数非常简单,仅仅需要三个函数接口实现: /*所有进行操作前,先执行以下,否则需要自己制定类型*/av_register_all/*Open an input stre ...

  6. FFMPEG开源音视频项目学习汇总

    ~非常感谢雷霄骅老师的无私帮助,本文转载自:http://blog.csdn.net/leixiaohua1020/article/details/42658139~       本文汇总一下自己视音 ...

  7. C# 调用FFmpeg处理音视频的示例

    FFmpeg 开源.跨平台.体积小.功能强大,提供了录制.转换以及流化音视频的完整解决方案. 官网:https://www.ffmpeg.org/ 百科:https://baike.baidu.com ...

  8. javaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装了FFmpeg的音视频操作?

    JavaCV入门指南系列: JavaCV入门指南:序章(看完本章后,不想看原理的小伙伴可直接跳转到<快速上手篇>) JavaCV入门指南:调用FFmpeg原生API和JavaCV是如何封装 ...

  9. linux下ffmpeg采集音视频设备

    Linux下查看音视频设备 1.视频输入设备: 命令查看:ls /sys/class/video4linux/ 执行结果如下: 如果系统存在video4linux文件夹说明已安装过视频驱动,video ...

最新文章

  1. angularjs post 跨域
  2. Spring与Hibernate两种组合方式
  3. Ubuntu下 5步安装nginx记录
  4. 如何使用mock应对测试所需随机数据
  5. sql 2008 每次打开一个表都要登录_如何实现一个简易的orm
  6. 中芯国际科创板IPO最新招股意向书:7月7日网上申购
  7. AlexNet,VGG,GoogleNet,ResNet
  8. gzdeflate函数_PHP中的gzcompress、gzdeflate、gzencode函数详解_php实例
  9. java(7)LinkedList源码
  10. 从未在一起更让人遗憾_从未在一起和最终没有在一起,哪个更遗憾?
  11. Qt--QTablewidgets 表格插入图片,且可以自动调整图片的大小
  12. Python实现统一社会信用代码合法性校验
  13. 最小二乘法拟合二次曲线 C语言
  14. 关于 DRM 中 DUMB 和 PRIME 名字的由来
  15. 100种运营人必备工具(网站搜集)
  16. windwos powershell
  17. php apc.dll,php_apc.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家
  18. 静态分析工具综述:Roodi、Rufus、Reek和Flay
  19. 【2015DTCC】京东分布式缓存与高速NoSQL服务
  20. 信号与系统复习归纳(十一):Z变换+例题

热门文章

  1. ctf镜子里面的世界_通过机械装置,这名艺术家把木头和玩偶做成了“镜子”
  2. 一步一步实战HTML音乐播放器
  3. 使用MDB查看变量的值(2)
  4. docker centos + pbx
  5. 东北育才 d1t4 漂流
  6. 2015年c语言等级考试题1 10 2分,全国计算机等级考试二级c语言真题题库1+2015年9月.docx...
  7. 追忆第一次南下深圳有哪些重大抉择(二)?
  8. 定时任务组件Quartz
  9. 翻转——C++青少年一级考资料
  10. 6、基带信号的发送和接收