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

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

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

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

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

5842 次点击
所在节点    程序员
68 条回复
mxT52CRuqR6o5
2022-06-01 18:23:40 +08:00
视频还要考虑播放的问题,需要可以流式的获取到从头到尾的帧数据,这个问题你考虑过吗
mxT52CRuqR6o5
2022-06-01 18:25:41 +08:00
就比如我需要拖拽进度条到中间位置,播放器需要快速获取到视频中间位置的帧数据
像 RAR 那种压缩算法,解压得从头开始解压,要咋完成播放功能呢?
mxT52CRuqR6o5
2022-06-01 18:30:41 +08:00
还有就是 7z 压缩时可以选择字典大小和单词大小,字典大小调大会增加压缩时的内存使用,单词大小调大会增加压缩时的 cpu 使用(增加压缩时间),要是按你的设想压缩视频就得把这两个参数设的很大去匹配帧数据,这所增加的代价你考虑过吗
nthhdy
2022-06-01 18:51:29 +08:00
@oldshensheep

> 楼主大概的意思是把 一捆图片 打个压缩包(固实压缩),然后就变成了视频吧。(大概)
逻辑上来讲,视频的确可以看成时间上离散的一系列图片。虽然在文件格式当中并不是这样的。

> 然后楼主认为,压缩程序应该能够提取出这些图片间的相似处,达到更高的压缩率。所以我们为什么不用压缩软件来压缩视频?
我这个问题的确是想问,是否存在某种通用压缩算法,绕过“帧”这种概念,直接去掉重复的部分。
nthhdy
2022-06-01 18:55:26 +08:00
@mxT52CRuqR6o5

> 就比如我需要拖拽进度条到中间位置,播放器需要快速获取到视频中间位置的帧数据
说的对,有道理。
nthhdy
2022-06-01 18:56:16 +08:00
@systemcall

我知道效果会很差的。
不过还是值得试一下,我好奇。
ipwx
2022-06-01 19:04:41 +08:00
@nthhdy “ 引入运动预测等机制,即使无损也能一定程度上提高压缩比。”

呃,真的存在无损运动预测压缩算法嘛
loopinfor
2022-06-01 19:08:02 +08:00
@nthhdy 当然可以通用压缩算法压缩视频文件啊。
你可以简单用图片做个实验。随便一张图片保存为 BMP 格式,然后压缩为 ZIP 文件,压缩之后大小基本上跟 PNG 和 JPEG 差不多。
问题是视频这样压缩之后就没法直接解码播放了啊,1GB 的视频你只能全部解压才能开始播放。
nthhdy
2022-06-01 19:14:10 +08:00
@ipwx 有损发生在 DCT 变换之后数量化和去掉高频分量这一步。

即使不做数量化,不去掉高频分量,运动补偿和运动预测还是有用的,因为会让 P 帧表示的残差非常小。
压缩这一帧,相当于压缩一张几乎“全黑”的图片。还是会比压缩一张一般图片小一些的。
GeruzoniAnsasu
2022-06-01 19:21:20 +08:00
> 我这个问题的确是想问,是否存在某种通用压缩算法,绕过“帧”这种概念,直接去掉重复的部分。



有没有一种可能,就是通用算法的效率远远不如专用的视频压缩算法
jhdxr
2022-06-01 19:30:13 +08:00
@nthhdy
『我这个问题的确是想问,是否存在某种通用压缩算法,绕过“帧”这种概念,直接去掉重复的部分。』
你好,有的。常见的压缩软件就是干这件事情的。


那为啥我们不这么做呢?
压缩比太低,在针对图片视频这个场景下有更高效的针对特定场景的压缩方法。
rus4db
2022-06-01 19:30:29 +08:00
香农第一定理(无失真信源编码定理)表明,楼主所说的“通用压缩算法”是存在的。
但是对于音视频这种与人类感官有关的信息,由于感官对于失真有一定的容忍度,此时就可以运用香农第三定理(保真度准则下的信源编码定理),在 rate 和 distortion 之间寻求平衡。其中 R(D)的选取和优化是关键。变换域编码、帧间 /帧内预测等编码工具,以及拉格朗日等优化算法,都是实现率失真优化的手段。视频、音频、点云等不同“模态”的信息,其失真度量和 R(D)都是不同的。
失真度量是关键,反映了信源的内在性质。例如 MP3 、AAC 等标准,都大量引入了心理声学算法,衡量不同场景下编码失真与人类听阈之间的关系,用来引导码率-失真优化循环来寻找最优编码参数。
总结起来就是,根据香农第一定理,只用熵编码固然是可行的,因为它是通用的。但是对于特定模态的数据,可以容忍一定的失真,因此可以在失真和码率之间权衡,此时适用香农第三定理。
tinytoadd
2022-06-01 19:31:49 +08:00
视频一般都要支持流式传输吧,如果只用哈夫曼编码,岂不是播放视频之前要先全部载入内存再解码。
haah
2022-06-01 20:35:47 +08:00
statumer
2022-06-01 20:51:33 +08:00
作为搞视频编码器的,我建议你去学一下信息论与编码这个课

视频编码器和 huffman 编码器之间的差距是 huffman 编码等熵编码技术只能学习到连续的比特特征,学习不到高层次的特征,比如说衣服上的花纹,台球的运动

如果你的视频内容不是正常的视频,而是一堆完全随机的色彩,那么熵编码器其实效果比视频编码器更好,因为视频编码器实际上是针对常见视频设计的。

另外就是 RDO 优化的问题,视觉内容是容忍失真的,视频编码器也有 PCM 模式,视频编码器有 RDO 优化器决定是否采用无损模式。大多数情况不会用,因为无损模式 RD Cost 绝大多数情况都很差。

https://imgur.com/lWwybSL.png
akira
2022-06-01 21:04:20 +08:00
假如,发现了某种算法,能更好的无损压缩视频数据,那么基于他改进的有损压缩只会更好。
AX5N
2022-06-01 21:27:58 +08:00
你怎么知道没用?
mxalbert1996
2022-06-01 21:52:10 +08:00
楼主可能根本就没有意识到现代视频编码的压缩率有多小,常见的 H264 视频,相对未压缩的 RAW 格式的压缩率是千分之一这个级别的,再不济也有百分之一,你文本压缩能有这个压缩率?更何况视频本来就比文本复杂得多。
msg7086
2022-06-01 23:56:54 +08:00
因为只用熵编码无法满足人们对压缩的需求。熵太高了,容量下不去。
dant
2022-06-02 00:09:00 +08:00
> 即使不做数量化,不去掉高频分量,运动补偿和运动预测还是有用的,因为会让 P 帧表示的残差非常小。
压缩这一帧,相当于压缩一张几乎“全黑”的图片。还是会比压缩一张一般图片小一些的。

你要找的是不是:qp=0 的 h264

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

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

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

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

© 2021 V2EX