为什么图片视频不直接使用类似 huffman 这种熵编码压缩呢?

2022-06-01 13:31:28 +08:00
 nthhdy

假如不考虑图片视频利用人类视觉特点的有损压缩,只讨论无损压缩。

熵编码实现压缩,是利用了数据流里“重复出现的部分”,把这些重复部分代换成更短且能一对一无歧义还原的片段,就实现了压缩。

那么图片、视频中其实也有“重复的部分“。比如,视频压缩中利用相邻帧之间变化很小这一特点,那是不是可以说,相邻帧之间“重复的部分”非常多呢?(虽然不是完全重复,至少可以说很类似。)既然重复的部分很多,是不是可以用更 smart 的熵编码算法来直接压缩呢?

6761 次点击
所在节点    程序员
68 条回复
msg7086
2022-06-02 00:18:02 +08:00
> 那这是不是因为熵编码还不够优化,方法还不够好呢?
够好了。只是熵编码是有理论极限的,这个极限远远比我们现在用的视频编码技术要惨。

比如,一集 30 分钟 1080P30 YUV420P8 的电视剧的容量大概是 168GB 。
其中的信息熵,少说也有 20G 以上。
也就是说,在你没有找到突破宇宙物理极限的方法之前,是绝对不可能无损压缩到信息熵容量以下的。
等人类科技发展到能够高速航行宇宙征服太阳系了都不一定能把这集电视剧无损压缩到 20G 以下。

而 15 年前的 x264 就可以轻易压缩到 500MB 。

你说的「更 smart 的熵编码算法」可能是在讨论数万年甚至数十万年后的科技了。
mikewang
2022-06-02 00:23:37 +08:00
首先,目前来看,Huffman 编码本身不够优秀,因为概率要是 2 的幂次方时才达到熵,压缩比不如算数编码。
其次,视频的压缩不仅要考虑压缩本身,还要考虑到播放的功能,比如跳跃到某时间点、流播放等等,所以“帧”“关键帧”等等概念还是有必要的。
然后,有损处理肯定是必要的,这种方式可以简单而又明显地减少文件大小。

这是一系列因素互相妥协的结果。不仅考虑到压缩比,还要考虑到解码效率,功能性等等。
msg7086
2022-06-02 00:50:58 +08:00
我又仔细读了一下你的帖子,再补充一些吧。

无损压缩本质上是从数据里尽可能去掉冗余数据,尽可能让残留的数据接近信息熵极限。
视频编码有很多步骤都是去掉冗余数据,减少信息量的行为。
你说的运动预测帧内预测频域变换这些,都属于去掉冗余数据,减少信息量的行为。

熵编码是无损压缩算法里比较低效率的一种,因为它是介质特征无关的编码。
一个工程师拿到了熵编码以后,他肯定会想办法去改进它,比如增加对介质特征有关的处理。
你说了「通用压缩方法还没有发现这些重复」,就是因为这些重复数据不能被通用压缩方法所发现,而需要针对特征的算法来辅助发现。

比如说有一张图片,我们做一个淡出淡入的效果,从图片过渡到全黑画面,30 帧。
这 30 帧,每帧的数据都不一样,因为他们的亮度不一样。
如果你要直接做熵编码,效率就非常低,因为熵编码不会考虑大段数据同步偏移的情况。
而视频编码器就可以针对这种场景进行优化。

不管熵编码效率有多高,视频编码器总是能站在熵编码的基础上继续进行改进,加入针对特征的处理。
msg7086
2022-06-02 01:08:39 +08:00
然后像#61 以及其他人说的一样。

视频的帧是它的硬性特征。你播放视频的时候,就是一帧一帧播放的,你不可能脱离帧的概念去编码。
比如播放蓝光光碟的时候,播放器是逐步读取文件,一帧一帧解码的。
不可能先花 20 分钟,把整个光盘 50G 内容全部读取出来,然后在 256G 的内存里解压缩,然后再开始播放吧?
算法必须要有办法把解码每一帧的数据限制在一定的范围内。
比如你要解码第 10000 帧,那么就必须要在读取 10000 的前后几十帧之后就能解码出 10000 帧。
再比如串流播放,像是直播,你不可能先让观众等个半小时,等直播结束了,打包熵编码完了以后再播出吧。

现在的视频编码器技术都是那些电视台或者视频音频相关的企业资助开发的。
就算你说的能突破宇宙极限的熵编码存在,谁投钱给你去研发呢。
你说 NHK 或者 BBC 投几千万给你研发一个让观众等半小时才能看到节目的编码技术吗?

没钱还开发个 P 。

其实就算是视频编码圈子内部也是这样。你看看 VP9 ,没有商业环境支撑,现在是什么个鬼样。这已经是有谷歌这个金主投钱的结果了。反观 x264 x265 这种商业产品,有钱才有动力开发,才能把编码标准发挥到比较好的状态。HEVC 2013 年定稿,x265 2013 年就开始开发,到前几年就已经成熟了基本停止开发了,最多折腾些 HDR 之类的新技术。AV1 2018 年定稿,现在还是半个笑话,连个成熟好用的编码器都没有,至今还只在在线视频网站内部用。
wizardyhnr
2022-06-02 01:48:02 +08:00
png 就是无损的啊,下一代 jpeg xl 无损压缩可以比 png 大概再小一半。楼主可以研究一下
xuboying
2022-06-02 11:31:20 +08:00
虽然完全是个外行,但是感觉可以这么解释,视频采集制作是 CMOS 的记录结果,但是播放是给人眼球接收的。CNOM 记录了额外的人眼球消化不了的信息,所以可以用额外的技术剔除这些信息,减少文件尺寸。如果视频是 CMOS 记录,给电子眼看,那么现在所谓的高清编码输出对电子眼来说就是‘AV“画质。
whusnoopy
2022-06-02 11:58:09 +08:00
只说视频,如果内存够大,可以把编码后的视频文件都解码成帧到内存里(或别的显存缓存什么的都行),给显示设备输出时一帧一帧给就是了

实际情况是很多场景内存不够大,怎么把编码后的视频文件输出给显示设备呢?只能一段一段给,这时候 H.264 之类基于帧和前后压缩补偿就有意义了,看哪段取哪段,源文件也只用读一部分,内存里解码后的也只要放一部分

还有就是视频播放不一定是顺序的,会跳着看或拖回去,如果是全解码到内存当然可以直接操作,但如果每一帧都依赖前面所有帧信息才能得到,这就和全量解码没区别了,所以要有存全部信息的关键帧,后面跟若干差异帧,跳到指定位置时,用最近的一个全量信息关键帧,加到当前位置中间的差异帧做计算就好
nthhdy
2022-06-03 15:43:10 +08:00
@haah 这本书确实非常好,压缩领域的入门书籍。
各种算法的思路、基本原理、发展历史都很清晰,相当于这个领域的“地图”

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/856697

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX