🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 简介 在编码之前,ffmpeg可以使用libavfilter库中的过滤器处理原始音频和视频帧。 几个链式过滤器形成一个过滤器图形。 ffmpeg区分两种类型的过滤器图形:简单和复杂。 # 简单滤镜 简单的过滤器图是那些只有一个输入和输出,都是相同的类型。 在上面的图中,它们可以通过在解码和编码之间插入一个额外的步骤来表示: ![](https://box.kancloud.cn/7b64810d6015ef42dea5ce1ff667f696_621x305.png) 简单的filtergraphs配置了`per-stream-filter`选项(分别为视频和音频使用`-vf`和`-af`别名)。 一个简单的视频filtergraph可以看起来像这样的例子: ![](https://box.kancloud.cn/b5bdcb23392527d883605367d760b0fb_761x133.png) 请注意,某些滤镜会更改帧属性,但不会改变帧内容。 例如。 上例中的fps过滤器会改变帧数,但不会触及帧内容。 另一个例子是setpts过滤器,它只设置时间戳,否则不改变帧。 # 复杂滤镜 复杂的过滤器图是那些不能简单描述为应用于一个流的线性处理链的过滤器图。 例如,当图形有多个输入和/或输出,或者当输出流类型与输入不同时,就是这种情况。 他们可以用下图来表示: ![](https://box.kancloud.cn/773994de38179253f0652d0c94e9d2e2_542x492.png) 复杂的过滤器图使用`-filter_complex`选项进行配置。 请注意,此选项是全局性的,因为复杂的过滤器图形本质上不能与单个流或文件明确关联。 -lavfi选项等同于`-filter_complex`。 一个复杂的过滤器图的一个简单的例子是覆盖过滤器,它有两个视频输入和一个视频输出,包含一个视频叠加在另一个上面。 它的音频对应是amix滤波器 # 命令 滤镜命令 ~~~ ffmpeg -i input.mov -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy out.mp4 ~~~ * `-vf`: 视频滤镜,名字教crop参数是我本身视频宽度-200,高度-200 * `-c:v` 视频编码器是libx264 * `-c:a` 音频编码器copy不做特殊处理 crop格式:`crop=out_w:out_h:x:y` # 视频缩小一倍 ~~~ ffmpeg -i out.mp4 -vf scale=iw/2:-1 scale.mp4 ~~~ • `-vf scale` 指定使用简单过滤器 scale,iw/2:-1 中的 iw 指定按整型取视频的宽度。 -1 表示高度随宽度一起变化。 视频裁剪 ~~~ ffmpeg -i VR.mov -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy -video_size 1280x720 vr_new.mp4 ~~~ `crop 格式:crop=out_w:out_h:x:y` • `out_w`: 输出的宽度。可以使用 in_w 表式输入视频的宽度。 • `out_h`: 输出的高度。可以使用 in_h 表式输入视频的高度。 • x : X坐标 • y : Y坐标 如果 x和y 设置为 0,说明从左上角开始裁剪。如果不写是从中心点裁剪。 # 倍速播放 ~~~ ffmpeg -i out.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" speed2.0.mp4 ~~~ • `-filter_complex` 复杂滤镜,`[0:v]`表示第一个(文件索引号是0)文件的视频作为输入。`setpts=0.5*PTS`表示每帧视频的pts时间戳都乘0.5 ,也就是差少一半。`[v]`表示输出的别名。音频同理就不详述了。 • map 可用于处理复杂输出,如可以将指定的多路流输出到一个输出文件,也可以指定输出到多个文件。`"[v]"` 复杂滤镜输出的别名作为输出文件的一路流。上面 map的用法是将复杂滤镜输出的视频和音频输出到指定文件中。 # 对称视频 ~~~ ffmpeg -i out.mp4 -filter_complex "[0:v]pad=w=2*iw[a];[0:v]hflip[b];[a][b]overlay=x=w" duicheng.mp4 ~~~ • hflip 水平翻转 如果要修改为垂直翻转可以用vflip。 # 画中画 ~~~ ffmpeg -i out.mp4 -i out1.mp4 -filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[ckout];[0:v][ckout]overlay=x=W-w-10:y=0[out]" -map "[out]" -movflags faststart new.mp4 ~~~ # 录制画中画 ~~~ ffmpeg -f avfoundation -i "1" -framerate 30 -f avfoundation -i "0:0" -r 30 -c:v libx264 -preset ultrafast -c:a libfdk_aac -profile:a aac_he_v2 -ar 44100 -ac 2 -filter_complex "[1:v]scale=w=176:h=144:force_original_aspect_ratio=decrease[a];[0:v][a]overlay=x=W-w-10:y=0[out]" -map "[out]" -movflags faststart -map 1:a b.mp4 ~~~ # 多路视频拼接 ~~~ ffmpeg -f avfoundation -i "1" -framerate 30 -f avfoundation -i "0:0" -r 30 -c:v libx264 -preset ultrafast -c:a libfdk_aac -profile:a aac_he_v2 -ar 44100 -ac 2 -filter_complex "[0:v]scale=320:240[a];[a]pad=640:240[b];[b][1:v]overlay=320:0[out]" -map "[out]" -movflags faststart -map 1:a c.mp4 ~~~