当前位置: 首页 > news >正文

【FFmpeg】Filter 过滤器 ② ( 裁剪过滤器 Crop Filter | 裁剪过滤器语法 | 裁剪过滤器内置变量 | 裁剪过滤器常用用法 )

文章目录

  • 一、裁剪过滤器
    • 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} 2iw200
  • 计算 左上角 y 坐标 : i h − 200 2 \cfrac{ih - 200}{2} 2ih200

在这里插入图片描述

最终得到的 裁剪过滤器为 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 ;

在这里插入图片描述

相关文章:

【FFmpeg】Filter 过滤器 ② ( 裁剪过滤器 Crop Filter | 裁剪过滤器语法 | 裁剪过滤器内置变量 | 裁剪过滤器常用用法 )

文章目录 一、裁剪过滤器1、裁剪过滤器简介2、裁剪过滤器语法3、裁剪过滤器内置变量4、裁剪过滤器示例5、裁剪过滤器应用6、裁剪过滤器图示 二、裁剪过滤器常用用法1、裁剪指定像素的视频区域2、裁剪视频区域中心正方形 - 默认裁剪3、裁剪视频区域中心正方形 - 手动计算4、裁剪…...

thinkphp5 中控制器的创建和使用方法

在 ThinkPHP 5 中,控制器(Controller)是用于处理请求、执行逻辑操作并返回响应的类。以下是在 ThinkPHP 5 中创建和使用控制器的基本方法: 1. 创建控制器 在 ThinkPHP 5 中,控制器通常位于 application/index/contro…...

[Linux] 常用服务器命令(持续更新)

文件操作 # 显示文件系统的磁盘空间使用情况 df -h全局查找文件 find / -type f -iname "java"find / -name libncurses*拷贝整个文件夹 cp -r /home/a/ /home/b/ 解压,撤销解压 撤销zip解压 zipinfo -1 path/xx.zip | xargs rm -rf 撤销tar解压 tar …...

编译官方原版的openwrt并加入第三方软件包

最近又重新编译了最新的官方原版openwrt-2305(2024.3.22),此处记录一下以待日后参考。 目录 1.源码下载 1.1 通过官网直接下载 1.2 映射github加速下载 1.2.1 使用github账号fork源码 1.2.2 创建gitee账号映射github openwrt 2.编译准…...

PC适配移动端

**手机端适配** 媒体查询 组件统一样式 媒体查询写四套样式 手机 屏幕宽小于768px 平板 屏幕宽 大于等于768px 小于992px 桌面显示器 屏幕宽大于等于992px 小于1200px 大屏幕 屏幕宽大于等于1200px **页面整体及页面内容** 页面看是需要主PC还是主移动端 主移动端的话…...

springboot+vue+mybatis灵活就业服务平台+PPT+论文+讲解+售后

随着网络科技的不断发展以及人们经济水平的逐步提高,网络技术如今已成为人们生活中不可缺少的一部分,而微信小程序是通过计算机技术,针对用户需求开发与设计,该技术尤其在各行业领域发挥了巨大的作用,有效地促进了灵活…...

Android 13 系统自定义安全水印

效果 源码实现 frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java public final void showSafeModeOverlay() {View v LayoutInflater.from(mContext).inflate(com.android.internal.R.layout.safe_mode, null);WindowManager.Layout…...

C# WCF服务(由于内部错误,服务器无法处理该请求。)

由于内部错误&#xff0c;服务器无法处理该请求。有关该错误的详细信息&#xff0c;请打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为)以便将异常信息发送回客户端&#xff0c;或打开对每个 Microsoft .NET …...

利用github pages建立Serverless个人博客

利用github pages建立Serverless个人博客 概述 使用github pages&#xff0c;可以在github上部署静态网站。利用这个功能&#xff0c;可以很方便地实现个人博客的发布托管。 比如我的个人博客&#xff1a;Buttering’s Blog 对应代码仓库&#xff1a;buttering/EasyBlog: 自…...

Spring Boot 集成 sa-token 实践教程

Spring Boot 集成 sa-token 实践教程 sa-token 是一个轻量级且功能强大的权限认证框架&#xff0c;它基于Java语言&#xff0c;专为Java开发者设计&#xff0c;以简化权限管理的复杂性。在Spring Boot项目中集成sa-token&#xff0c;可以快速实现会话管理、权限控制等功能。本文…...

CSS:盒子模型

目录 ▐ box—model概述 ▐ 盒子的组成 ▐ 内容区 ▐ 内边距 ▐ 边框 ▐ 外边距 ▐ 清除浏览器默认样式 ▐ box—model概述 • CSS处理网页时&#xff0c;它认为每个标签都包含在一个不可见的盒子里. • 如果把所有的标签都想象成盒子&#xff0c;那么我们对网…...

django中的cookie与session

获取cookie request.COOKIE.GET 使用cookie response.set-cookie views.py from django.http import HttpResponse from django.shortcuts import render# Create your views here. def cookie_test(request):r HttpResponse("hello world")r.set_cookie(lan, py…...

环形链表(判断链表中是否有环)的讲解

一&#xff1a;题目 二&#xff1a;思路讲解 1&#xff1a;采用快慢指针的方法&#xff0c;一个fast指针一次移动两个节点&#xff0c;一个slow指针一次移动一个节点。 2&#xff1a;两个指针从头指针开始往后遍历&#xff0c;如果fast指针或者fast->next 有一个为空&…...

NLP(14)--文本匹配任务

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 步骤&#xff1a; * 1. 输入问题 * 2. 匹配问题库&#xff08;基础资源,FAQ&#xff09; * 3. 返回答案文本匹配算法&#xff1a; 编辑距离算法(缺点) 字符之间没有语义相似度; 受无关词/停用词影响大; 受语序影响大 Jaccar…...

MySQL——系统变量

使用 #最大连接用户数 select MAX_CONNECTIONS; #临时存放构成每次事务的SQL的缓冲区长度 select BINLOG_CACHE_SIZE; #SQL Server的版本信息 select VERSION; 查询结果...

「 网络安全常用术语解读 」漏洞利用预测评分系统EPSS详解

1. 概览 EPSS&#xff08;Exploit Prediction Scoring System&#xff0c;漏洞利用预测评分系统&#xff09; 提供了一种全新的高效、数据驱动的漏洞管理功能。EPSS是一项数据驱动的工作&#xff0c;使用来自 CVE 的当前威胁信息和现实世界的漏洞数据。 EPSS 模型产生 0 到 1&…...

理解python中的Iterator 和 Iterable 迭代器和可迭代对象

为什么有些对象可以用for … in 循环 我们先看一段代码&#xff1a; list [1, 2, 3, 4, 5]for i in list:logger.info(i)这代码定义了1个数组object list, 然后用 for … in 来遍历这个list 看起来合理没什么值得注意 但其实 for … in 后面对象还可以是个String for i in …...

C语言实现动态加载.so动态库,使用,错误捕获以及卸载

动态库 概述 动态库的扩展名是.so。 动态库是被加载&#xff0c;调用的时候是根据内存地址去调用&#xff0c;而不是将代码复制到文件中。 动态库可以同时被多个进程使用。 实战案例&#xff1a;构建 libmath.so 动态库 准备源文件 calc.h 定义加法&#xff1a;int add…...

《动手学深度学习》V2(11-18)

文章目录 十一、二 模型选择与过拟合和欠拟合1、模型的选择2、过拟合和欠拟合3、估计模型容量4、线性分类器的VC维5、过拟合欠拟合的代码实现 :fire:①生成数据集②定义评估损失③定义训练函数④三阶多项式函数拟合⑤线性函数拟合(欠拟合)⑤高阶多项式函数拟合(过拟合) 十三、权…...

web前端之excel转pdf、小黄人发送请求、base64、jspdf、xlsx

MENU 前言方案一方案二结束语 前言 在前端将Excel转换为PDF有多种方案&#xff0c;本文介绍两种简单方案。 方案一 使用jspdf库&#xff0c;先将Excel文件转成Base64格式&#xff0c;然后再使用jspdf库将其转换为PDF格式&#xff0c;最后使用saveAs函数下载PDF文件。 步骤一: 安…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...