跳至主要內容

FFmpeg 常用 filters

安格原创FFmpegFFmpeg大约 5 分钟...

参考:

某个 filter 的使用方式可以参考官方文档open in new window,或者用命令行查看,如下:

ffmpeg -h filter=filter_name

filter 的参数用:分隔。可以省略参数键, 按顺序传参, 也可以用键=值的方式传,如下:

trim=5:10

trim=start=5:end=10

pad=width=640:height=480:x=10:y=10:color=0x000000:color_space=bt601

视频 (Video Filters)

trimopen in new window

从输入流中裁剪一段连续的部分作为输出流。

参数

  • start: 指定要保留部分的开始时间,这个时间戳的帧会作为输出流的第一帧。
  • end: 指定后面要丢弃部分的开始时间,这个时间戳的所对应的前一帧会作为输出流的最后一帧。(其实就是截取 [start,end) 这一段左闭右开区间的内容作为输出流)
  • start_pts: 和start作用一样,只是这里设置的单位是时间线而不是秒。
  • end_pts: 和end作用一样,只是这里设置的单位是时间线而不是秒。
  • duration: 输出的最大时长,单位是秒。
  • start_frame: 指定要截取的起始帧。
  • end_frame: 指定要截取的结束帧,该帧的前一帧会作为输出流的最后一帧。

示例

# 保留视频的第二分钟。索引从 0 开始,第60秒 即为第二分钟的第 1 秒,第120 秒的前一帧作为输出流的最后一帧。
ffmpeg -i INPUT -vf trim=60:120

# 只保留第一秒。
ffmpeg -i INPUT -vf trim=duration=1

注意: 这个 trim 是 videoFilter, 只处理视频流, 不能直接用来做视频裁剪。

padopen in new window

为输入的图形添加内边距,并且将原始的输入流放在指定的 x,y 坐标处。

参数

  • width, w:
  • height, h:
    指定添加过 paddings 后的输出图形的宽度和高度。如果宽或高设置为 0,则取其输入流相应的宽或高。
    widhtheight 默认值为 0
  • x:
  • y:
    指定原始图像在添加了 paddings 后的输出图像中的位置坐标。
  • color:
    指定 pad 区域的颜色,默认为 black
  • eval:
    指定计算 width, height, x, y 表达式的时机。默认 init
    • init: 仅在该 filter 初始化期间或处理命令时计算一次表达式。
    • frame: 对每一个输入帧进行计算。
  • aspect:
    使用宽高比而不是分辨率。

width, height, x, 和 y 选项是包含以下常量的表达式:

  • in_w:
  • in_h:
  • iw:
  • ih:
    输入视频的宽度和高度。
  • out_w:
  • out_h:
  • ow:
  • oh:
    输出视频的宽度和高度(加过 pad 后的整个区域)。由widthheight表达式指定。
  • x:
  • y:
    xy表达式指定的 x 和 y 偏移量,或者如果没有指定则为 NAN。

说明

pad 可以用来添加边框,或者添加内边距。
参数 width, height 必须 >= 输入的 width, height。否则会报错 Padded dimensions cannot be smaller than input dimensions.
可以理解为,pad 是指定输出后的尺寸,如果该尺寸大于输入尺寸,则多出的部分将被填充为指定的颜色。如果尺寸一致,则不会填充。如果指定的输出尺寸小于输入尺寸,则会报错。

示例

# 输入的 input_01.mp4 尺寸为 1920*1080, 将其输出为 1920*1280, 则高度上多出了 200 需要填充颜色。
# 下面参数中 x=0, y=(oh-ih)/2, y的值为 (1280-1080)/2 = 100 。
# 最终输出正好是竖直方向居中,上下各填充100高度的红色。
ffmpeg4 -i input_01.mp4 \
    -filter_complex "pad=1920:1280:0:(oh-ih)/2:red" \
    -y output_01.mp4

多媒体 (Multimedia Filters)

split, asplit

将输入的流拆分为多个相同的输出流。
asplit 用于音频输入,split 用于视频输入。
该 filter 接收一个参数指定输出流的数量。如果未指定,默认为 2。

这里的拆分就是分流复制,不是截断那种拆分,截取用 trim。

示例

# 将输入流 [in] 拆分为 2 个输出流 [out1] 和 [out2]
[in] split [out0][out1]

# 要创建 3个及以上的输出流,需要指定输出流的数量
[in] asplit=3 [out0][out1][out2]

concatopen in new window

连接音频和视频流,将它们一个接一个的合并。
该 filter 适用于同步视频和音频流的片段。所有片段每种流的数量必须相同,这也是最终输出流的数量。

参数

  • n: 片段数量,默认 2。
  • v: 输出视频流的数量,也是每个输入片段的视频流的数量,默认 1。
  • a: 输出音频流的数量,也是每个输入片段的音频流的数量,默认 0。
  • unsafe: 启用 unsafe 模式: 各个片段的格式不同时不会报错。

该 filter 有着 v+a 的输出, 第一个是视频流, 第二个是音频流。
想要该 filter 正常工作,所有片段的时间必须从 0 开始。

示例

示例没有亲测,请参见官网示例:http://ffmpeg.org/ffmpeg-filters.html#Examples-142open in new window

上次编辑于:
你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.1.3