热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ffmpeg缩放算法_FFmpeg系列文章:说说scale过滤器,更好地执行画面缩放

引言我们每天都在使用的抖音,快手,西瓜视频等APP,里面有为数众多的视频文件。对于这些文件,我们需要考虑各个手机厂商的品牌手

引言

我们每天都在使用的抖音,快手,西瓜视频等APP,里面有为数众多的视频文件。对于这些文件,我们需要考虑各个手机厂商的品牌手机分辨率不同,宽高比不同。而视频发布者所上传的视频文件,格式画质帧频等等各不相同。

那么为了让用户取得更为优质的体验,就需要对原始音视频文件进行深度处理。

今天我们来说一说ffmpeg工具内的scale过滤器,很显然从字面上理解,这个是缩放的!

下面这张是本文所使用的原始图片,分辨率 535x346。

简单缩放

如果想要简单地把图片resize为指定的宽高 320x240,可以使用 scale 过滤器的基本用法:

ffmpeg -i input.avi -vf scale=320:240 output.avi

用于缩放图片也一样有效:

ffmpeg -i input.jpg -vf scale=320:240 output_320x240.png

原始图片经过这么变换后,是这个样子:

你也看到了,前后宽高比不同,画面出现了拉伸。

保持宽高比缩放

如果想要保持宽高比,那么我们需要先手动固定一个元素,比如宽度,或者高度,然后另外一个视情况而定。用下面的写法:

ffmpeg -i input.jpg -vf scale=320:-1 output_320.png

上面的指令,先固定宽度=320px,高度则根据情况裁切。保证了图片不变形。最终图片呈现为 320x207 的分辨率。如下:

一些编码器会要求宽度/高度是n的倍数,那么可以将 -1 指定为需要的值,如下:

ffmpeg -i input.jpg -vf scale=320:-2 output_320.png

这样得到的就是一个 320x206 像素的图片。

使用变量

ffmpeg 过滤器内置了很多非常有用的变量,我们可以方便地使用,并组装成功能复杂的用法。比如把宽度拉伸2倍:

ffmpeg -i input.jpg -vf scale=iw*2:ih input_double_width.png

图片处理后长这样:

如果是宽高都缩放到原始图片的一半,则可以是乘以 0.5 或 除以 2,像下面这样写:

ffmpeg -i input.jpg -vf "scale=iw*.5:ih*.5" input_half_size.png

ffmpeg -i input.jpg -vf "scale=iw/2:ih/2" input_half_size.png

避免图像放大

有时缩放图像,但如果尺寸太低,想要避免将其放大,我们可以使用 min 来限定:

ffmpeg -i input.jpg -vf "scale='min(320,iw)':'min(240,ih)'" input_not_upscaled.png

上述命令,宽度最多 320 像素,高度最多 240 像素。如果是低于此像素值的,会保持原始值。

适配固定宽高比的窗口

我们经常见到在短视频中分屏显示,比如用户喜欢玩的同步动作,需要将视频装进固定的窗口内,要怎么样操作呢?

这个时候你需要 force_original_aspect_ratio 选项,它提供两个值:decrease:输出视频自动减小

increase:输出视频自动增大

下面的指令将原始图片强制装进一个 320x240 的盒子,并保持宽高比缩小比例:

ffmpeg -i input.jpg -vf scale=w=320:h=240:force_original_aspect_ratio=decrease output_320.png

输出的图片分辨率 320x207,跟前面贴出的那张一致:

缩放到矩形区域之后,画面还会有一些空白,我们可以使用 pad 选项填充黑边:

ffmpeg -i input.jpg -vf "scale=320:240:force_original_aspect_ratio=decrease,pad=320:240:(ow-iw)/2:(oh-ih)/2" output_320_padding.png

上述指令有几个常量需要注意,这是经常使用的常量:iw:输入图片宽度

ih:输入图片高度

ow:输出图片宽度

oh:输出图片高度

高阶:指定缩放算法

你可以使用 -sws_flags 选项指定缩放所使用的算法。比如明确指定使用 bilinear 代替默认的 bicubic 算法:

ffmpeg -i test.tif -vf scale=504:376 -sws_flags bilinear out.bmp

要同时适用多个算法,那就用 + 号连起来写:

-sws_flags lanczos+full_chroma_inp

或者不使用该选项,直接在 scale 过滤器内指定:

-vf scale=1920x1080:flags=lanczos

写在最后

不要着急,一天一个知识点,把每个知识点弄懂,并且熟练掌握,自然水到渠成。

ffmpeg 功能丰富繁杂,初学者易望而却步,掌握方法循序渐进,才是正道。

Happy coding :_)

我是 @程序员小助手 ,持续分享编程知识,欢迎关注。



推荐阅读
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 计算机视觉初学者指南:如何顺利入门
    本文旨在为计算机视觉领域的初学者提供一套全面的入门指南,涵盖基础知识、技术工具、学习资源等方面,帮助读者快速掌握计算机视觉的核心概念和技术。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 自学编程与计算机专业背景者的差异分析
    本文探讨了自学编程者和计算机专业毕业生在技能、知识结构及职业发展上的不同之处,结合实际案例分析两者的优势与劣势。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 获得头条Offer后,我感激的七个技术公众号
    是否感觉订阅的公众号过多,浏览时缺乏目标性,未能获取实质性的知识?本文将介绍如何精简公众号列表,提升信息吸收效率,并推荐几个高质量的技术公众号。 ... [详细]
author-avatar
Metoo婧婧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有