crop过滤器使用
FFmpeg crop滤镜详解
这段代码创建并配置了一个crop(裁剪)滤镜,用于从视频帧中提取特定区域。下面我将全面解析这个滤镜的功能和用法。
1. 基本功能
crop滤镜的主要作用:
- 从输入视频帧中裁剪出指定矩形区域
- 可以精确控制裁剪的位置和尺寸
- 支持动态表达式计算裁剪参数
2. 代码解析
c
AVFilter* crop_filter = avfilter_get_by_name("crop");
AVFilterContext* crop_filter_ctx;
ret = avfilter_graph_create_filter(&crop_filter_ctx, crop_filter, "crop",
"out_w=iw:out_h=ih/2:x=0:y=0",
NULL, filter_graph);
各参数说明:
- 滤镜参数字符串解析 :
out_w=iw
:输出宽度=输入宽度(input width)out_h=ih/2
:输出高度=输入高度的一半x=0
:从x=0位置开始裁剪y=0
:从y=0位置开始裁剪
- 特殊变量 :
iw
:输入宽度(input width)ih
:输入高度(input height)ow
:输出宽度(output width)oh
:输出高度(output height)
3. 参数详解
crop滤镜支持以下主要参数:
参数名 | 说明 | 默认值 | 示例值 |
---|---|---|---|
out_w |
输出区域宽度(ow) | iw | 640, iw/2 |
out_h |
输出区域高度(oh) | ih | 480, ih*0.8 |
x |
裁剪区域左上角x坐标 | 0 | 10, (iw-ow)/2 |
y |
裁剪区域左上角y坐标 | 0 | 20, (ih-oh)/2 |
keep_aspect |
是否保持宽高比 | 0 | 1 |
4. 本示例效果
当前配置 "out_w=iw:out_h=ih/2:x=0:y=0"
表示:
- 保持原始宽度不变
- 高度减半
- 从画面左上角(0,0)开始裁剪
- 最终效果:保留视频的上半部分
5. 常见使用场景
- 裁剪特定区域:
c
"out_w=400:out_h=300:x=100:y=50"
- 居中裁剪:
c
"out_w=iw/2:out_h=ih/2:x=(iw-ow)/2:y=(ih-oh)/2"
- 去除黑边:
c
"out_w=iw-100:out_h=ih-40:x=50:y=20"
6. 动态表达式
crop滤镜支持使用表达式,可以实现动态裁剪效果:
- 随时间变化的裁剪:
c
"out_w=iw/2:out_h=ih/2:x='t*10%iw':y=0"
- 基于内容的智能裁剪:
c
"out_w=min(iw,ih):out_h=ow:x=(iw-ow)/2:y=(ih-oh)/2"
7. 注意事项
- 边界检查 :
- 确保
x+out_w ≤ iw
- 确保
y+out_h ≤ ih
- 否则会裁剪失败
- 确保
- 性能影响 :
- 裁剪操作本身计算量不大
- 但会改变视频分辨率,影响后续处理
- 像素格式 :
- 裁剪对所有像素格式都有效
- 但YUV格式需要注意色度平面的对齐
8. 错误处理建议
改进后的错误处理:
c
if (ret < 0) {
char errbuf[128];
av_strerror(ret, errbuf, sizeof(errbuf));
fprintf(stderr, "无法创建crop滤镜: %s\n", errbuf);
return ret;
}
9. 实际应用案例
在本demo中,crop滤镜的配置与后续的vflip滤镜配合使用:
- 先用crop保留上半部分
- 然后用vflip垂直翻转
- 最后用overlay叠加到原视频上
- 形成"水中倒影"效果
10. 与其他滤镜的对比
- vs
scale
滤镜 :crop
是空间域操作,选择画面区域scale
是尺寸变换,会重采样图像
- vs
pad
滤镜 :crop
是减少画面区域pad
是增加画面区域(加黑边)
- vs
cropdetect
滤镜 :crop
是主动裁剪cropdetect
是自动检测可裁剪区域
11. 高级用法示例
实现画中画效果:
c
// 主视频流
[main_input] -> [main_process]
// 子视频流
[sub_input] -> crop=out_w=iw/3:out_h=ih/3:x=0:y=0 -> [sub_scaled]
// 合并
[main_process] -> [overlay];
[sub_scaled] -> [overlay];
[overlay] -> output
这个crop滤镜是FFmpeg视频处理中非常基础和重要的操作,掌握它可以实现各种画面选取和重构效果。