这几天有朋友经常问我:“自己制作的视频太大了,自己的图片太大了如何高效的压缩而且尽量保证视觉损失不大呢?网上的各类压缩软件,网站都不太好使,或者不太灵活,肿么回事?”
我一看,哦,确实目前市面上的软件要不就收费,要不不太灵活可选择的配置的参数不多,要不就是网站打开后太卡或者满屏广告,而且不能批处理确实会给大家带来不方便。
所以今天我就手把手带大家来制作一个视频、图片压缩的小工具吧。
首先介绍一下我们今天主要用到的工具:ffmpeg。
FFmpeg: 是多媒体视频处理工具,具有非常强大的功能包括视频采集、视频格式转换、视频抓图、给视频加水印等。---解释来源:百度百科
实际上,做编解码,直播,推流等工作的同学们应该会对ffmpeg非常熟悉,这是一套完全开元的工具。
那今天我们就用这款专业强大而又免费开源的工具来实现高效视频压缩和图片压缩的功能吧~ (撸羊毛很开心)
首先就是大家首先要下载安装一个FFmpeg。
首先对于mac或者ubuntu系统:
ubuntu系统直接 sudo apt update
sudo apt install ffmpeg
mac系统稍显复杂推荐以下安装方式(测试有效)。
使用HomeBrew安装,HomeBrew是什么呢?为了防止套娃,我简单解释一下就是mac用来进行软件包管理的一个工具,用这个安装软件不用关心各种依赖和文件路径情况,直接命令行就可以调用。大家可以简单理解为ubuntu里面的apt。
那HomeBrew如何安装呢?
一种最简单的方式是,打开mac的terminal,然后输入:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install) 即可
如果你问我ruby是什么?简单解释就是一款面向对象语言,mac上自带。。
如果上面安装的方式你发现安装速度奇慢无比,那么请参考下面这一套详细的安装方案:
金牛肖马:Homebrew国内如何自动安装(国内地址)zhuanlan.zhihu.com好,现在装好HomeBrew了就可以一句话直接安装ffmpeg了:
brew install ffmpeg
Windows系统:
建议大家直接参考这篇帖子的安装方式
心悟:Windows下下载安装ffmpegzhuanlan.zhihu.com好,只要咱们顺利安装好ffmpeg,那么基本就已经成功了,剩下的就是要输入ffmpeg指令来完成视频、图像的压缩。
我们先介绍视频
先给出指令,还是打开命令行terminal:
命令格式如下:
ffmpeg -i 你要处理的视频路径 -r 帧率 -b:v 码率 -s 分辨率 输出文件路径
这里控制咱们压缩的主要是-r 帧率,-b:v 码率的设置 和-s 分辨率的控制和这三项。当然那ffmpeg还有更多可以设置的参数,但本次先暂时不做分享,会在之后更新更多的用法,比如设置是用什么编码方式264还是265等等。
这里咱们理解一下帧率,码率和分辨率这三个参数。
在理解这三个概念之前,我们先要有一个概念,视频其实是由一帧一帧的图片构成的,比如咱们老式的那种放映电影,都是靠片子胶片来播放视频的,具体可参考最近影院电影《一秒钟》,里面生动刻画了原来影片放映的全过程。
那此时帧率:我们就可以理解成1s中我们要放映多少个那种小长方形的片子。帧率越高我们观看的感受就越流畅,像以前大概16帧便达到了观看标准,那现在视频以22帧,30帧较多,而一些性能较高的摄像机排出的片子,帧率可达到60帧。
同样,帧率越高,我们视频就会越大,如果想要压缩视频,不如可以适当降帧率,比如如果将视频由30帧降到24帧,其实观赏主观看区别不是很明显,但视频大小将会降低。
第二个就是码率,码率这个概念我们可以先大概理解成每一帧用了多少信息(码字)来进行编码。码率设置越低,则主观上画面质量将会下降越多,视频就会越小。这个也很好理解对吧,我们每一帧存储的信息都变少了,画面细节丢失了,变得没那么高清了,自然大小就下来了。
(这里说句题外话:编解码本身比我上面说的要复杂很多,里面会有定位关键帧I帧、P帧、B帧的概念,然后利用视频前后帧之间的相关性来进行残差编码等等,这涉及到具体编码算法了,如果有同学感兴趣我之后专门开一篇文章细聊)
第三个是分辨率,我们可以理解成画面的大小,分辨越高,画面越大,空间占用越大。分辨率越小,画面越小,空间占用越少。这个很好理解对吧。
好那现在为了方便大家理解,我们实战一下,首先我用华为手机录了一段12s多的视频,信息如下:
我们可以看到视频大小4.1M,分辨率540x960为手机竖版摄像,帧率30,采用264编码,码率2354k
那么首先,我们保证帧率不变,分辨率不变,码率降为原先一半1277k会发生什么呢?
输入指令:ffmpeg -i test.mp4 -qscale 0 -r 30 -b:v 1277k output.mp4
(这里-qscale是指不改变视频播放速度,可不加)
我们得到output.mp4文件,我们看一下文件属性:
可以看到视频大小压缩了不到一半,视频播放观看体验基本和原版无区别。
当然我们可以设置码率更小,比如500k:
ffmpeg -i test.mp4 -qscale 0 -r 30 -b:v 500k output.mp4
此时视频大小变为1M
与原先相比压缩近四倍,但是此时打开视频可以看到在视频边缘会出现块效应,也就是帧间信息压缩过狠导致图像块马赛克的现象。
当然视频还可以选择更低的码率,但质量会进一步下降,所以具体我们想要压缩到多大,咱们可以自由控制选择到我们需要的层度。
下面我们试验一下帧率:
这里我们不选择对码率控制,那么直接设置帧率的时候,算法会自动帮我们选好合适的码率。命令如下:
ffmpeg -i test.mp4 -qscale 0 -r 24 output.mp4
观察输出结果:
可以看到文件大小从4M压缩到了1.4M,帧率降到24,码率随之也降低到适配程度。
打开视频观察,发现视频观看几乎没有受到影响。
很神奇对不对。
分辨率的实验就不做了,因为其实本质是一样的,将图像变下必然存储空间会下降,这个就不需要验证啦。
其实给予ffmpeg会有很多好玩的功能,比如加水印、变速播放什么的,今天我先讲到这里。
今天写的有点多,我先歇歇,内核现在已经有了,我下次会更新如何把ffmpeg包装做成一个更易用的软件,以及如何压缩图片。
希望看到这里的同学点个赞,给我一些鼓励,也同样mark下,下次更新不迷路~
先写到这里,咱们明天见~