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

相关推荐
风间琉璃•4 小时前
FFmpeg视频编解码
ffmpeg·视频编解码
彷徨而立5 小时前
【win32】ffmpeg 解码器
ffmpeg
彷徨而立8 小时前
【win32】ffmpeg 解码器2
ffmpeg
喝呜昂_黄11 小时前
【 嵌入式Linux应用开发项目 | Rockit + FFmpeg+ Nginx】基于泰山派的IPC网络摄像头
linux·c语言·nginx·ffmpeg
陈旭金-小金子11 小时前
FFmpeg 5.x 编译 so 文件的记录
ffmpeg
huluang1 天前
ppt视频极致压缩参数
ffmpeg·powerpoint·音视频
在狂风暴雨中奔跑5 天前
厌倦了复杂的编译?一键集成 AeroFFmpeg,让Android音视频开发更简单!
ffmpeg·开源
Java陈序员6 天前
直播录制神器!一款多平台直播流自动录制客户端!
python·docker·ffmpeg
简鹿办公10 天前
FFmpeg vs 去水印软件:哪种方式更适合你?
ffmpeg·怎样去除视频水印·如何去视频logo视频水印