文章目录
- 一、裁剪过滤器
- 1、裁剪过滤器简介
- 2、裁剪过滤器语法
- 3、裁剪过滤器内置变量
- 4、裁剪过滤器示例
- 5、裁剪过滤器应用
- 6、裁剪过滤器图示
- 二、裁剪过滤器常用用法
- 1、裁剪指定像素的视频区域
- 2、裁剪视频区域中心正方形 - 默认裁剪
- 3、裁剪视频区域中心正方形 - 手动计算
- 4、裁剪中心 1/2 宽高画面
- 5、裁剪中心区域正方形 - 边长等于高度
- 6、裁剪掉左上角 100 像素
- 7、裁剪出右下角 1/4 面积的画面
FFmpeg 相关文档 :
- FFmpeg 文档主页 : https://ffmpeg.org/documentation.html , 在该页面有 命令行工具文档 , 组件文档 , 库文档 , API 文档 等 , 点击对应的链接就可以跳转到对应的文档中 ;
- 命令行工具文档 :
- ffmpeg 命令文档 : https://ffmpeg.org/ffmpeg.html
- ffplay 命令文档 : https://ffmpeg.org/ffplay.html
- 组件文档 :
- 过滤器 Filter 文档 : https://ffmpeg.org/ffmpeg-filters.html
- 编解码器文档 : https://ffmpeg.org/ffmpeg-codecs.html
一、裁剪过滤器
1、裁剪过滤器简介
FFmpeg 裁剪过滤器 Crop Filter 可用于 裁剪 视频或图像 的特定区域 ;
裁剪过滤器 Crop Filter 的 主要工作 是 将 输入视频帧 的 指定宽高像素的区域 从 x 和 y 坐标位置 裁剪出来 , 输出 到指定的 宽高像素画面 中 ;
x 和 y 是裁剪的 输入视频 的 左上角坐标 ;
裁剪的画面 像素宽高 可以 不等于 输出画面的 像素宽高 ;
裁剪过滤器 不仅可以裁剪视频 , 还可以裁剪图片 ;
2、裁剪过滤器语法
裁剪过滤器 Crop Filter 语法如下 :
crop=ow[:oh[:x[:y[:keep_aspect]]]]
- ow : 裁剪后 输出宽度 , 该选项必须指定 ;
- oh : 裁剪后 输出高度 , 该选项可选 , 如果不指定 , 默认使用 输入高度 ;
- x : 裁剪区域 左上角 x 坐标 , 该选项可选 , 如果不指定 , 默认值为 (iw - ow)/2 , 默认裁剪中心区域 ;
- y : 裁剪区域 左上角 y 坐标 , 该选项可选 , 如果不指定 , 默认值为 (ih - oh)/2 , 默认裁剪中心区域 ;
- keep_aspect : 保持宽高比标志 , 该选项可选 , 如果设置为 1,则强制输出图像的宽高比与输入相同 ;
FFmpeg 裁剪过滤器文档 : https://ffmpeg.org/ffmpeg-filters.html#crop
3、裁剪过滤器内置变量
裁剪过滤器涉及到的变量 :
- x : 裁剪画面 的 左上角 水平方向 距离左侧边界 的 像素数 , 默认值为 (iw - ow)/2 ;
- y : 裁剪画面 的 左上角 垂直方向 距离顶部边界 的 像素数 , 默认值为 (ih - oh)/2 ;
- in_w / iw : 输入视频 / 图片 的 像素宽度 ;
- in_h / ih : 输入视频 / 图片 的 像素高度 ;
- out_w / ow : 输出视频 / 图片 的 像素宽度 , 默认值为 输入视频的像素宽度 iw ;
- out_h / oh : 输出视频 / 图片 的 像素高度 , 默认值为 输入视频的像素高度 ih ;
- a : 视频画面 的 纵横比 , 值为 iw / ih ;
4、裁剪过滤器示例
示例说明 :
crop=100:100:12:34:1
设置裁剪过滤器 , 裁剪 左上角 ( 12 , 34 ) 坐标开始的 100 x 100 像素区域的画面 , 同时保持宽高比 ;crop=100
设置裁剪过滤器 , 裁剪 左上角 ( 0 , 0 ) 坐标开始的 100 x 输入视频画面高度 像素区域的画面 ;
5、裁剪过滤器应用
在 ffmpeg 命令中 , 使用 -vf
参数 指定 裁剪过滤器 , 裁剪过滤器 放在 双引号 中 , 如下面的命令中 , 为 ffmpeg 设置 crop=320:240:0:0
裁剪过滤器 ;
ffmpeg -i input.mp4 -vf "crop=320:240:0:0" output.mp4
6、裁剪过滤器图示
裁剪过滤器图示 : 紫色区域 是要裁剪的画面区域 ;
二、裁剪过滤器常用用法
1、裁剪指定像素的视频区域
裁剪指定像素的视频区域 , 根据 crop=ow[:oh[:x[:y[:keep_aspect]]]]
语法 ,
- 需要特别指定 ow 与 oh 裁剪区域的像素大小 ,
- 左上角的坐标 x 和 y 设置为 0 即可 ,
- 由于是裁剪部分画面 , keep_aspect 保持宽高比不需要设置 , 默认为 0 即可 ;
最终得到的 裁剪过滤器为 crop=320:240:0:0
, 将裁剪过滤器 设置到 ffmpeg 命令中 , 命令如下 :
ffmpeg -i input.mp4 -vf "crop=320:240:0:0" output.mp4
原 输入视频 的大小为 752x420 像素大小 ;
执行上述命令后 , 得到输出文件 output.mp4 , 其文件大小是 320x240 像素 , 截取的视频画面正好是原视频 左上角的画面 , 裁剪命令执行效果 和 播放效果 如下图所示 ;
2、裁剪视频区域中心正方形 - 默认裁剪
裁剪视频画面中心的 200x200 像素的画面 ,
根据 crop=ow[:oh[:x[:y[:keep_aspect]]]]
裁剪过滤器 语法 , x 和 y 默认就自动设置为 输入画面的 中心位置 ,
最终得到的 裁剪过滤器为 crop=200:200
, 将裁剪过滤器 设置到 ffmpeg 命令中 , 命令如下 :
ffmpeg -i input.mp4 -vf "crop=200:200" output.mp4
执行结果如下 :
3、裁剪视频区域中心正方形 - 手动计算
通过手动计算的方式 , 不仅可以裁剪中心区域的画面 , 还可以裁剪任意比例区域的画面 , 比如 左上角 1/4 区域的画面 , 左侧 1/3 区域的画面 , 右侧 1/2 区域的画面 ;
裁剪 视频画面 中心的 200 x 200 像素的画面 , 根据 crop=ow[:oh[:x[:y[:keep_aspect]]]]
语法 ,
- 需要特别指定 ow 与 oh 裁剪区域的像素大小 200 x 200 像素 ,
- 左上角的坐标 x 和 y 需要经过计算 , 计算过程如下 :
iw 和 ih 是 裁剪过滤器 的 内置变量 , 分别表示 输入视频画面的宽度 和 输入视频画面 的高度 ;
计算视频区域 左上角 的坐标 ,
- 计算 左上角 x 坐标 : i w − 200 2 \cfrac{iw - 200}{2} 2iw−200
- 计算 左上角 y 坐标 : i h − 200 2 \cfrac{ih - 200}{2} 2ih−200
最终得到的 裁剪过滤器为 crop=200:200:(iw-200)/2:(ih-200)/2
, 将裁剪过滤器 设置到 ffmpeg 命令中 , 命令如下 :
ffmpeg -i input.mp4 -vf "crop=200:200:(iw-200)/2:(ih-200)/2" output.mp4
执行上述命令后 , 得到输出文件 output.mp4 , 其文件大小是 200x200 像素 , 截取的视频画面正好是原视频 中心区域的画面 , 裁剪命令执行效果 和 播放效果 如下图所示 ;
4、裁剪中心 1/2 宽高画面
这里使用 iw 和 ih 两个变量 , 裁剪的画面宽高都为 1/2 , 由于 x 和 y 默认就是裁剪中心位置 , 这里不需要设置 , 使用默认设置即可 ;
只需要计算出 ow 和 oh 这两个过滤器参数值 ;
- ow 是要裁剪的宽度 , 这里设置为
1/2*iw
, 即输入视频的 1/2 宽度 ; - oh 是要裁剪的高度 , 这里设置为
1/2*ih
, 即输入视频的 1/2 高度 ;
根据 crop=ow[:oh[:x[:y[:keep_aspect]]]]
语法 , 生成 裁剪过滤器为 crop=1/2*iw:1/2*ih
, 将裁剪过滤器 设置到 ffmpeg 命令中 , 命令如下 :
ffmpeg -i input.mp4 -vf "crop=1/2*iw:1/2*ih" output.mp4
执行结果如下 : 输出视频的 宽高是 376x210 , 正好是输入视频的 752x420 的一半 ;
5、裁剪中心区域正方形 - 边长等于高度
这里需要使用 ih 变量 , 裁剪中心区域 , 这是默认设置 , 不需要设置 x 和 y 左上角坐标 ;
由于该视频时 752 x 420 大小的视频 , 宽度大于高度 , 则视频宽高都是 ih ;
只需要计算出 ow 和 oh 这两个 代表裁剪宽高的 过滤器参数值 ;
- ow 是要裁剪的宽度 , 这里设置为
ih
, 即输入视频高度 ; - oh 是要裁剪的高度 , 值也是
ih
, 但是 oh 的默认值就是 输入视频的高度 , 不需要单独设置 ;
根据 crop=ow[:oh[:x[:y[:keep_aspect]]]]
语法 , 生成 裁剪过滤器为 crop=ih
或者是 crop=ih:ih
, 将裁剪过滤器 设置到 ffmpeg 命令中 , 命令如下 :
ffmpeg -i input.mp4 -vf "crop=ih" output.mp4
执行结果如下 : 输入视频的宽高为 750x420 , 最终裁剪的视频宽高是 420x420 ;
6、裁剪掉左上角 100 像素
裁剪掉左上角 100 像素 , 也就是将 上边的 100 像素 长条画面 和 左侧的 100 像素 竖条画面 删除 , 只留下右下角剩余部分 , 如下图所示 ;
裁剪画面 的 左上角坐标是 ( 100 , 100 ) , 因此 x 值为 100 , y 值为 100 ;
ow 是要裁剪的宽度 , 值为 输入画面宽度 减去 100 像素 , 值为 iw - 100 ;
oh 是要裁剪的高度 , 值为 输入画面高度 减去 100 像素 , 值为 ih - 100 ;
根据 crop=ow[:oh[:x[:y[:keep_aspect]]]]
语法 , 生成 裁剪过滤器为 crop=iw-100:ih-100:100:100
, 将裁剪过滤器 设置到 ffmpeg 命令中 , 命令如下 :
ffmpeg -i input.mp4 -vf "crop=iw-100:ih-100:100:100" output.mp4
执行结果如下 : 输入视频的宽高为 750x420 , 最终裁剪的视频宽高是 652x320 ;
7、裁剪出右下角 1/4 面积的画面
裁剪出右下角 1/4 面积的画面 , 就是 右下角 宽高各为 1/2 的画面 , 如下图所示 :
裁剪画面 的 左上角坐标是 ( iw/2 , ih/2 ) , 因此 x 值为 iw/2 , y 值为 ih/2 ;
ow 是要裁剪的宽度 , 值为 iw/2 ;
oh 是要裁剪的高度 , 值为 ih/2 ;
根据 crop=ow[:oh[:x[:y[:keep_aspect]]]]
语法 , 生成 裁剪过滤器为 crop=iw/2:ih/2:iw/2:ih/2
, 将裁剪过滤器 设置到 ffmpeg 命令中 , 命令如下 :
ffmpeg -i input.mp4 -vf "crop=iw/2:ih/2:iw/2:ih/2" output.mp4
执行结果如下 : 输入视频的宽高为 750x420 , 最终裁剪的视频宽高是 376x210 ;