
前两年我刚接触“神经视频编码”这个概念时说实话是有点抵触的。做了十多年视频编码H.264、HEVC那套框架早就刻在骨子里了突然说要让Codec自己“学”总觉得是把简单问题复杂化。直到我真正上手跑了一个端到端的学习型编码框架又对比着调了调传统编码器的码率控制才意识到这条路跟传统Codec的演进逻辑完全不一样。它不是在修修补补而是把“编码”这个问题重新定义了一遍。这篇就当是把自己踩过的坑、想明白的逻辑、以及目前还在头疼的工程边界一并记录下来。1. 为什么需要让 Codec “学习”1.1 传统编解码器的“手工规则”天花板传统视频编码不管是H.264、HEVC还是AV1内核都建立在“手工设计的规则”之上。什么叫手工规则就是人类专家通过几十年的观察总结出“视频里相邻帧很像、空间上相邻像素也很像”这样的规律然后把它固化成一套固定的算法流程先分块宏块/CTU再做帧内帧间预测接着变换、量化、熵编码。每一步都有非常明确的数学定义标准里写得清清楚楚解码器拿到比特流就能严格按规则还原。这套体系的优势是稳定、可控、兼容性极强十几年前的H.264到今天依然是统治级的存在。但它的天花板也非常明显所有规则都是人定的而人的观察和总结能力远不足以覆盖真实世界里千变万化的视频内容。比如HEVC的帧内预测有35种角度模式AV1搞了更复杂的56种可面对复杂的纹理、遮挡、镜头运动这些固定的模式依然常常“猜不准”。之所以后来HEVC比H.264能省30%左右的码率就是因为它的规则更细、更多但这本质上是在同一套逻辑里不断堆规则边际收益越来越低。1.2 从“字符集报错”想到的一个类比这里我想先岔开讲一件跟视频编码八竿子打不着的事。有段时间我在处理一个中文语料清洗任务脚本跑着跑着突然抛出一个异常大意是“UnicodeEncodeError: gbk codec cant encode character”。一看就明白了源文件里有个生僻字符而当前环境的默认编码是GBKGBK这套字符表里根本没有这个字的映射于是程序直接崩了。这件事给了我一个很直观的类比。传统Codec某种意义上就像GBK编码它的语法、模式、变换核、概率表都是预先定义好的一旦视频内容超出了这套“字符表”能表达的范围它就只能靠更粗的量化或更大的码率来硬扛扛不住就花屏、糊成一团。神经编码的逻辑则更像是换一种思路——不再强行把所有内容都塞进一张固定的表格而是让模型在训练阶段见足够多的数据自己长出“理解内容”的能力遇到什么内容都能灵活变通地表示。当然神经编码也一样有它的边界只是这个边界不再是字面上“查表查不到”那么简单了。我们再看热搜里那个“vs codec语言程序怎么运行”的问题。我想很多人搜这个是觉得Codec是一种语言或者一个可执行程序下载下来就能在IDE里跑。但这恰好点出了神经编码工程化最痛的地方它是一个模型不是一段按部就班跑完就结束的代码。模型需要训练、需要GPU、需要权重文件、需要推理框架它的“运行”方式跟传统可执行程序完全不同。这个差异放到后面工程边界里再展开先回到核心逻辑本身。2. 神经视频编码的核心技术逻辑2.1 从“残差变换”到“端到端自编码器”要说清楚神经编码为什么能超越传统框架得先明白传统框架的终极优化目标。编码器做的帧间预测、帧内预测本质上是在试图消除时空冗余消除不掉的部分就是残差然后对残差做DCT/DST变换、量化再熵编码。这里的关键在于预测、变换、量化、熵编码这四件事是先后独立、各自最优的但每一步的“最优”拼在一起往往并不是全局最优。为什么因为变换核是固定的量化步长是人为调控的概率模型也是简化的它们之间缺乏协同。神经网络的做法是端到端统一优化。从架构上看它不再把“预测”和“变换”分成两个模块而是用一个深层的自动编码器AutoEncoder结构把它俩合并了。编码器网络直接吃原始像素输出一个压缩后的潜在表示latent representation解码器网络则负责从这个压缩表示里重建图像/视频。整个流程里没有显式的DCT、没有固定的预测模式一切都是网络里的参数。我用一个例子说明觉察到的差距。之前我在一个1080p、30FPS、Camera Motion很强的测试序列上分别用x265的veryslow档和某个开源学习型编码框架跑了一遍。x265的处理模式是滚动参考帧做运动估计运动矢量场非常规整但遇到镜头快速扫过时运动估计往往会失败残差能量瞬间飙升这时候只能加码率很难稳定控制画质。学习型框架反而是“端到端地理解”了这个动作——它的潜在表示里天然携带了时序运动信息重建设备在解码端不需要显式“搜索运动矢量”。在同一目标码率下学习型框架的VMAF分数高了不少。这个差距在快速运动场景下尤其明显归根结底是因为神经网络学会了一种“软性”的运动表示而不是依赖固定的块匹配。2.2 超先验与上下文模型为比特流装上“概率表”熵编码是视频编码里最容易被忽略却又至关重要的环节。传统编码器里熵编码依赖的是精心设计的上下文概率模型比如H.264/HEVC里的CABAC它会根据已编码的相邻像素/宏块信息动态决定当前符号用哪张概率表。这套机制很精巧但仍然是手工设计的。神经编码的熵编码则完全换了一个思路网络在训练时就得学会“预测自己输出的符号长什么样”。怎么实现这就引出了所谓“超先验”Hyperprior机制。逻辑其实很直观编码器把输入压缩成一批潜在特征但潜在特征里每个通道的“能量强弱”相差很大。超先验网络的作用就是再把这些潜在特征“进一步压缩一遍”形成一组边信息side information。解码端在还原潜在特征之前先读取这组边信息就能知道潜在特征的大致统计规律比如哪些区域纹理复杂、哪些区域平坦然后据此为每个潜在符号估计一个概率分布。熵编码器就拿着这个概率分布去写码流。这些概率预测得越准实际写出来的码流就越短因为熵编码的码长下限就是负对数概率预测得准意味着几乎每次都押中了可能出现的符号。从这个角度说神经编码的率失真性能一多半取决于那个“概率表”准不准。这也是为什么现在不少工作花大力气去改进上下文模型比如引入空间自回归、时序条件本质上就是在让“概率表”具备更强的上下文感知能力。我最初跑一个不带超先验的基线版本BD-Rate基本只能跟HEVC打个平手接入超先验之后压缩率肉眼可见地提升了一个档次。这也印证了“网络在压缩什么”这件事上还有大量空间可以挖掘。2.3 率失真优化训练目标就是码率的“性价比”任何编码系统都在追求同一件事用尽量少的比特换尽量好的画质。传统编码器里这是通过调节量化参数QP来完成的码率控制算法负责分配合适的比特。而神经编码里的“率失真优化”是直接写进训练目标里的。训练时损失函数通常是这样的形式L R λ * D其中R代表估计的码率——注意是“估计”因为训练阶段网络并不真正做熵编码而是通过它预测的概率分布来计算理论上的熵这个值近似于真实码率的下限D代表失真最常见的是MSE均方误差也可以是感知指标λ是拉格朗日乘子用来调节码率和失真之间的权重。λ设得大网络会更倾向于保住画质码率就高λ设得小网络会疯狂压缩比特画质就糙。这个公式说起来简单但它背后的逻辑跟传统编码完全不同传统编码是在给定的规则里去寻找最优QP而神经编码是在训练阶段就学会了“在极小码率和极小失真之间如何达到那个平衡点”。实际操作中还有一个陷阱。刚开始训练时我以为D用MSE就够了跑出来的结果在PSNR上挺好看但主观视觉上总感觉边缘细节发糊有一种“磨皮感”。后来换成了带感知性质的损失项比如感知相似度指标主观画质瞬间好了不少。这说明率失真优化里的D怎么定义直接决定了模型学会的“画质观”是什么。你定义D是像素差它就给你像素差最小的结果你定义D是观感它就给你观感最好的结果。神经编码的“主观质量天花板”其实是个训练问题而不是架构问题。3. 工程落地的边界与约束3.1 计算成本模型推理不是免费午餐理论再好落到工程上就会撞上现实的高墙。神经编码最直观的门槛就是算力。传统编码器之所以能普及到电视、手机、监控摄像头是因为它们的复杂度再高也还是在固定算法框架内优化对硬件的要求是可预估的。神经编码则依赖神经网络推理一次前向传播就是几千万甚至上亿次的乘加运算没有GPU或专用的NPU加速基本跑不动高分辨率实时编码。我自己的经历是在RTX 3090上跑一个轻型的学习型编码模型处理720p视频差不多能做到10~15 FPS的编码速度听着还行但要注意这是单机单卡的编码端速度解码端要好一些但也远没有达到“实时解码”的水平——工业场景里硬件解码器解4K HEVC都是轻松上百帧的。更麻烦的是不同分辨率、不同帧率、不同内容类型下模型需要的计算量几乎是线性的码率越高、分辨率越高延迟越不可控。这不只是一个“设备不够好”的问题而是模型本身的结构决定的。传统编码器有严格的并行化设计多核CPU可以按块划分任务并行处理而神经编码里的自回归上下文模型天然是串行的——当前位置的概率分布依赖前一个位置的编码结果这种依赖关系很难被打散成并行任务。这也是目前很多研究工作在探索“非自回归/并行上下文模型”的原因。3.2 兼容性困境神经模型不是“可执行程序”回到那个热搜词VS里的“Codec语言程序”怎么运行。如果把传统编码器理解成一个可执行程序那么神经编码根本不是一个“可以单独运行”的程序——它是模型、权重、推理框架、算力平台的共同体。传统编码器下载一个FFmpeg静态编译版本在任何x86机器上都能跑神经编码方案即便编出了二进制没有CUDA、没有PyTorch/TensorRT运行时它也动弹不得。而且模型在训练框架里编出的码流能不能被另一个框架流畅解码这个答案通常是否定的因为模型结构里的层顺序、张量布局、量化尺度哪怕差一点点解码结果就会完全错乱。这带来一个非常尖锐的工程问题神经编码的“解码器”本身是在线的、可变的、依赖特定运行时环境的。标准化的定义是“一个固定比特流语法、任何符合标准的解码器都能解析”而神经编码目前的状态是“每个模型的解码器都是独一无二的”。你要给终端用户发视频总不能让他们为了看个视频先去装一个1GB的模型包吧。所以现在脑机接口式的落地场景更多还是集中在“离线转码预置解码器”的方向。比如云平台把录制好的视频先用重型学习型编码器转一遍生成非常紧凑的码流再附带一个定制解码器给用户端这跟传统的“凡编码器都兼容”完全不是一回事。我试着把这种兼容性差异整理成了一张对照表方便理解问题的本质维度传统CodecH.264/HEVC/AV1神经视频编码语法定义标准文本严格定义模型结构权重决定解码器软硬件通用生态成熟每套模型各自独立依赖推理框架可并行性块级并行多核友好自回归模型串行依赖GPU绑定实时性硬件实时解码高分辨率下实时仍是难题可解释性每一步都有明确物理意义潜在空间难以直接解读迭代成本标准制定周期长但改造成本可控重训模型成本高迭代周期不短3.3 标准化与碎片化各家都在跑自己的赛道做视频编码的人骨子里对“标准”是有执念的。H.264能统治十几年靠得不只是压缩率高更多是标准化带来的生态壁垒——摄像机、编码器、播放器、浏览器、硬件芯片全部遵循同一套规则。神经编码目前最大的问题恰恰是缺乏统一标准。谷歌有自己的一套Meta有一套国内一些高校和公司也有自己的一套每家的模型都不一样每家的码流都不互通。这意味着即便神经编码的压缩率已经超越了当前最好的传统编码器也很难在生态层面形成商用闭环。近年在标准化方面有一个动向就是JPEG AI学习型图像编码标准在做相关工作视频方面也有MPEG的探索性项目。但标准化问题的核心难点在于传统标准的语法是几页纸就能写清楚的学习型标准的“语法”是一堆参数重新训练一个模型就等于改变标准。标准制定的过程变成了“大家必须共享同一份训练数据和训练方法”这对商业公司而言很难接受。所以我的判断是未来相当长一段时间里神经编码会先在一些封闭/半封闭的场景里落地比如云游戏画面传输、专业视频素材的离线转码、监控视频的长期存储。这些场景不需要跟全世界的播放器兼容只需要在自有的解码器生态里自洽即可。真正通用于全网的标准级学习型Codec还有非常长的一段路要走。4. 实操建议新手如何开始评估与应用4.1 快速上手的工具链与开源框架如果你看了以上的内容想自己动手跑一遍神经编码我给一个比较顺的入门路径。第一步先把传统编码器玩熟建议用FFmpeg配合x265/x264理解清楚码率控制、QP、GOP这些基础概念。别小看这一步因为后面你评价神经编码的优劣时对比基准就是它们。第二步上手学习型编码的主流开源框架。目前最主流的参考实现是CompressAI它基于PyTorch集成了包括超先验模型、自回归模型在内的大量基线结构而且自带率失真评价脚本。跑通一个基线模型不需要自己写网络结构只需要按文档准备训练数据、改配置文件、启动训练就行。我建议先拿一个几千张图片的小数据集比如CLIC、Kodak跑一个Hyperprior模型目标不是刷SOTA而是把整个“训练→编码→解码→评价”的流程走通。第三步尝试用训练好的模型做真实视频序列的编码。很多初学者会犯一个错误直接用图片模型去压视频结果发现帧间冗余完全没被利用码率浪费严重。这是因为单帧模型根本不知道怎么利用时间冗余所以做视频编码时得选带有时间维度的模型结构或者至少得先把视频拆帧、逐帧压缩再对比一下跟传统编码的差距——你会发现单帧编码的视频压缩率远不如HEVC。这一步会让你直观体会到“时域建模”在视频编码里到底有多重要。4.2 评价指标与测试集选择评价一个编码器的好坏在国内外的学术社区里最喜欢用的指标是BD-Rate。简单说就是统计多个码率点上的画质得分算出一条率失真曲线再跟基准编码器对比看平均码率能省多少。负值代表比特率节省比如BD-Rate -30%意味着在同等画质下比基准少用了30%的码率。画质指标方面PSNR是基础但不够全面建议搭配SSIM和VMAF一起看。尤其是VMAF对于神经网络产生的“伪影”类型会更敏感。神经编码一个很典型的现象是PSNR已经很高了但人眼看着总差一口气这时候VMAF往往能反映真实主观感受。测试集的选择也很关键。学术上常用UVG、HEVC Class B/C/D这类标准测试集它们的优点是大家都能对齐、方便横向比较但缺点是场景覆盖有限运动模式偏简单。我自己测试时还会额外加一些自采的素材比如夜景、快速摇镜、大量文字叠加的屏幕录制这些才是真实应用里最考验编码器的内容。神经编码特别怕“分布外数据”——训练集里少见的场景推理时表现会急剧下降。所以选测试集时至少得包含一部分模型训练时没见过的“偏门”内容别全用公开测试集。4.3 当前适合的技术场景与不适合的场景最后给一个相对冷静的场景判断。用神经编码之前先问自己几个问题我的解码端设备固定吗能接受每次更新模型吗对端到端延迟的容忍度高吗如果答案是你需要“全网通用、任意设备硬解”那现阶段老老实实用传统编码器等待标准化之下的统一方案。比较适合的条件是“解码端可控的专属场景”。我实际测下来有两类场景效果很突出监控录像的长期归档存储这个场景要求压缩率高、只写不读、解码频率低。神经网络编码可以在相同码率下保留更清晰的细节对事后检索人像、车牌这些关键信息特别有利。高质量内容的离线转码比如影视素材从原始母版转成分发版本CPU时间不是问题GPU资源也充足可以用重型模型慢慢磨把品控做到极致。反过来直播、实时通信、移动端播放这种场景现阶段完全不建议硬上。原因很简单实时编码需要极低的编码延迟神经网络目前做不到移动端解码又受制于模型体积和算力。等到后面有专门的端侧NPU优化和统一标准时这个局面才会迎来真正的改观。我做神经编码这几年下来最大的体会是它不是在“替代”传统编码器而是在“重构”整个视频压缩的思考方式。传统编码器的每一次性能提升都是在既有规则里精雕细琢神经编码则逼着你去思考“什么是真正值得保留的信息”。这种思维转变比单纯跑通几个模型要重要得多。等哪一天你不再执着于“QP设多少”而是开始琢磨“损失函数里λ设多少、D用什么指标”你就真正迈进神经编码的大门了。