☰
Codec开始“学习”:神经视频编码如何重塑压缩技术
2026/10/1 4:21:52 网站建设 项目流程

如果你最近在写 Python 或者抓网页,对 codec 这个词最深的印象,大概率是UnicodeEncodeError: 'gbk' codec can't encode character这一长串报错。这东西最近在网络热词榜上刷了一波存在感,大家记住的却是一个字符串编码器把\ue687这种字符拒之门外的日常,而不是它在音视频领域的本业。但今天我要聊的,恰恰是音视频领域那个 codec:它在 2020 年之后开始被一批工程师和研究者动刀子,把深度神经网络塞进压缩链路里,于是有了"神经视频编码(Neural Video Coding)"这个以前只出现在论文里的玩法。

这不是一篇教你用 ffmpeg 压片的文章。我会尽量站在一个"既懂点视频编码、又踩过神经网络落地坑"的从业者角度,把三件事说清楚:传统编码器为什么走到需要"学习"这一步、神经网络在编码内部到底干了什么活、以及真把它跑起来以后工程上会撞上哪些墙。适合谁看?适合对视频编码有基本概念、又想了解 AI 压缩到底能不能落地的开发者;如果你刚入门,也不用怕,复杂概念我会用类比拆开讲。

1. 当"Codec"这个词先让人想到报错而不是视频

1.1 两种 codec:一个管字符串,一个管像素

先对齐一个概念。软件开发者嘴里的 codec,经常是 Python 里的gbk codec、utf-8 codec这类文本编码器,它们负责把字符映射成字节;而视频工程师嘴里的 codec,是 H.264、HEVC、AV1 这类视频编解码器,负责把像素画面压成二进制码流。前者处理的是字符串和字节的映射,后者处理的是几十万像素点的时空冗余。

这个混淆很有意思,因为提到视频 codec 时,大家默认它是"老江湖"——从上世纪 90 年代 MPEG-1 开始,视频编码标准已经迭代了几代,每个代际都靠人手工设计更精细的算法模块来提升压缩率。H.264 在 2003 年发布后统治了互联网视频十几年,到现在直播、点播、会议系统里仍然大量在用;HEVC 把压缩率又提了大概 30% 到 50%;AV1 则在 HEVC 基础上继续抠出可观的空间。每一步都是工程师们一点点打磨出来的,没有哪一环是"学着学着自己就会了"。

直到深度学习的旋风刮过来,一批研究者开始尝试让神经网络替代编码链路里的若干模块。这就是所谓"神经视频编码"的起源。它和传统 codec 的差异,用一句话概括就是:传统编码器里的规则是人写的,神经编码器里的规则是数据训练出来的。

1.2 视频编码真正在干什么:冗余、预测与失真

要想理解为什么"学习"能插进来,得先回到视频编码的起点。视频本质上是一连串像素帧,原始数据量巨大——一秒钟 1080p 画面大概有 60MB 的 RGB 数据量,不压缩根本没法传。好在视频里到处是冗余:

  • 空间冗余:同一帧里相邻像素往往相似,比如蓝天、白墙;
  • 时间冗余:相邻帧之间变化很小,人不动、背景不动,直接重复传送就是浪费;
  • 统计冗余:某些符号出现的频率明显更高,可以用更短的二进制表示;
  • 感知冗余:人眼对高频细节、颜色分量的敏感度不同,有些信息丢了也看不出来。

传统编码器干的事情,就是围绕这四类冗余做"减法"。用帧内预测去掉空间冗余,用帧间运动补偿去掉时间冗余,用变换(比如 DCT)把像素能量集中、量化后丢掉不重要的细节,再用熵编码(CABAC/CAVLC)把残差数据按概率模型做紧凑的二进制编码。整个过程都围绕一个核心目标:在给定码率上限的情况下,让重建画面的失真尽量小;或者反过来,在给定失真容忍度的前提下,让码率尽量低。

这句话听起来很朴素,做起来却极其复杂。传统编码器本身就是一大套精心设计的模块,预测模式有几十种,变换块大小有几档,量化参数要逐块去调。这些模块之间互相牵制,很难全局一起优化。

1.3 "学习"二字要拆开看:网络学的是编码策略

很多人一听"神经视频编码",第一反应是"AI 看懂了视频内容再压缩"。这是最大的误解。目前的神经网络完全不理解画面里的物体是猫还是狗,它在训练阶段做的事情是:输入大量视频片段和对应的码率权重,让网络自己找到"怎样把像素映射成一组紧凑数字、再怎样从这组数字恢复出画面"的映射规则。训练完成后,网络记住的不是某个具体画面,而是一整套"编码策略"。

我用一个粗浅的类比:传统编码器像一个大公司,内部有各部门(预测部、变换部、量化部、熵编码部),每个部门按厚厚的黑白手册办事;神经编码器则像一个端到端训练出来的实习生,它不按各部门手册工作,而是看了成千上万份"输入图像-压缩表示-重建损失"的样本对以后,自己形成了一套把画面变紧凑、再还原出来的直觉。这个直觉是隐藏在几百万个权重参数里的,无法用传统设计文档描述。

也正因为这种"规则被参数替代"的特性,很多工程上的人看到它会本能地警惕:这玩意儿怎么能保证解码端和编码端结果一致?怎么保证不同设备上跑出来的码流完全一样?这些疑问都成立,后面工程边界部分我会细说。

2. 传统编码的天花板,是神经网络入场的第一块跳板

2.1 手工工具箱做到今天,边际收益已经肉眼可见地下降

先看客观事实。从 H.264 到 HEVC,压缩率提升主要靠引入更灵活的块划分、更多的帧内预测方向和更精细的运动补偿;从 HEVC 到 VVC/AV1,提升点变成了更复杂的划分树、更聪明的变换和滤波,但带来的收益与复杂度增长越来越不成比例。AV1 的编码器在刚开始那几年慢得惊人,一个 1080p 片段在普通机器上压到高质量档,几秒钟的内容能压几分钟甚至更久;VVC 更大,编码端跑了大量率失真优化递归搜索,复杂度比 AV1 只高不低。

这说明什么?几十年来,专家们把每个模块的手工潜力挖掘得相当充分。继续靠人肉添加更复杂的模式,往往换来一点压缩率提升,却让编码器复杂度和硬件成本呈指数级上涨。这是第一个信号:我们正在逼近"人工设计规则"这条路的天花板。

另一个信号在学术界。BD-Rate 是衡量两个编码器效率的经典指标,意思是达到同样重建质量(如 PSNR)时码率能省多少。传统标准代际之间,BD-Rate 的收益从 H.264 到 HEVC 的约 30% 以上,降到 HEVC 到 VVC/AV1 的约 20% 上下。这个数字越来越小,但标准文档越来越厚。继续在传统框架里抠收益,性价比肉眼可见地变低。

2.2 率失真优化与"端到端":为什么这个问题适合深度学习

传统编码器内部各模块的设计逻辑,其实都指向同一个数学模型:率失真优化。设码率为 R,失真为 D,编码器本质上在做的事是找到一个编码策略,让R + λ*D这个联合目标最小。λ 是"码率和质量的交换系数",λ 大就偏向省码率,λ 小就偏向保画质。

问题在于,传统编码器把问题拆成了预测、变换、量化、熵编码四个子问题,每个子问题单独设计、分别优化,最后拼成一个整体。这就像用四个承包商分别盖楼,每个承包商都为自己那块打最优解,但楼整体未必是最优的。神经网络的独特优势是"端到端可微":整条链路——编码网络、量化、熵模型、解码网络——可以被写成一个可导的计算图,直接用R + λ*D作为损失函数去更新所有参数。参数更新不再需要人拍脑袋决定"预测模式要加几种、滤波器系数怎么调",而是由梯度告诉网络"哪里做得不好,往哪个方向改"。

量化是其中一个难题,因为硬量化(round)不可导,没法直接反向传播。研究社区用软量化、加噪声模拟量化、直通估计(straight-through estimator)等技巧绕过去,让网络在训练时能接受"量化误差"的惩罚,从而学会生成对量化不敏感的紧凑表示。这个技术在图像压缩里已经被验证得很成熟,Ballé 等人在 2016 到 2018 年的论文就奠定了端到端图像压缩的基础,视频方向的神经编码器很大程度是这套思路的时序扩展。

2.3 用一个类比理解差异

传统编码器更像在"预制板房"上做优化。每块预制板——预测模式、变换矩阵、量化步长——都是人画好图纸的,房子性能的上限有硬约束,因为所有预制件的规格是固定的。神经编码器则是用"3D 打印"整栋建筑:没有预制的固定模块,而是让一个庞大的参数化模型直接学习"什么形状最省材料、什么结构承重最好"。它可能烧钱(训练要 GPU)、打印也慢(推理要算力),但只要能打印出来,结构往往比预制板拼装的更紧凑。

这个类比同时也揭示了短板:3D 打印机很贵,而且不同打印机的出品细节可能不同。这在后面工程部分会集中爆发。

3. 神经视频编码的内部工作方式:拆给你看

3.1 主干网络:自编码器是如何把一帧图像变成压缩向量的

先看图像压缩这个"最小单元"。一个典型的端到端神经压缩系统长这样:

输入端是一帧画面 x,先经过一个编码器网络 E(一堆卷积层和注意力块),得到一个潜在表示 y。y 通常是一个尺寸比原图小很多的特征图,但每个位置的值是连续浮点数。这些浮点数被量化成离散整数(类似传统编码的量化步长),然后通过熵编码压缩成二进制码流。解码端拿到码流后,先恢复出量化后的 y,再经过解码器网络 D 重建出画面 x'。

为什么 y 会比原始像素更容易压缩?因为网络被训练成"尽量把信息集中到少量重要维度上"。它自己学会去掉原始像素里的统计冗余、感知上不重要的细节,只保留最难重建的关键信息。这个过程不是人设计的特征提取,而是网络为了最小化R+λD自己摸索出来的抽象表示。如果把中间特征可视化,你会看到很多既不是像素也不是传统 DCT 系数的奇怪图案——它们是人很难解释、却对重建有用的"压缩货币"。

码率怎么计算?它不是直接数二进制位,而是根据 y 的熵来算。熵越小,理论上压缩后的码流越短。所以编码器网络在训练时会尽量让 y 的分布集中、离散化后概率更可预测,这样熵编码器就能用更少的比特塞下同样的信息。

3.2 超先验与上下文:熵编码最吃的一环,神经网络补上了

熵编码器需要一件事:知道每个待编码符号的概率分布。传统编码器里,CABAC 的概率模型来自块类型、运动矢量分布等手工统计表;神经编码器里,这个概率模型是通过另一个小网络"预测"出来的。

直接对 quantized y 建一个固定分布模型效果不好,因为 y 在不同区域的信息量差异很大。于是 Ballé 等人提出了一个几乎成为标配的模块:超先验(hyperprior)。思路是,把 y 再喂给一个小型编码器网络,生成一个辅助特征 z;z 的尺寸更小,先被压缩并传送到解码端。解码端拿到 z 后,用一个超解码器网络把它还原成一组概率参数(通常是均值和方差),然后用这组参数给 y 建立条件概率模型。这样,熵编码器就能针对 y 的每个位置使用更准确的概率分布,码率也因此显著降低。

打个比方:你要打包一个压缩文件,光有压缩包本身还不够,最好再附带一个"索引清单"。解压时先读清单,就知道里面文件是文本多还是图片多、哪些块重复度高等信息,从而更准确地压缩剩余数据。超先验 z 就是这个清单。

更进一步的思路是在解码时引入自回归上下文:每解码一个位置,就用已经解码出来的邻近符号作为附加信息,继续完善概率模型。论文里这类做法叫"上下文建模"(context modeling),它让概率估计越来越准,但也让解码过程变成逐块串行,速度进一步下降。图像压缩论文里常看到"主编码器+超先验+自回归上下文"的架构,视频方向也沿用了这套基础。

3.3 视频特有的一课:运动估计、条件编码与时序上下文

视频压缩和图像压缩最大的区别是时间维度。神经视频编码器要想压得好,必须利用参考帧,这就有几种不同做法。

较早的方法是"神经网络做运动估计":用光流网络预测当前帧和参考帧之间的运动矢量,再把参考帧 warp 到当前帧位置,和实际画面做残差。编码器需要压缩运动信息和残差信息,这很接近传统编码器的结构,但运动估计和 warp 由网络完成。这类方法易于理解,但运动信息本身也要花码率,很多时候浪费不少。

后续出现了更激进的思路,我印象最深的是 DCVC(Deep Contextual Video Compression)这一系列工作。它提出一种条件编码框架:不显式传运动信息,而是把参考帧的特征图和当前帧的特征一起喂给编码网络,让网络自己决定参考哪些时域信息、需要哪些新信息。解码端同样以参考帧特征为条件,用条件模型去重建当前帧。这相当于把"运动补偿"从原始像素域搬到了特征域,并且把"怎么用参考帧"也交给网络去学。

这类方法有一段时间在测试集上表现得非常亮眼,公开结果中相对传统编码器能报出 20% 左右甚至更高的码率节省(具体结果因测试集和配置而异)。你去看论文里的率失真曲线,会发现神经编码器在低码率段往往很有优势,高码率段和传统编码器的差距会缩小。这个现象后面工程部分还会提到。

4. 从论文到实战:复现与跑通神经视频编码的真实成本

4.1 一次完整的复现过程:选型、环境和实测数据

论文写得再好看,不如自己跑一遍。我第一次真正跑通一个神经视频编码器,用的是开源社区里口碑不错的一套模型(DCVC 系列,GitHub 上有预训练权重),硬件是一张 4090,环境是 Ubuntu + PyTorch + CUDA。大体流程如下:

  1. 准备数据:用 ffmpeg 把一段短视频转成连续 PNG 帧序列,或者转成 YUV420 文件,方便喂给模型。
  2. 选质量档位:模型一般提供好几个训练好的权重,对应不同的 λ(即码率/质量偏好)。想对比高码率表现就选大 λ 的权重,想测低码率就选小 λ。
  3. 编码:跑仓库里的编码脚本,输入帧序列和参考帧,输出一个.bin码流文件。脚本内部会调用编码器网络、量化、熵编码,保存最终的码流。
  4. 解码:跑解码脚本,读码流,利用解码器网络逐帧重建画面。
  5. 评估:算重建帧和原始帧的 PSNR/MS-SSIM,用码流字节数换算码率,再和 x265/AV1 的结果拉对比曲线。

这一步本身不难,难在你得有耐心。我自己跑 480p、30 帧、大约 1 秒的视频时,中档 λ 的小模型每帧编码耗时约 2 到 5 秒,解码约 0.5 到 1 秒,显存峰值在 4GB 到 6GB 之间。换到 1080p 或者更大的模型,显存直接奔着 12GB 以上走,编码每帧 10 秒打底。说实话,看到这个速度我第一时间就把"实时编码"的念头扔掉了。

具体数字参考如下表(不同模型、不同硬件差异极大,只能看量级):

环节依赖我这次复现的量级
数据预处理ffmpeg、读写 PNG/YUV秒级完成
编码端推理GPU、模型权重480p 每帧 2~5 秒
解码端推理GPU、模型权重480p 每帧 0.5~1 秒
峰值显存模型大小、帧数、batch4~12GB 不等
与传统编码对比需额外跑 x265/AV1码率体感省但速度被碾压

跑完数据以后,我的真实感受是:压缩率确实有惊喜,但远没到"无脑替代"的地步。低码率段神经编码器挺能打,高码率段优势会缩小;而且你每改一档质量,就要换一套权重,没有传统编码器那种"跑一条命令换个 QP 参数"的灵活。

4.2 论文里不会写的十几个"工程杂音"

真正做工程的人都知道,复现出 PSNR 只是开始,后面全是论文里不会告诉你的破事。我把自己踩过和见过的坑归下类:

数值稳定性和精度问题。熵编码依赖概率分布,如果某个符号的预测概率极端小,对数算出来会给负无穷,稍不留神整个码流就废了。很多实现要加概率裁剪、对概率分布做平滑。更麻烦的是 CPU 和 GPU 上的浮点结果不完全一致,同样的模型在不同设备上编码出的码流都可能对不上号,直接挑战了视频标准最基础的"一致性"要求。

内存爆炸是常态。神经编码器通常不止处理一帧,参考帧的特征要一直缓存;帧数越长,特征缓存越积越大。我在测一个长片段时,中途显存直接 OOM,最后被迫把视频切成几段单独处理再拼接。这个现象在论文里很难看到,因为它只报告单段指标,没人在意你能不能连续压一小时。

解码器依赖训练框架。传统编码器解一个码流只需要跑一个 C 程序;神经编码器解码得把整个 PyTorch 运行时、对应模型结构和权重加载进来。这意味着播放器、机顶盒、手机芯片全都要专门适配,没有一家厂商愿意为每套模型改动自己的硬解流水线。

时延是硬伤。一帧解码哪怕只要 0.5 秒,都告别了实时互动场景。直播、视频会议完全不要想,RTC 场景对端到端时延的要求是百毫秒级别,神经编码器目前的推理速度差了两个数量级。

模型授权和升级问题。预训练权重往往在非商业用途下开放,真要拿去做商业业务,你得仔细读许可证。而且模型升级后,旧码流用新解码器不一定能解,这是格式兼容性上的噩梦。

4.3 这套方案目前适合用在什么场景

跑完一圈以后,我的结论是:它现在更适合"离线、闭环、不追求实时"的场景。比如监控录像的冷存储压缩、特定媒体的视频归档、超低码率下的缩略图/关键帧压缩。在这些场景里,你可以用一台带 GPU 的服务器做批量编码,码流存起来;之后要看的时候,再用同一套模型在服务器上软解。整个过程不依赖用户终端设备,也不需要统一硬件。

我前阵子在一批内部监控视频上做过一个测试,取中档质量,神经编码器的码率比 x265 低了大约两到三成,但一台 4090 现在也只能软解几路。这个"能省但解不动"的现实,让我对所谓"全面替代"一直保持冷静。

5. 工程边界:离"下一代标准"还差的三座大山

5.1 第一座山:标准、一致性与硬件解码

视频编码之所以能成为基础设施,是因为有统一标准。H.264 的码流拿到任何一台设备上,解码结果必须完全一致,这叫"比特一致(bit-exact)"。传统编码器通过精细规范浮点运算、舍入方式、查表操作来保证这一点。神经网络模型天然做不到:哪怕同一个 checkpoint,在不同的 GPU 卡、不同版本的算子库上推理,结果都可能差零点几个像素值。这让它很难成为通用标准里的核心压缩方案。

更现实的障碍是硬件。视频编码的标准迭代之所以能落地,离不开 ASIC 芯片——解码器一年出货几十亿颗,每颗都要在几毫瓦功耗极限内实时解码。神经网络的卷积计算需要海量 MAC(乘加)单元和高速内存带宽,和标准视频解码 ASIC 的设计理念完全不是一回事。就算有厂商愿意做专用芯片,模型结构还在快速迭代,等芯片流片出来,模型可能已经换了两代。现在的大部分流媒体公司也在观望,谁也不愿意为一套没统一码流格式的模型去改自己的 CDN 和转码平台。

5.2 第二座山:分布式生态、播放器与传统业务链路

视频不是"编一个文件解一个文件"这么简单。真实业务里,码流要被封装成 DASH/HLS 切片,要支持 ABR 自适应码率切换,要做 DRM 加密,要在转码平台里和广告插播系统对接,还要能被各种弱网条件下的大规模 CDN 分发。任何一个环节不认识这套码流,整个链路就断了。

播放器是另一个现实问题。主流播放器能软解 H.264/HEVC/AV1,但没人会内置一个 PyTorch 推理引擎去解神经网络码流。你在浏览器里放一个神经编码器生成的.bin文件,短期内是不可能的。就算你自己写播放器,也得一路陪升级模型版本,否则旧视频没法看。这套生态改造成本,比带宽成本高得多,而很多视频平台的核心诉求偏偏是"用低成本解决带宽",所以它们宁可继续上传统编码器的极致调优,也不太会为省 20% 码率去动整个架构。

5.3 第三座山:成本收益算不清,所以落地只能找刁钻场景

算一笔简单账:视频平台的带宽成本确实高,但服务器和 GPU 算力也不是免费的。传统编码器在普通 CPU 集群上就能跑,并行度高、功耗可控;神经编码器每一路都要占着一块高端 GPU,跑几十分钟才能压几秒内容。如果你的内容量大、热度又高,省下来的带宽费用很可能覆盖不了 GPU 电费和折旧。只有那些"长期没人看、又必须存着"的冷数据,比如监控存档、老旧长尾内容,才值得用慢编码去换存储和带宽的节省。

正因如此,我目前更看好的是"混合路线"。把神经网络作为一个工具嵌进传统编码器里,而不是整体替换。比如用神经网络做环路滤波(loop filter)把重建画面的细节修得更干净、用超分辨率增强参考帧、用深度网络做更聪明的拉格朗日乘子调节。这类做法保留传统编码器的码流封装和大部分模块,只替换其中最需要智能的部分,既拿到了压缩率收益,又不破坏兼容性。MPEG 等标准化组织也在探索这类基于神经网络的编码工具,但看起来还需要不少时间才能形成稳定方案。

无兼容负担的闭环场景,才是纯神经编码器真正能放开手脚的地方。我现在的真实用法是:内部监控视频入库前,先用神经编码器做一轮离线压缩,码流放在冷存储里,需要回看时再在服务器上软解。这个场景没有人要求我兼容全世界的播放器,也没有人逼我硬解,我能享受到压缩率红利,代价只是一台常驻的 GPU 服务器。这可能也是当前神经视频编码最现实的一条出路。

回到标题那句话:Codec 开始"学习"这件事本身,确实让压缩率的天花板又被抬高了一截。只是这天花板最终能转化为多少用户价值,不取决于论文里的率失真曲线,而取决于芯片能不能跟上、标准能不能统一、生态愿不愿意买单。对我这种常年跑编码对比测试的人而言,最直观的感受是:别再幻想全面替代了,但也不能当作纯噱头。盯着场景,找到那三座山之间的小缝隙,这套技术就已经值得你掏显卡练手了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询