FFmpeg进阶:音视频滤镜概述

文章目录

    • 滤镜示例
    • 滤镜的格式
    • 滤镜语法规则
    • 滤镜图
    • 基于时间的滤镜控制
    • 滤镜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滤镜进行合并输出。
原始视频的效果如下:
FFmpeg进阶:音视频滤镜概述_第1张图片
经过滤镜处理的视频效果如下图所示:
FFmpeg进阶:音视频滤镜概述_第2张图片

滤镜的格式

[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,音视频,流媒体,c++)