热门标签 | 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 :_)

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



推荐阅读
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 阿里巴巴终面技术挑战:如何利用 UDP 实现 TCP 功能?
    在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用 UDP 实现 TCP 功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对 UDP 和 TCP 在原理上的差异的理解,以及如何通过 UDP 实现类似 TCP 的可靠传输机制。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • 在《Linux高性能服务器编程》一书中,第3.2节深入探讨了TCP报头的结构与功能。TCP报头是每个TCP数据段中不可或缺的部分,它不仅包含了源端口和目的端口的信息,还负责管理TCP连接的状态和控制。本节内容详尽地解析了TCP报头的各项字段及其作用,为读者提供了深入理解TCP协议的基础。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 通过利用代码自动生成技术,旨在减轻软件开发的复杂性,缩短项目周期,减少冗余代码的编写,从而显著提升开发效率。该方法不仅能够降低开发人员的工作强度,还能确保代码的一致性和质量。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • CTF竞赛中文件上传技巧与安全绕过方法深入解析
    CTF竞赛中文件上传技巧与安全绕过方法深入解析 ... [详细]
  • Kafka 是由 Apache 软件基金会开发的高性能分布式消息系统,支持高吞吐量的发布和订阅功能,主要使用 Scala 和 Java 编写。本文将深入解析 Kafka 的安装与配置过程,为程序员提供详尽的操作指南,涵盖从环境准备到集群搭建的每一个关键步骤。 ... [详细]
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社区 版权所有