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

相关推荐
Hi202402171 天前
消除FFmpeg库的SONAME依赖
linux·ffmpeg
mortimer3 天前
使用阿里AI模型去除背景噪音:单文件40行代码实现
python·ffmpeg·阿里巴巴
今天也想MK代码3 天前
WebRtc语音通话前置铃声处理
ffmpeg·webrtc
撬动未来的支点4 天前
解读ffmpeg控制台输出
ffmpeg
戴草帽的大z4 天前
使用V4L2工具验证RK3588平台视频设备节点数据有效性
ffmpeg·音视频·rk3588·nv12·v4l2-ctl
戴草帽的大z4 天前
rk3588上用rk_mpi_vi_test与ffmpeg实战
ffmpeg·rk3588·mpi·rk_mpi_vi
笑虾4 天前
bat 批处理实现 FFmpeg 命令压缩 MP4
ffmpeg
PenTablet4 天前
用ffmpeg来压缩视频文件
ffmpeg
mortimer5 天前
一键实现人声伴奏分离:基于 `uv`, `FFmpeg` 和 `audio-separator` 的高效解决方案
python·ffmpeg·音视频开发
筏.k6 天前
WebRTC 项目中捕获 FFmpeg 底层源码日志(av_log)的完整方案
ffmpeg·webrtc