超硬核!图片压缩15%画质,节省85%空间!ffmpeg权威指南 [1]入门
本文索引
ffmpeg是什么
官方参考资料
了解相关常识
学习如何使用
首先,自我介绍
手机编辑:因为smzdm不允许引用Github链接,所以请读者搜索引擎自行检索
本文与上篇不同,属技术类指南,旨在保证内容质量和严谨,用词无法做到欢乐恶狗
本文具有权威性,但个人水平还是过于拙劣,出现错误还请指出,我将直接自行举报打回修改
本文仅作为快速上手教程,细节补充,内容冲突或过时,以官方文档为准
本文由zmxyz原创,同步发布在个人博客,使用CC-BY-ND 4.0许可证共享(原作署名,禁止商业使用,禁止二次创作分发),垃圾营销号照搬小心我向搜索引擎/托管平台发dmca嗷,规范转载请在评论区留下你转完的url
同时,本人会对文章内部引用的内容进行链接,尊重他人创作成果
本文参加数码达人评选,按照tag检索了解到,数码板块包括软件技巧
同时因为符合标准,我必须向这篇文章植入一个商品链接,可以保证没有利益关联,自营官方直达,没有返利(对于我来说没有,smzdm会不会有就不确定了)
当然也是站在个人角度推荐,应该是大厂里相对便宜的128g卡了,支持u3(顺序写入高于30MByte/s)a2(随机iops大于4000)标准,十年质保,送卡套,玩坏了直接保修,在我这个dev眼里作为开发板的引导盘算是合格了
双十一没有便宜,日常价一直都是64.9块128g,还算稳定,毕竟消耗品,缺时买就完了
做个测试,证实我的标题
Pexels:Athena(图片来源)
忽略我用Windows终端但使用bash语法,因为开发用到gcc使用了一个叫msys2的工具链
语法自行转义,Windows用户尽量使用PowerShell而不是cmd
Linux用户请在glibc环境下使用,musl翻车后果自负
5205808/369016=14.10726906150411
369016/5205808*100%=7.088544179885236%
压缩后体积减少了不只85%!!!
而画质没有明显下降,无论放大与否
所以我们要开始学习:
ffmpeg是什么
FFmpeg 是一个开放源代码的自由软件,可以执行音频和视频多种格式的录影、转换、串流功能,包含了libavcodec——这是一个用于多个项目中音频和视频的解码器库,以及libavformat——一个音频与视频格式转换库。
--Wikipedia
ffmpeg项目,它是个库,同时也是个工具
你可能觉得命令行调用非常原始,但更疯狂的是,它可以由开发者编写代码嵌入在其他程序里使用
你曾经用过带图形界面的转码工具,有90%以上的可能调用ffmpeg执行的
你所使用的每一个和音视频图片相关的app,也都可能有引用过它的代码
同时,作为一个开源项目,任何人可以在遵循其许可证的情况下任意使用项目产出
这么一看,哇,是不是很厉害,更厉害的还在后面,建议看完自己动手试试
我所期望读者具备的能力,如果你不会但愿意认真学习,那也是好样的!
会操作任意平台的shell
了解相对与绝对路径
对音视频图片常识有些许了解
能阅读英文文档(开翻译工具也行)
会提取错误信息,尝试检索并解决
尝试后无法解决可以寻求帮助,注意遵循 提问的艺术(Github:ryanhanwu/How-To-Ask-Questions-The-Smart-Way)
官方参考资料
首先,全部为官方或官方认可的资料,没有误导和过时
本文仅作为快速上手教程,细节补充,内容冲突或过时,以官方文档为准
Github:btbN/FFmpeg-Builds(这是一个ffmpeg二进制的自动化构建仓库,受到官方认可)
ffmpeg:ffmpeg Documentation(ffmpeg官方文档,建议仔细阅读)
ffmpeg:HWAccelIntro(ffmpeg硬件加速支持情况)
Codecs(ffmpeg编码器支持情况)
非官方参考资料
首先我们要知道,ffmpeg官方并不直接提供二进制可执行文件,他们的下载页面指向了志愿者提供的自动化构建服务,而btbN的仓库对于Linux和Windows下多种硬件图形卡都有支持,所以推荐使用
构建命名解释
ffmpeg-master-latest-linux64-gpl-shared.tar.xz
ffmpeg-[分支]-[git提交hash]-[平台]-[许可证]-[库的链接类型].[归档格式]
分支是指大版本号,git提交hash代表每个pull request的唯一id,如同安卓9和安卓10,两者同时存在,但也同时进行维护,直到EOL生命周期结束,如果不追求特定老版本,就直接使用master或最新代号(目前是n5.5)即可
平台我就不用解释了,Linux就Linux,Windows就Windows
许可证分为gpl和lgpl,后者相比前者更为宽松,可以以链接库的形式引用于商业软件
链接方式如果有提示shared,就表示文件是散装的,库 文档 头文件都在目录里,适合开发者调用,没有shared的压缩包里就只有三个可执行文件
归档格式也不提了,什么平台用什么工具就行
ffmpeg官方文档
建议仔细阅读,这几个官方链接比搜索到的一堆二手教程有用的多,有什么参数不懂就 Ctrl+F 搜
比如我想了解后续文章中,"-vf scale=iw/2:ih/2"的意义,我可以直接搜索flag名"-vf",而不是带全部参数,我们就可以得到
Simple filtergraphs are configured with the per-stream -filter option
(with -vf and -af aliases for video and audio respectively).
A simple filtergraph for video can look for example like this:
而不是打开浏览器 -> 输入"ffmpeg -vf scale 是什么意思" -> 然后在一堆过时内容里寻找二手信息
了解相关常识
命令行从入门到精通
首先我们先下载一个ffmpeg预构建包,解压并cd到目录下
拿处理一张照片举例,因为照片处理时间短,效果显著,不需要了解各种参数和配置硬件加速
./ffmpeg -i input.jpg output.webp
#usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
这段命令中,
"./ffmpeg.exe"指命令行执行当前目录下的ffmpeg,你也可以写入环境变量或者用绝对路径执行
"-i input.jpg"这个flag表示应该将相对路径下的input.jpg作为输入文件
"output.webp"表示文件将以webp格式输出
没有指定任何质量参数时,webp默认会保持原像素,以质量75%进行采样,以libwebp编码器处理
此时没有指定编码器,是因为webp格式和编码高度绑定,ffmpeg将.webp扩展名作为默认参数,但在视频处理上常常有不同编码共用一个容器格式的情况发生,这时如果不想出现问题,就应该手动指定
vcodec(视频)
acodec(音频)
codec(图片)
理解这些以后,你会发现所有参数都是以flag形式传入的,flag应当放在input文件名和output文件名中间(其他位置无效),带单或双横杠的叫flag,没跟杠的叫做flag传递的参数
所以"-i input.jpg"是一组flag参数
而output.webp则是ffmpeg的参数
编码质量小课堂
上述提到,如果使用libwebp不指定编码质量会以75%采样,这是大家所认可性价比比较高的一个值
测试过50%和25%,感觉性价比不高,带来的体积减小有限,反而对画面大砍了一道,所以没啥用
但如果你有别的想法,像极限压缩,或者无损转码,那么可以追加以下flag参数
设置质量
-q [0-100]
设置无损,1=True,0=False
--lossless [0,1]
那么进阶一下,我要开始追加参数了
我是怎么压缩图片的
编码器参数硬件加速乱七八糟的东西可以专门水114514篇文章,这次只拿webp举例,这是一个压缩比很高,很适合网络传输的标准,兼容性也很强,适用于全部现代浏览器和第三方看图工具
配合开头的几张图片食用更佳
我的参数
./ffmpeg -i input.jpg -vf scale=iw/2:ih/2 output.webp
这个命令就是我开篇所演示的,但我为什么要这么设置呢?(当然,以下素材为私人使用,就不放上来了)
因为多数情况下,单反拍摄出6720*4480的图片画幅过大,而常规笔记本仅有1080p分辨率,所以直接通过追加flag参数
-vf scale=iw/2:ih/2
长宽重设为原有的一半(0.5*0.5,所以总像素是以前的是0.25)
在文档中,-vf指video filter,视频过滤器,在ffmpeg中,图像会被当做1帧视频处理
没有指定质量,保持默认参数
所以,在webp重编码,质量取75%,分辨率重设到四分之一,这么一套灵活操作,我们的体积从
12.7MB -> 155KB
FREAKING AWESOME RIGHT?!在不缩放的情况下浏览,效果基本一致
当然,我们也鼓励大家尝试不同的参数,如果你想折腾质量,参考上面的"编码质量小课堂",测试出更适用于你的图像
对于编码用时,我的机器是Intel i5 1035G1,10nm工艺,4核心8线程,16g内存,pcie3.0总线的sn730固态
frame= 1 fps=0.9 q=-0.0 Lsize= 156kB time=00:00:00.04 bitrate=31167.6kbits/s speed=0.0359x
video:156kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000000%
可以看到,用时无限接近0,一秒钟可以处理25张这么高质量的图像,如果用脚本并行处理还会更快
我想草率结尾
一张Meme送给看到这里的你们,理解万岁!
因为上一篇文章反响一般,还是做我想做的事吧!后面会继续更新ffmpeg处理音频,视频,工具链,硬件加速,码率控制器,编码格式和生态相关文章的!
最后,一张Meme送给我自己
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
WittmanARC
可以试试把复杂的主题拆分成多篇文章,逐篇深入地把每一点细节和每一个名词都讲清楚。
校验提示文案
zmxyz
校验提示文案
鴻上
校验提示文案
鴻上
校验提示文案
WittmanARC
可以试试把复杂的主题拆分成多篇文章,逐篇深入地把每一点细节和每一个名词都讲清楚。
校验提示文案
zmxyz
校验提示文案