FFmpeg过滤器之crop

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);
各参数说明:
  1. 滤镜参数字符串解析
    • out_w=iw:输出宽度=输入宽度(input width)
    • out_h=ih/2:输出高度=输入高度的一半
    • x=0:从x=0位置开始裁剪
    • y=0:从y=0位置开始裁剪
  2. 特殊变量
    • 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. 常见使用场景

  1. 裁剪特定区域
c 复制代码
"out_w=400:out_h=300:x=100:y=50"
  1. 居中裁剪
c 复制代码
"out_w=iw/2:out_h=ih/2:x=(iw-ow)/2:y=(ih-oh)/2"
  1. 去除黑边
c 复制代码
"out_w=iw-100:out_h=ih-40:x=50:y=20"

6. 动态表达式

crop滤镜支持使用表达式,可以实现动态裁剪效果:

  1. 随时间变化的裁剪
c 复制代码
"out_w=iw/2:out_h=ih/2:x='t*10%iw':y=0"
  1. 基于内容的智能裁剪
c 复制代码
"out_w=min(iw,ih):out_h=ow:x=(iw-ow)/2:y=(ih-oh)/2"

7. 注意事项

  1. 边界检查
    • 确保 x+out_w ≤ iw
    • 确保 y+out_h ≤ ih
    • 否则会裁剪失败
  2. 性能影响
    • 裁剪操作本身计算量不大
    • 但会改变视频分辨率,影响后续处理
  3. 像素格式
    • 裁剪对所有像素格式都有效
    • 但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滤镜配合使用:

  1. 先用crop保留上半部分
  2. 然后用vflip垂直翻转
  3. 最后用overlay叠加到原视频上
  4. 形成"水中倒影"效果

10. 与其他滤镜的对比

  1. vs scale滤镜
    • crop是空间域操作,选择画面区域
    • scale是尺寸变换,会重采样图像
  2. vs pad滤镜
    • crop是减少画面区域
    • pad是增加画面区域(加黑边)
  3. 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视频处理中非常基础和重要的操作,掌握它可以实现各种画面选取和重构效果。

参考资料:https://github.com/0voice

相关推荐
AC赳赳老秦2 天前
DBA 专属方案:用 OpenClaw 实现 SQL 语句优化、慢查询分析、数据库备份巡检全自动化
服务器·前端·数据库·ffmpeg·自动化·deepseek·openclaw
小叮当⇔3 天前
M4A 转 MP3 桌面转换器(PyQt5 + FFmpeg)
开发语言·qt·ffmpeg
aovenus6 天前
FFmpeg 官网及文档
ffmpeg
aovenus6 天前
FFmpeg 工具介绍
ffmpeg
jr-create(•̀⌄•́)6 天前
简单视频编辑tools
python·ffmpeg
山栀shanzhi6 天前
在做直播时,I帧的间隔(GOP)一般是多少?
网络·c++·面试·ffmpeg
weixin_421607557 天前
SRT字幕驱动视频自动分镜切割:电影解说批量生成的工程实现思路
ffmpeg·srt字幕·ai剪辑·影视解说·ai电影解说·视频自动切割·字幕文件解析
相偎7 天前
arm平台编译mpp、ffmpeg和xfreerdp
arm开发·ffmpeg
LoyalToOrigin8 天前
iOS 26 libass字幕渲染问题兼容解决实践
ios·ffmpeg·objective-c
siv778 天前
影视解说视频智能生产全链路方案解析:从脚本生成到多平台分发
ffmpeg·srt字幕·ai剪辑·影视解说·ai电影解说·视频自动切割·字幕文件解析