2020 FFmpeg 滤镜详解

2020-09-09 10:32:59 浏览数 (1)

1. 概念介绍

在多媒体处理中,术语滤镜(filter)指的是修改未编码的原始音视频数据帧的一种软件工具。

2. 基本原理

● 在编码前,ffmpeg可以对raw(真实/原)音频和视频使用libavfilter库中的滤镜进行处理。(非压缩数据帧) ● 多个滤镜可以组成滤镜链图(滤镜链图filtergraphs )。 ● 在ffmpeg看来只有2种滤镜:简单滤镜,复合滤镜。

2.1 简单滤镜

简单滤镜就是只有1个输入和输出的滤镜,滤镜两边的数据都是同一类型的,可以理解为在非压缩数据帧到再次编码前简单附加了一步:

2.2 复合滤镜

complex filtergraph,通常是具有多个输入输出文件,并有多条执行路径;ffmpeg命令行中使用-lavfi、-filter_complex,基本原理图如下:

复合滤镜复合滤镜

2.3 原理示例

在libavfilter, 一个filter可以包含多个输入、多个输出。下图是一个filtergraph的示例:

原理示意图原理示意图

        在这个滤镜链图中,利用split滤镜把输入流分离成了两路流,其中一路通过crop滤镜和vfilp滤镜的同一路级联应用,再同另外一路一起通过overlay滤镜处理的流合成进行输出。则可以采用如下的命令行实现:         这个filtergraph可以用下面命令行表示: ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT         这样最终输出将是视频上部是原始,下部是上部的镜像。(倒影效果) ffplay -i Irving_360p.mp4 -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2"         同一路的滤镜间用逗号(‘,’)进行分割,不同路的滤镜间用分号(‘;’)进行分割。

        在这个例子里面crop和vflip是在同一路中的滤镜,split和overlay则不是同一路的(同一路的级联是对连续的视频进行,如果涉及到一输多、多输一或者多输多则都不是在同一路的,即不是同一路级联)。可以通过在方括号(’[]’)中的标签名来命名处理的链路。这个例子里,split滤镜生成了两路就通过[main]和[tmp]进行了标签命名以方便后续处理。         其中被split处理输出的第二路流被命名为[tmp],它又被crop滤镜处理裁去下半部视频,然后通过vflip进行了水平镜像(垂直翻转,即把视频镜像到下半部了)。这是整个输出被命名为flip。再把[main]与flip通过overlay进行覆盖合成,即把源输入通过split滤镜获得的[main]的上半部分覆盖到由crop和vflip滤镜级联处理的输出(这里的[flip])上最终得到了镜像结果。         一些滤镜支持参数列表: 滤镜名=由冒号(‘:’)隔开的多个参数

2.4 例子

        比如视频缩放、截取、翻转、叠加、模糊等。其中定义了很多的filter,例如以下常用的一filter。 缩放 ffplay -i good.mp4 -vf scale=iw/2:ih/2 叠加 ffmpeg -i good_scale.mp4 -i mark.png -filter_complex overlay=main_w-overlay_w-10:main_h-overlay_h-10 good_mark.mp4 裁剪 ffplay -i good_scale.mp4 -vf crop=w=200:h=200:x=100:y=0 截取视频 ffmpeg -i good_scale.mp4 -vf trim=10:30 good_trim.mp4 模糊 ffplay -i good.mp4 -vf boxblur=luma_radius=2:luma_power=1 边缘检测 ffplay -i good_scale.mp4 -vf "edgedetect=low=0.1:high=0.4"

3. Filter的语法

        一个滤镜链图(filtergraph)是连接滤镜的有向图。它可以包含循环动作,也可以在多个滤镜间形成链路,每个链接都有一个连接到滤镜的输入和一个连接到滤镜的输出。(参考)

        滤镜链图采用文本表示,其有由一些ffmpeg和ffplay通用的选项-filter/-vf/-af和-filter_complex(ffmpeg)以及-vf/-af(ffplay)外加定义与libavfilter/avfilter.h的avfilter_graph_parse_ptr()等来描述。

(1)一个滤镜链包含序列链接起来的滤镜,这个序列由“,”分隔各个滤镜描述; (2)一个滤镜链图包含序列滤镜链,这个序列有“;”分隔各个滤镜链描述

原理图原理图

一个滤镜由一个字符串表单表示: [input_link_lable1][input_link_lable2]... filter_name=parameters [output_link_lable1][output_link_lable12]...

(1) 输入输出都有连接标号(link lable),连接符号是可选项,在滤镜名和参数前 和 后 有一个连接标签列表。一个连接标签允许命名1个名字的连接,其作为滤镜的输入或者输出端口。 如果一个输出端没有命名标签,它默认连接到滤镜链上后面滤镜中第一个没有命名标签的输入端

(2) filter_name是滤镜类名字

(3) =arguments用于指定滤镜选项:参数表示法如下规则         (3.1)“:”分隔的key=value列表 举个例子:ffplay -i good.mp4 -vf scale=iw/2:ih/2         (3.2)一个“:”分隔的列表value值,在这种情况下,键(key)假定为选项名声明顺序 举个例子:ffplay -i good_scale.mp4 -vf fade=in:0:30(淡入视频的前30帧),按顺序声明了3个选项type、start_frame和nb_frames         (3.3)上面两个规则混用         (3.4)如果选项的值本身就是一个列表(例如format滤镜有一个像素格式列表选项),则这种列表通常用“|”分隔 举个例子:将输入视频转换为列表中的任何格式 ffmpeg -i good_scale.mp4 -vf "format=pix_fmts=yuv420p|yuv444p|yuv410p" format.mp4

4. 功能工具

4.1 工具graph2dot

FFmpeg工具目录下包含一个graph2dot程序可以用来分析滤镜链图描述并产生用dot语言描述的对应文本表示。 命令:dot -Tpng graph.tmp -o graph.png 描述文件:graph.tmp

描述描述

生成图:

生成图生成图

下载链接https://graphviz.org/download/

github的地址https://github.com/jrfonseca/gprof2dot.git

更多例子见附录的参考。

4.2 时间线编辑

        一些滤镜支持常规的enable选项。对于支持时间线编辑的滤镜,这个选项可以被设置为一个表达式,其通过评估之前的情况来决定是否把帧画面发送给滤镜。

        例如,要在1秒到20秒允许一个blur(模糊)滤镜(smartblur),然后curves滤镜在3秒之后:         ffplay -i good_scale.mp4 -vf "smartblur=enable='between(t,1,20)',curves=enable='gte(t,3)':preset=cross_process"

4.3 实时更新Filter参数

        在过滤器操作期间,可以使用命令更改某些选项。 这些选项在ffmpeg -h filter = <过滤器名称>的输出上标记为“ T”。命令的名称是选项的名称,参数是新值。

4.4 帧同步

一些具有多个输入的过滤器支持一组通用选项。 (1) eof_action(在secondary input上遇到EOF时采取的措施) repeatendallpass (2)shortest(如果设置为1,则在最短输入终止时强制输出终止。预设值为0。) (3)repeatlast(如果设置为1,则强制过滤器将辅助流的最后一帧扩展到主流的末尾。值为0禁用此行为。预设值为1。)

5. Filter命令详解

source filter(仅输出)、sink filter(仅输入)

5.1 命令分类

(1) audio filter         (1.1)Audio Base         (1.2)Audio Sources         (1.3)Audio Sinks (2) video filter         (2.1)Base Video Filters         (2.2)OpenCL Video Filters         (2.3)VAAPI Video Filters         (2.4)Video Sources         (2.5)Video Sinks (3)Multimedia filter         (3.1)Multimedia         (3.2)Multimedia Sources

5.2 Audio Base(96)

8.1 acompressor (压缩器主要用于减小信号的动态范围,调整响度db) 8.2 acontrast (简单的音频动态范围压缩/扩展滤波器。) ps:音响的动态范bai围是指音响设备重放du时最大不失真输出功率与静态时系统zhi噪音输出功dao率之比的对数。单位为分贝(dB)。一般性能较好的音响系统的动态范围在100(dB)以上。 8.3 acopy (将输入音频源原样复制到输出。这主要用于测试目的。) 8.4 acrossfade(将交叉淡入淡出从一个输入音频流应用于另一输入音频流。交叉淡入淡出将在第一个流的结尾附近的指定持续时间内应用。) ffmpeg -i ca.mp3 -i see.mp3 -filter_complex acrossfade=d=10:c1=exp:c2=exp output.mp3 8.5 acrossover(将音频流分成几个频段。该滤波器将音频流分成两个或多个频率范围。) sub bass[20~65hz]这里是显示声音力量感的频段 Bass[65~250hz]定义声音肥瘦 节奏根音大都在在这个频段 提高250hz左右的频段可以在不影响清晰度的情况下给低频增加温暖感 中频[250~2000hz]决定了一个乐器有多突出 提升1000hz的频段可以给乐器增加质感 但这个频段过多使人感觉不适可能导致听觉疲劳 中高频[2000~6000hz]人耳对这个频段尤其敏感 即使提升很小的量 也会给声音造成质变 对这个频段需要小心处理 高频[6000~10000hz]这个频段可以听到一些刺耳的声音 提高这个频段可以增加明亮感 降低这个频段增加温暖感 8.6 acrusher(降低音频位分辨率。用于减少音频信号的采样位数。使声音柔和) 8.7 acue(延迟音频过滤,直到给定的墙上时钟时间戳。) 8.8 adeclick (消除输入音频中的脉冲噪声。) 8.9 adeclip (从输入音频中删除剪辑的样本。) 8.10 adelay (延迟一个或多个音频通道。) ffplay -i ca.mp3 -af "adelay=1500|0|500" 8.11 aderivative, aintegral (计算音频流的导数/积分。) 8.12 aecho (将回声应用于输入音频。) 更长的延迟听起来像山区的露天音乐会(输入增益:输出增益:延迟:衰变) ffplay -i ca.mp3 -af "aecho=0.8:0.9:1000:0.3" 8.13 aemphasis(音频强调过滤器可以创建或恢复直接从具有不同过滤器曲线的LP或重点CD中获取的素材。先通过滤波器更改信号,以消除该记录介质的缺点。) 8.14 aeval(根据指定的表达式修改音频信号。) 采样率、输入输出通道数、音量等 ffplay -i ca.mp3 -af "aeval=val(ch)/5:c=same"(音量减小到1/5) 8.15 afade(将淡入/淡出效果应用于输入音频。) ffplay -i ca.mp3 -af "afade=t=in:ss=0:d=15" (淡入15秒) 8.16 afftdn(使用FFT对音频样本进行除噪。) 8.17 afftfilt(将任意表达式应用于频域中的样本) 在音频中几乎只保留低频 ffplay -i ca.mp3 -af afftfilt="'real=re * (1-clip((b/nb)b,0,1))':imag='im * (1-clip((b/nb)b,0,1))'" 8.18 afir (应用任意的有限冲激响应滤波器。可用作数字分频器滤波器,房间均衡,串扰消除,波场合成,听觉化,歧义,歧义和空间化的组件。) 8.19 aformat (设置输入音频的输出格式约束。该框架将协商最合适的格式以最​​大程度地减少转化。) 8.20 agate(门控主要用于减少信号的过低。这种信号处理可减少有用信号之间的干扰噪声。) 8.21 aiir(应用任意的无限冲激响应滤波器。) 在5000Hz左右施加2极椭圆形陷波,采样率为48000 Hz ffplay -i ca.mp3 -af "aiir=k=1:z=7.957584807809675810E-1 -2.575128568908332300 3.674839853930788710 -2.57512875289799137 7.957586296317130880E-1:p=1 -2.86950072432325953 3.63022088054647218 -2.28075678147272232 6.361362326477423500E-1:f=tf:r=d" 8.22 alimiter(限幅器可防止输入信号超过所需的阈值。) 8.23 allpass(全通滤波器可更改音频的频率与相位关系,而不会更改其频率与振幅关系。) 8.24 aloop (循环音频样本。) 8.25 amerge(将两个或多个音频流合并为一个多通道流。) 8.26 amix(将多个音频输入混合为一个输出。) 8.27 amultiply(将第一音频流与第二音频流相乘,并将结果存储在输出音频流中。通过将来自第一流的每个样本与来自第二流的相同位置的样本相乘来完成乘法。) 8.28 anequalizer(每个通道的高阶参数多频带均衡器。) 8.29 anlmdn(使用非本地均值算法减少音频样本中的宽带噪声。) 8.30 anlms(使用第二个音频流将标准化的最小均方算法应用于第一个音频流。) 8.31 anull(将未更改的音频源传递到输出。) 8.32 apad(用静音填充音频流的结尾。) 8.33 aphaser(向输入音频添加定相效果。) 8.34 apulsator(音频脉冲发生器介于自动调音台和颤音之间。但是它也可以产生有趣的立体声效果。) 8.35 aresample(使用libswresample库将输入音频重新采样为指定的参数。使用libswresample库将输入音频重新采样为指定的参数。) ffplay -i ca.mp3 -af aresample=44100 8.36 areverse(反转音频剪辑。) 8.37 arnndn(使用递归神经网络减少语音噪声。需要模型文件) 8.38 asetnsamples(设置每个输出音频帧的样本数。) 8.39 asetrate(在不更改PCM数据的情况下设置采样率。这将导致速度和螺距的变化。) 8.40 ashowinfo(显示一行,其中包含每个输入音频帧的各种信息。输入音频未修改。) 8.41 asoftclip(应用音频软剪辑。) 8.42 asr(自动语音识别,需要模型) 8.43 astats(显示有关音频通道的时域统计信息。计算并显示每个音频通道的统计信息,并在适用的情况下还提供总体数字。) 8.44 asubboost(提高低音炮频率。) 8.45 atempo(调整音频速度。) ffplay -i ca.mp3 -af atempo=3 8.46 atrim(修剪输入,以便输出包含输入的一个连续子部分。) 删除除输入第二分钟外的所有内容 ffmpeg -i INPUT -af atrim=60:120 ffmpeg -i ca.mp3 -af atrim=5:30 ca_trim.mp3 8.47 axcorrelate(计算两个输入音频流之间的归一化互相关。) 8.48 bandpass 8.49 bandreject 8.50 bass, lowshelf(使用两极置物架滤波器来增强或削减音频的低音(较低)频率,其响应类似于标准高保真音调控制。这也称为搁架均衡(EQ)。) 8.51 biquad(应用具有给定系数的双二阶IIR滤波器。) 8.52 bs2b(鲍尔(Bauer)立体声转换为双耳,可改善立体声音频记录的耳机收听效果。) 8.53 channelmap(将输入通道重新映射到新位置。) 8.54 channelsplit(将每个通道从输入音频流拆分为单独的输出流。) 8.55 chorus(向音频添加合唱效果。) 具有三个延迟的更丰富的合唱: ffplay -i ca.mp3 -af "chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3" 8.56 compand(压缩或扩展音频的动态范围。) 使音乐既安静又响亮,适合在嘈杂的环境中收听 ffplay -i ca.mp3 -af "compand=.3|.3:1|1:-90/-60|-60/-40|-40/-30|-20/-20:6:0:-90:0.2" 8.57 compensationdelay(补偿延迟线是基于度量的延迟,用于补偿麦克风或扬声器的不同位置。) 8.58 crossfeed(应用耳机交叉馈电过滤器。) 8.59 crystalizer(扩展音频动态范围的简单算法。) 8.60 dcshift(对音频应用直流偏移。) 8.61 deesser(测对音频样本进行de-essing处理。) 8.62 drmeter(测量音频动态范围。) 8.63 dynaudnorm(动态音频规范化器。) 8.64 earwax(使音频更易于在耳机上收听。) 8.65 equalizer(应用两极峰均化(EQ)滤波器。) 8.66 extrastereo(线性增加左右声道之间的差异,从而在播放中增加某种“实时”效果) 8.67 firequalizer(使用任意频率响应进行FOR均衡。) 8.68 flanger(对音频应用镶边效果。) 8.69 haas(将哈斯效果应用于音频。) 8.70 hdcd(解码高清兼容数字(HDCD)数据。具有嵌入式HDCD代码的16位PCM流被扩展为20位PCM流) 8.71 headphone 8.72 highpass 8.73 join(将多个输入流合并为一个多通道流。) 8.74 ladspa(加载LADSPA(Linux音频开发人员的简单插件API)插件。要启用此过滤器的编译,您需要使用--enable-ladspa配置FFmpeg。) 8.75 loudnorm 8.76 lowpass(应用点频为3dB的低通滤波器。) 8.77 lv2 8.78 mcompand 8.79 pan 8.80 replaygain 8.81 resample 8.82 rubberband 8.83 sidechaincompress 8.84 sidechaingate 8.85 silencedetect(检测音频流中的静音。) 8.86 silenceremove(消除音频开头,中间或结尾的静音。) 8.87 sofalizer 8.88 stereotools 8.89 stereowiden 8.90 superequalizer 8.91 surround 8.92 treble, highshelf 8.93 tremolo 8.94 vibrato 8.95 volume(调整输入音频音量。) 8.96 volumedetect(检测输入视频的音量。)

stereo双声道、mono单声道

5.3 Audio Sources(输出9)

9.1 abuffer(缓冲音频帧,并使它们可用于过滤器链。该资源主要用于编程用途,尤其是通过libavfilter / buffersrc.h中定义的接口。) 9.2 aevalsrc(生成表达式指定的音频信号。) 生成频率为440 Hz的正弦信号,将采样率设置为8000 Hz ffplay -f lavfi aevalsrc="sin(4402PI*t):s=8000" 产生白噪声 aevalsrc="-2 random(0)" 9.3 afirsrc(使用频率采样方法生成FIR系数。) 9.4 anullsrc(空音频源,返回未处理的音频帧。它主要用作模板并在分析/调试工具中使用,或用作忽略输入数据的过滤器(例如sox合成过滤器)的来源。) 9.5 flite(使用libflite库合成语音。要启用此过滤器的编译,您需要使用--enable-libflite配置FFmpeg。) 9.6 anoisesrc(产生噪音音频信号。) ffplay -f lavfi anoisesrc=d=60:c=pink:r=44100:a=0.5 9.7 hilbert(生成奇抽头希尔伯特变换FIR系数。) 9.8 sinc(生成Sinc Kaiser窗式低通,高通,带通或带阻FIR系数。) 9.9 sine(生成由振幅为1/8的正弦波组成的音频信号。)

5.4 Audio Sink(输入2)

10.1 abuffersink(缓冲音频帧,并使它们可用于过滤器链的末尾。该接收器主要用于编程用途,尤其是通过libavfilter / buffersink.h或选项系统中定义的接口。) 10.2 anullsink(空音频接收器;输入音频绝对不做任何事情。它主要用作模板并用于分析/调试工具。)

5.5 单输入音频过滤处理流程

音频解码后,可以avfilter api对解码出来的AVFrame进行效果处理,如音量调节,变速处理。多个音频输入还可以进行混音处理单输入过滤器解码流程 解码出

AVFrame -> abuffer-> 其他过滤器(volume)...->aformat->abuffersink->过滤后的AVFrame

这里看到有三个通用的过滤器,abuffer,aformat,abuffersink。abuffer用于接收输入frame,形成待处理的数据缓存,abuffersink用于传出输出Frame,aformat过滤器约束最终的输出格式(采样率,声道数,存储位数等),这三个不可缺少。而中间的其他过滤器可以串联多个filter,如volume,atempo

5.6 Base Video Filters(245)

比如视频缩放、截取、翻转、叠加、模糊等。其中定义了很多的filter,例如以下常用的一filter。

  • scale:视频/图像的缩放(libswscale, 强制原输入的高宽比)(https://ffmpeg.org/ffmpeg-filters.html#scale-1)

(1)ffplay -i good.mp4 -vf scale=640:360

(2)ffplay -i good.mp4 -vf scale=iw/2:ih/2

(3)ffmpeg -i mark.png -vf scale=iw2:ih2 mark_scale.png

  • overlay:视频/图像的叠加(https://ffmpeg.org/ffmpeg-filters.html#overlay-1)
  1. ffmpeg -i good_scale.mp4 -i mark.png -filter_complex overlay good_mark.mp4
  2. ffmpeg -i good_scale.mp4 -i mark.png -filter_complex overlay=main_w-overlay_w-10:main_h-overlay_h-10 good_mark.mp4
  • crop:视频/图像的裁剪(https://ffmpeg.org/ffmpeg-filters.html#crop)
  1. 裁剪尺寸为200x200的中央输入区域

ffplay -i good_scale.mp4 -vf crop=200:200

  1. 裁剪长宽200x200,位置(100,0)左上角起始

ffplay -i good_scale.mp4 -vf crop=w=200:h=200:x=100:y=0

  1. 从左右边界裁剪10个像素,从上下边界裁剪20个像素

ffplay -i good_scale.mp4 -vf crop=in_w-210:in_h-220

  1. 应用颤抖效果

ffplay -i good_scale.mp4 -vf "crop=in_w/2:in_h/2:(in_w-out_w)/2 ((in_w-out_w)/2)sin(n/10):(in_h-out_h)/2 ((in_h-out_h)/2)sin(n/7)"

  • trim:截取视频的片段(https://ffmpeg.org/ffmpeg-filters.html#trim)
  1. 截取视频10s到30s的内容,这里音频还在

ffmpeg -i good_scale.mp4 -vf trim=10:30 good_trim.mp4

  • rotate:以任意角度旋转视频(https://ffmpeg.org/ffmpeg-filters.html#rotate)

(1)顺时针旋转输入PI / 6弧度

ffplay -i good_scale.mp4 -vf rotate=PI/6

(2)从PI / 3的角度开始,以周期T进行恒定旋转(T=10就是10s)

ffplay -i good_scale.mp4 -vf "rotate=PI/3 2PIt/T:fillcolor = red"

(3)使输入视频旋转以T秒的周期和A弧度的幅度振荡(A = 5, T = 10)

ffplay -i good_scale.mp4 -vf rotate=Asin(2PI/T*t)

  • 左右翻转(https://ffmpeg.org/ffmpeg-filters.html#hflip)

ffplay -i Irving_360p.mp4 -vf "crop=iw/2:ih:0:0,split[left][tmp];[tmp]hflip[right];[left][right] hstack"

  • 上下翻转(https://ffmpeg.org/ffmpeg-filters.html#vflip)

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

  • 模糊(https://ffmpeg.org/ffmpeg-filters.html#boxblur)

ffplay -i good.mp4 -vf boxblur=luma_radius=2:luma_power=1

  • colorchannelmixer 可以设置rgba四个分量的变换关系,共接受16个参数

rrrgrbragrgggbgabrbgbbbaaragabaa

参数本质就是加权求值时候的权重,每个参数接受0-1得值,滤镜本

质是将每个颜色值加权求值.公式:red=redrr bluerb greenrg alphara 。green/blue和alpha同理。参数默认值对应得是1,其他为0.如:rr,rg,rb,ra。其中rr默认为1,其他为0。

ffplay -i good_scale.mp4 -vf "colorchannelmixer=.3:.4:.3:0:.3:.4:.3:0:.3:.4:.3"

之所以会是灰阶效果,原因是将每个颜色分量相等,所以rgb混合后为透明度不同得黑色

褐色处理:

ffplay -i good_scale.mp4 -vf "colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131"

  • edgedetect 边缘检测

感觉这个最好还是当作中间操作来用,因为单纯过这个滤镜并不会有什么美感,但是边缘检测却是实现其他操作的必经之路,比如:油画效果,动画片效果等等。

ffplay -i good_scale.mp4 -vf "edgedetect=low=0.1:high=0.4"

添加油画效果

ffplay -i good_scale.mp4 -vf "edgedetect=mode=colormix:high=0"

  • geq 功能特别强大,因为它不仅仅因为它接受的参数众多,而且表达式也很多,所以可以动态的设置很多东西,甚至可以跟播放进度产生关系,进而达到视频闪烁的效果。

根据像素位置修改RGB分量

ffplay -i good_scale.mp4 -vf "geq=r='X/Wr(X,Y)':g='(1-X/W)g(X,Y)':b='(H-Y)/H*b(X,Y)'"

5.7 OpenCL Video Filters(17)

要启用这些过滤器的编译,需要使用--enable-opencl配置FFmpeg。运行OpenCL筛选器要求您初始化硬件设备,并将该设备传递给任何筛选器图中的所有筛选器。

由于OpenCL过滤器无法访问普通内存中的帧数据,因此所有帧数据需要先上传(hwupload)到连接到适当设备的硬件表面,然后再使用,然后再下载(hwdownload)回到普通存储器。请注意,hwupload将以与软件框架相同的布局上载到表面,因此可能有必要在将输入转换为正确格式之前立即添加格式过滤器,并且hwdownload不支持输出中的所有格式-这可能必须在图表后立即插入一个附加的格式过滤器,以获取受支持格式的输出。

12.1 avgblur_opencl

12.2 boxblur_opencl

12.3 colorkey_opencl(RGB色彩空间颜色键控。)

12.4 convolution_opencl(应用3x3、5x5、7x7矩阵的卷积)

12.5 erosion_opencl(对视频应用腐蚀效果。)

12.6 deshake_opencl(基于特征点的视频稳定滤波器。防抖)

12.7 dilation_opencl(将膨胀效果应用于视频。)

12.8 nlmeans_opencl(通过OpenCL的非本地均值降噪过滤器)

12.9 overlay_opencl(将一个视频叠加在另一个视频上。)

12.10 pad_opencl(将填充物添加到输入图像,并将原始输入放置在提供的x,y坐标处。)

12.11 prewitt_opencl

12.12 program_opencl(使用OpenCL程序过滤视频。)

12.13 roberts_opencl

12.14 sobel_opencl(应用Sobel运算符,边缘检测用的算子)

12.15 tonemap_opencl(通过色调映射执行HDR(PQ / HLG)到SDR的转换。)

12.16 unsharp_opencl(锐化或模糊输入视频。)

12.17 xfade_opencl(使用OpenCL交叉淡化具有自定义过渡效果的两个视频。)

5.8 VAAPI Video Filters(Video Acceleration API)

针对Intel CPU X86架构平台,可采用FFmpeg VAAPI的硬解方案。其中,FFmpeg用于处理各种格式的视频解码;VAAPI则提供对硬件加速视频处理的访问,处理流程图如下。

image

VAAPI视频过滤器通常与VAAPI解码器和VAAPI编码器一起使用。以下是VAAPI视频过滤器的说明。要启用这些过滤器的编译,您需要使用--enable-vaapi配置FFmpeg

5.9 Video Sources(10)

(1)cellauto 创建由基本元胞自动机生成的模式。

ffplay -f lavfi -i cellauto=ratio=2/3:s=200x200

(2)mptestsrc 生成由MPlayer测试过滤器生成的各种测试模式。

ffplay -f lavfi -i mptestsrc=t=dc_luma

(3)life 生成细胞动态模式。

ffplay -f lavfi -i life=s=300x200:mold=10:r=60:ratio=0.1:death_color=#C83232:life_color=#00ff00,scale=1200:800:flags=16

5.10 Multimedia Filter(30)

用于音频转为视频的显示(频率等),

16.1 abitscope(将输入音频转换为视频输出,显示音频位范围。)

16.2 adrawgraph(使用输入的音频元数据绘制图形。)

16.3 agraphmonitor

16.4 ahistogram(将输入音频转换为视频输出,显示音量直方图。)

16.5 aphasemeter(测量输入音频的相位,将其导出为元数据l)

16.6 avectorscope(将输入音频转换为视频输出,代表音频矢量范围。)

ffplay -f lavfi "amovie=ca.mp3, asplit [a][out1]; [a] avectorscope=zoom=1.3:rc=2:gc=200:bc=10:rf=1:gf=8:bf=7 [out0]"

16.7 bench, abench(筛选器的基准部分。)

16.8 concat(连接音频和视频流,一个接一个地将它们连接在一起。该过滤器适用于同步视频和音频流的片段。所有段的每种类型必须具有相同数量的流,并且这也将是输出中的流数量。)

16.9 ebur128

16.10 interleave, ainterleave(临时交错来自多个输入的帧。)

16.11 metadata, ametadata

16.12 perms, aperms

16.13 realtime, arealtime

16.14 select, aselect(选择要传递的帧。)

16.15 sendcmd, asendcmd

16.16 setpts, asetpts(更改输入帧的PTS(演示时间戳记)。)

16.17 setrange

16.18 settb, asettb

16.19 showcqt(将输入音频转换为代表频谱的视频输出)

ffplay -f lavfi "amovie=ca.mp3, asplit [a][out1]; [a] showcqt [out0]"

ffplay -f lavfi "aevalsrc=0.1sin(2PI55t) 0.1sin(4PI55t) 0.1sin(6PI55t) 0.1sin(8PI55t),asplit[a][out1]; [a] showcqt [out0]"

16.20 showfreqs(将输入音频转换为代表音频功率谱的视频输出)

16.21 showspatial(将立体声输入音频转换为视频输出,以表示两个通道之间的空间关系。)

16.22 showspectrum

将输入音频转换为代表音频频谱的视频输出。

ffplay -f lavfi "amovie=ca.mp3, asplit [a][out1]; [a] showspectrum=mode=separate:color=intensity:slide=1:scale=cbrt [out0]"

16.23 showspectrumpic

16.24 showvolume(将输入音频音量转换为视频输出。)

16.25 showwaves

16.26 showwavespic

16.27 sidedata, asidedata

16.28 spectrumsynth

16.29 split, asplit(将输入音频音量转换为视频输出。split使用音频输入,使用视频分割。)

16.30 zmq, azmq

5.11 Multimedia Source

movie/amovie

从movie容器中读取音频和/或视频流。

6. 水印、截图、人物滤镜等常用命令

        (1) 水印 overlaye ffmpeg -i good_scale.mp4 -i mark.png -filter_complex overlay=10:10 good_mark.mp4

        (2) 人物滤镜 colorchannelmixer

        (3) 截取视频片段 copy ffmpeg -ss 5 -i input.mp4 -t 10 -c:v copy -c:a copy output.mp4 //-ss 5指定从输入视频第5秒开始截取,-t 10指明最多截取10秒。

        (4) 把视频文件推送到rtmp服务器(ffmpeg -re -i jack.mp4 -c copy -f flv rtmp://host/live/test)

        (5) 分离/合并视频音频流 (copy) ffmpeg -i input-video -vn -c:a copy output-audio //分离音频流 ffmpeg -i input-video -c:v copy -an output-video //分离视频流 ffmpeg -i input-video -c:v copy -an output-video -c:a -vn output-audio //同时分离音频和视频流 ffmpeg -i video_file -i audio_file -c:v copy -c:a copy output_file //合并视频音频流

        (6) 视频截图 ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg

        (7) 图片序列与视频的互相转换 ffmpeg -i d.jpg output.mp4 ffmpeg -i input.mp4 d.jpg 第一行命令是把0001.jpg、0002.jpg、0003.jpg等编码成output.mp4, 第二行则是相反把input.mp4变成0001.jpg……。 d.jpg表示从1开始用0补全的4位整数为文件名的jpg文件序列。

(8) 视频中去水印delogo ffmpeg -i good_mark.mp4 -vf delogo=x=10:y=10:w=100:h=60 delogo.mp4 (ffmpeg -i good_scale.mp4 -i mark.png -filter_complex overlay=10:10 good_mark.mp4 加水印)

7. 参考文章

[1]. http://ffmpeg.org/ffmpeg.html#Filtering [2]. https://ffmpeg.org/ffmpeg-filters.html [3]. https://www.bookstack.cn/read/other-doc-cn-ffmpeg/ffmpeg-doc-cn-30.md [4]. FFmpeg filter的使用介绍 [5]. https://www.bogotobogo.com/FFMpeg/ffmpeg_image_scaling_jpeg.php [6]. 使用gprof2dot和graphivz生成程序运行调用图 [7]. Graphviz 画图和例子 [8]. Graphviz典型例子 [9]. https://restream.io/blog/what-is-low-latency/

0 人点赞