当前位置: 首页 > 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文件。 步骤一: 安…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...