外观
视频编码是如何把视频压小几千倍的?
一句话回答:视频编码的本质是"找相同"——相邻帧之间只存差异(帧间预测)、帧内相似色块用预测代替存储(帧内预测)、物体移动用运动向量描述(运动估计)。仅 2003 年的 h264 就能把 30 帧从约 182250 KB 压到 62 KB,体积缩小约 2900 倍。
原理一:帧间预测——只存差异
把视频逐帧拆开看,相邻帧之间绝大部分是重复信息。编码器只存储少量关键帧(I 帧,包含完整画面信息),前后的帧只记录与关键帧的差异。
用视频分析软件观察一个 h264 视频:关键帧约占 26 KB,而周围只记录差异的帧只有几百字节。平时看视频遇到的"画面糊成一团重影",就是传输中关键帧丢失、只剩差异数据的结果。
原理二:帧内预测——关键帧自身也能压
关键帧本身也不是原样存储。h264 把图像分割成 16×16 像素的小方块(画面复杂处继续细分),然后对每块做预测:
- 与周围颜色一致的块,用简单的 DC 直流模式表示;
- 有方向性纹理的块,用斜向预测模式存储。
通过"预测 + 只存预测残差",关键帧的数据量大幅减少。
原理三:运动估计——用向量描述移动
画面中的物体在运动,帧间做差异时可以引入运动向量:描述"这块像素往哪儿移了多少",再通过插值生成中间像素。有了运动估计,帧间预测的编码效率进一步提升。
编码与解码:编词典和查词典
压缩的本质是找相同:把相同的色块、相同的运动方式提取出来,编成一本"词典"——这是编码。播放时再查词典,把抽象出的数据还原成画面——这是解码。
代价是算力:关键帧点开秒加载,而只存差异的帧需要根据前几帧现场算出来。压缩率越高的编码,编解码耗时越长,反映到手机上就是发热更多、耗电更快。
一组数字感受压缩威力
- 1080p 未压缩:每帧约 6075 KB,50 帧/秒时码率约两百万 kbps;
- 10 秒简单动画:未压缩 2.89 GB → 压缩后 3.78 MB(782 倍);
- 30 帧画面:未压缩约 182250 KB → h264 编码后约 62 KB(约 2900 倍);
- 1994 年的 MPEG-2 婚礼光盘:54 分钟视频 700 MB,分辨率低画质差——对比之下现代编码"体积更小画质更好"是实打实的技术进步。
常见误区
- "压缩必然损画质" —— 消除的主要是帧间冗余和空间冗余,在合理码率下肉眼几乎无法分辨。
- "文件后缀(avi/mp4)决定压缩效果" —— 后缀只是封装格式,真正决定体积和画质的是内部的编码(MPEG-2、h264、h265 等)。
相关条目
作者:人工大黑 · 转写自视频《从avi到mp4,视频如何缩小为原来的1/1000?》
