过滤器分类

1.1简单过滤器

在简单过滤器中,只包含一个输入和一个输出,并且输入输出是同一类型。在下面的处理过程中,仅仅是在解码和编码之间加上一个额外的过滤步骤。

简单过滤器由per-stream-filter参数(视频为-vf,音频为-af)配置。一个用于处理视频的简单过滤器大概是这个流程:

一些过滤器只改变数据帧的属性,并不改变数据帧的内容。例如:fps过滤器改变数据帧的个数,并不涉及数据帧的内容。另一个例子是setpts过滤器,它仅仅改变时间戳然后传递这些数据帧而已。

1.2复杂过滤器

复杂过滤器不是简单的将线性操作链应用于一个流(上面简单过滤器过程便是如此)。当有多个输入和输出时,或者输出类型和输入类型不一致时,可以用下面的图来展示复杂过滤器的处理流程:
 
复杂过滤器类型由-filter_complex参数配置。这个参数是全局的,因为复杂过滤器类型本身就不可能只和一个流或文件关联,这是由它的本质决定的。此外-lavfi参数和-filter_complex是等价的。关于复杂过滤器类型一个常用例子是overlay过滤器,它有两个输入,一个输出,其中一个视频覆盖在另外一个上面:

ffmpeg -i video_1.mkv -i video_2.3gp -filter_complex 'overlay' video_out.mp4

滤镜图(filtergraph):跟在 -vf 之后的就是一个滤镜图
滤镜链(filterchain):一个滤镜图包含多个滤镜链
滤镜(filter):一个滤镜链包含多个滤镜
概括来说就是:滤镜 ∈ 滤镜链 ∈ 滤镜图
一个滤镜图的例子如下:
ffmpeg  -i video.mp4 -vf [in]scale=640.0:480.0[pre_logo]; movie='/path/to/image/logo.png',scale=92.25:30.0[logo]; \
[pre_logo][logo]overlay=main_w-overlay_w-24.0:24.0[out]  output.mkv
在该示例中,有三个滤镜链:(1)[in]scale=640.0:480.0[pre_logo](2)movie='/path/to/image/logo.png',scale=92.25:30.0[logo](3)[pre_logo][logo]overlay=main_w-overlay_w-24.0:24.0[out]
可以看到,滤镜链是使用分号  ";" 来分隔,滤镜链中的滤镜使用逗号 "," 来分隔;滤镜链没有指定输入或者输出,默认使用前面的滤镜链的输出为输入,并输出给后面的滤镜链作为输入。

视频加速

1. 加速/减慢视频
可以使用 “setpts"(http://ffmpeg.org/ffmpeg.html#asetpts_002c-setpts)滤镜来改变视频速度。

加速视频命令:
# ./ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv

Note : 这个方法在实现你想要的速度时,会采取丢帧策略。
如果想避免丢帧,可以指定输出的帧率比输入的帧率高的办法。
例如,输入的帧率为4, 指定输出的帧率为4x, 即16fps :
# ./ffmpeg -i input.mkv -r 16 -filter:v "setpts=0.125*PTS" -an output.mkv

减慢视频命令:
# ./ffmpeg -i input.mkv -filter:v "setpts=2.0*PTS" output.mkv

2. 加速/减慢音频
可以使用" atempo" 音频滤镜来加速或减慢音频。如双倍速音频命令:
# ./ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv

"atempo"滤镜对音频速度调整限制在0.5 到 2.0 之间,(即半速或倍速)。
如果有必要,可以使用多个atempo滤镜来实现,如下面的命令实现四倍速音频:
# ./ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv

使用更复杂的滤镜图,可以同时加速视频和音频:

# ./ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv

转换比率

假定大于1为慢速,小于1为快速。
则0.3的转换为,V*3/10,A*10/3, 1.2的转换为V*12/10,A*10/12。

map参数的使用

The best way to understand ​-map option is to think of it like a way to tell FFmpeg which streams do you want to select/copy from input to an output.

1、-map 0 选择第一个文件的所有流
2、-map i:v 从文件序号i(index)中获取所有视频流, -map i:a 获取所有音频流,-map i:s 获取所有字幕流等等。
3、特殊参数-an,-vn,-sn分别排除所有的音频,视频,字幕流。
To select all video and the third audio stream from an input file:
ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT
ffmpeg -i audio.mp3 -i video.mp4 -filter_complex \
"[0:a][1:a]amerge,pan=stereo:c0<c0+c2:c1<c1+c3[out]" \
-map 1:v -map "[out]" -c:v copy -c:a libfdk_aac -shortest output.mp4

This will take the audio stream from the first input (audio.mp3) and the audio stream from the second input (video.mp4). amerge will combine them into a 4 channel stream, then pan will combine the 4 channels into a stereo stream. The output link label is called [out] (you can use almost any arbitrary name).
Then -map 1:v selects the video from the second input as a video source for the output file, and -map "[out]" selects the audio from the filtergraph as an audio source for the output file.
The video is stream copied with -c:v copy, so it is not re-encoded. Filters require re-encoding, so -c:a libfdk_aac is used in this example to re-encode to AAC audio.
The -shortest option will end the output file whenever the shortest input ends which is useful if one input is shorter than the other.

./ffmpeg -f lavfi -i testsrc -f lavfi -i testsrc -f lavfi -i testsrc -f lavfi -i testsrc -filter_complex \
"[0:v]pad=iw*2:ih*2[a]; \
 [1:v]negate[b]; \
 [2:v]hflip[c]; \
 [3:v]edgedetect[d]; \
 [a][b]overlay=w[x]; \
 [x][c]overlay=0:h[y]; \
 [y][d]overlay=w:h[out]" -map "[out]" -c:v ffv1 -t 5 multiple_input_grid.avi

例子:

aac跟另一个mp4的视频合并。

ffmpeg -i cu.aac -i bao.mp4 -map 0 -map 1:v n.mp4

crop裁剪视频
有时可能只需要视频的正中一块,而两头的内容不需要,这时可以对视频进行裁剪(crop),比如有一个竖向的视频 1080 x 1920,如果指向保留中间 1080×1080 部分,可以使用下面的命令:
$ ffmpeg -i a.mov -strict -2 -vf crop=1080:1080:0:420 out.mp4
其中的 crop=1080:1080:0:420 才裁剪参数,具体含义是 crop=width:height:x:y,其中 width 和 height 表示裁剪后的尺寸,x:y 表示裁剪区域的左上角坐标。比如当前这个示例,我们只需要保留竖向视频的中间部分,所以 x 不用偏移,故传入0,而 y 则需要向下偏移:(1920 – 1080) / 2 = 420
视频缩放和裁剪是可以同时进行的,如下命令则为将视频缩小至 853×480,然后裁剪保留横向中间部分:

$ ffmpeg -i IMG_4940.MOV -strict -2 -vf scale=853:480,crop=480:480:186:0 out.mp4

scale可以成比例拉伸。
       假设原始视频尺寸是 1080p(即 1920×1080 px,16:9),使用下面命令可以缩小到 480p:
$ ffmpeg -i a.mov -vf scale=853:480 -acodec aac -vcodec h264 out.mp4
-vf scale=853:480 vf 参数用于指定视频滤镜,其中 scale 表示缩放,后面的数字表示缩放至 853×480 px,其中的 853px 是计算而得,因为原始视频的宽高比为 16:9,所以为了让目标视频的高度为 480px,则宽度 = 480 x 9 / 16 = 853。上面的参数 scale=853:480 当中的宽度和高度实际应用场景中通常只需指定一个,比如指定高度为 480 或者 720,至于宽度则可以传入 “-1” 表示由原始视频的宽高比自动计算而得。即参数可以写为:scale=-1:480,当然也可以 scale=480:-1。
对输入视频成比例缩放
改变为源视频一半大小
ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4
改变为原视频的90%大小:

ffmpeg -i input.mpg -vf scale=iw*0.9:ih*0.9 output.mp4

apsect  内容的宽高比,其它部分填黑。如:1:1,跟1:2。

tile 画面组合

例子:

ffmpeg -skip_frame nokey -i  y12.mp4  -vf "scale=128:72,tile=2x2" -an -vsync 0 keyframes%03d.png

ffmpeg -skip_frame nokey -i file.avi -vf 'scale=128:72,tile=8x8' -an -vsync 0 keyframes%03d.png

跑马灯

overlay=x='if(gte(t,2), -w+(t-2)*20, NAN)

ffmpeg -i 1.mp4  -i 1.png  -vcodec libx264 -an -filter_complex "overlay=x='if(gte(t,2), -w+(t-2)*20, NAN)':y=0" -s 320x240 output.mp4

pad填充
在视频帧上增加一快额外额区域,经常用在播放的时候显示不同的横纵比
语法:pad=width[:height:[:x[:y:[:color]]]]

使用FFmpeg给视频增加黑边需要用到 pad 这个滤镜,具体用法如下:
   -vf pad=1280:720:0:93:black
按照从左到右的顺序依次为:
  “宽”、“高”、“X坐标”和“Y坐标”,宽和高指的是输入视频尺寸(包含加黑边的尺寸),XY指的是视频所在位置。

相当于准备一个大的面板,将视频放上去,左上角的坐标为x,y。

比如一个输入视频尺寸是1280x534的源,想要加上黑边变成1280x720,那么用上边的语法可以实现,93是这样得来的,(720-534)/2。
如果视频原始1920x800的话,完整的语法应该是:
   -vf scale=1280:534,pad=1280:720:0:93:black
先将视频缩小到1280x534,然后在加入黑边变成1280x720,将1280x534的视频放置在x=0,y=93的地方,
FFmpeg会自动在上下增加93像素的黑边。
注:black可以不写,默认是黑色

ffmpeg视频滤镜相关推荐

  1. FFMPEG视频滤镜(一)

    前言 介绍FFmpeg中旋转rotate.拼接hstack.翻转hflip.边缘edgedetect视频滤镜的使用方法. 1. 旋转滤镜 1.1 名称:rotate 1.2 语法:-angle:旋转角 ...

  2. LiveVideoStackCon讲师热身分享 ( 八 ) —— FFmpeg的滤镜在视频编辑场景中的应用

    LiveVideoStackCon 2018音视频技术大会是每年的多媒体技术人的盛宴,为了让参会者与大会讲师更多互动交流,我们推出了LiveVideoStackCon讲师热身分享第一季,在每周四晚19 ...

  3. ffmpeg 将拆分的数据合成一帧_FFmpeg + OpenGLES 实现视频解码播放和视频滤镜

    FFmpeg 开发系列连载: FFmpeg 开发(01):FFmpeg 编译和集成 FFmpeg 开发(02):FFmpeg + ANativeWindow 实现视频解码播放 FFmpeg 开发(03 ...

  4. ffmpeg利用滤镜合并两个视频,一左一右

    ffmpeg关于视频合并的例子,命令行的一堆,代码的感觉不多,命令行跟代码感觉还是有些差距,代码上要求还是高一些,关于滤镜的命令行,读者可以看我的一篇博客 ffmpeg利用滤镜进行视频混合(命令行) ...

  5. ffmpeg利用滤镜合并四个视频,左一右三

    今天利用ffmpeg的滤镜功能合并,左一右三方式,如下所示: 读者需要先对滤镜的描述字符串有所了解,读者可以参看我写的一篇博客: ffmpeg利用滤镜进行视频混合(命令行) 四个文件都是1920x10 ...

  6. ffmpeg利用滤镜合并两个视频,一左一右---avfilter_link实现

    之前写过一篇博客ffmpeg利用滤镜合并两个视频,一左一右 用的是滤镜字符串解析avfilter_graph_parse_ptr实现滤镜的连接,查看了avfilter_graph_parse_ptr的 ...

  7. FFmpeg进阶:音视频滤镜概述

    文章目录 滤镜示例 滤镜的格式 滤镜语法规则 滤镜图 基于时间的滤镜控制 滤镜API介绍 常用滤镜 FFmpeg的滤镜模块(libavfilter)提供了各种各样的滤镜特效.通过滤镜模块,我们可以实现 ...

  8. FFmpeg源码分析:视频滤镜介绍(上)

    FFmpeg在libavfilter模块提供音视频滤镜.所有的视频滤镜都注册在libavfilter/allfilters.c.我们也可以使用ffmpeg -filters命令行来查看当前支持的所有滤 ...

  9. FFmpeg 视频录制 - 视频添加滤镜和编码

    前言 音视频开发中,视频编码是另一个重要的部分,基于 FFmpeg 软件解码前面系列文章已经介绍过了. 接下来主要介绍软件编码这一块,包括视频编码.音频编码.为视频添加滤镜等,后续文章安排介绍 And ...

最新文章

  1. python 从网络URL读取图片并直接处理的代码
  2. 彻底解决 gcr、quay、DockerHub 镜像下载难题!
  3. Java算法面试题 一个顺子带一对
  4. 7月份计划-----dream
  5. ITK:Perona Malik在灰度图像上的各向异性扩散
  6. 关于Android中Animation的停止
  7. 学院后勤报修系统php_如何有效提升医院医疗设备故障报修问题?
  8. Cluster - LB - haproxy
  9. 我的世界java下载慢怎么办_漫话:为什么你下载小电影的时候进度总是卡在99%就不动了?...
  10. 魔兽争霸III显示器设置分辨率 修改注册表单实现
  11. 第16章Stata面板数据分析
  12. 计算机产品选型与配置,高校校园网设备的选型和配置.DOC
  13. 最热门的国人开发开源软件 TOP 50
  14. 线性表的创建和基本操作
  15. adlds文件服务器,Windows轻型目录(AD LDS)的备份恢复
  16. 爬虫实战—拿下最全租房数据 | 附源码
  17. 屏幕录像专家 V7.5 Build 20080112 简体中文绿色特别版
  18. Iterator patten 读书笔记
  19. Access Points (单调栈)
  20. Ubuntu安装腾讯APP

热门文章

  1. 使用google挖掘SQL注入漏洞
  2. 最新系统漏洞--Google Golang竞争条件漏洞
  3. 登录远程出现身份验证错误要求函数不受支持
  4. 遗传算法 其实很简单
  5. ncnn的使用(初学必看)
  6. 数学建模与MATLAB计算之007.MATLAB中的循环语句
  7. 卧槽!​我的Python竟然会跳舞!
  8. vue+element制作音乐播放器播放进度条bug(鼠标拖拽slider滑块滑动到指定位置无效)
  9. windows下搭建syslog服务器及基本配置
  10. 一道SQL语句面试题