做了这么多年音视频技术,陆陆续续帮不少人复盘过各种厂子的编解码笔试。一个特别强烈的感受是:视频编解码算法工程师的笔试,和市面上绝大多数“算法工程师”岗位的笔试根本不在一个频道上。别人在刷LeetCode、追Transformer,你却在推率失真公式、算亚像素运动估计的插值权重。这里面的核心关键词永远是视频编解码、算法,只是“算法”二字的内涵,从模型训练变成了压缩编码、运动搜索、码率控制这些硬核底层的技术命题。今天借着欢聚时代2018校招视频编解码算法工程师A卷(成都场)这个引子,把这类笔试背后的知识结构、考察逻辑,以及当下的主流走向完整盘一遍。
如果你是正在准备音视频方向校招的同学,或者刚转岗进来想摸清视频编解码算法工程师到底要会什么的从业者,这篇内容应该能帮你省下不少瞎摸索的时间。
1. 视频编解码算法笔试的考察全景:从岗位画像到知识地图
1.1 岗位定位:直播公司要的编解码工程师,和视频网站要的是同一类人吗
先说清楚一个容易被忽视的问题:视频编解码算法工程师,到底在什么部门、做什么具体工作。
如果你拿到的是欢聚时代(YY)这样一个以直播为核心的公司的编解码岗位笔试,那意味着你未来大概率要面对的是:如何在网络情况不稳定的直播链路里,保证用户能最低延迟、最高画质地看到主播的画面。这和做视频网站转码算法工程师有明显的侧重差异——前者更在意延迟和抗丢包,后者更在意压缩率和批量转码效率。
理解了这个岗位画像,你再看笔试题就顺了。它不是只考“你会不会用FFmpeg”,也不是只考“你会不会写快速排序”,而是同时考察四个维度:
- 对视频编码标准(H.264/HEVC)核心模块的理解
- 对压缩原理(率失真、熵编码)的掌握程度
- 解决工程问题的能力(码率控制、低延迟策略)
- 通用算法功底(编码器本身就是一个极其复杂的算法工程系统)
这四块权重并不均匀。以我看到的笔试反馈来看,编解码理论占比最高,工程算法次之,通用算法更像是基本功审查,不会出特别偏的题,但基础题必须又快又准。
1.2 从知识地图看笔试覆盖的四大能力带
我按历年这类岗位的套路整理了一张知识地图,笔试题目基本从这几个区间出。
| 能力带 | 核心考点 | 笔试里常见的问法 |
|---|---|---|
| 压缩原理 | 信息熵、率失真优化、量化与DCT | 为什么量化是有损压缩的核心?λ参数增大对码率有什么影响? |
| 编码标准 | H.264/H.265的预测、变换、环路滤波、熵编码 | 帧内/帧间预测各解决了什么冗余?CABAC比CAVLC好在哪? |
| 工程算法 | 运动估计搜索、SAD/SATD/SSD、图像滤波、重采样 | 全搜索和菱形搜索的复杂度差多少?Sobel算子怎么实现? |
| 通用算法 | 排序、字符串、贪心、动态规划、图算法 | 排序在码率控制中有哪些应用?KMP的next数组怎么求? |
| 平台与趋势 | 硬编解码、软硬协同、低延迟链路 | 硬件VPU编码的优缺点?如何降低端到端延迟? |
这张表基本就是答题的主干。接下来我按其中最核心的方向逐个展开。
2. 率失真与熵编码是绕不开的题眼:压缩理论的底层逻辑
2.1 率失真优化的直觉与公式:为什么“码率越大λ越大”这句话容易记反
视频编码的本质,是在码率和画质之间找一个可接受的平衡点。编码器每时每刻都在做取舍:这个宏块用帧内还是帧间?这个残差用多大的量化步长?当前这个GOP要不要插一个关键帧?每一次取舍都会同时影响R(消耗的码率,Rate)和D(引入的画质损伤,Distortion)。
率失真优化就干一件事:用拉格朗日乘子法把这两个目标统一成一个可比较的代价值:
J = D + λR
这里的λ(拉格朗日因子)是调节码率和画质之间偏好的旋钮。你把它调大,编码器会更舍不得花码率,J的优化结果会偏向低码率、略高失真的模式;调小,则偏向高码率、低失真。实际编码器中,λ通常和量化参数QP强相关:QP越大,画质越粗糙但码率越低,λ也会相应变大。
笔试里常见的一个坑是:很多人把“码率越大λ越大”记反了。严格来讲,λ随QP单调上升,QP越大代表允许的失真越大,因此也需要更大的λ把模式选择推向低码率侧。这块建议顺着公式推导一遍,而不是死记结论。还有一个变化题:问你什么叫“RD最优”。答案是遍历所有候选模式,选择J最小的模式,而不是选择失真最小的模式。单纯D最小的模式会把码率花爆,单纯R最小的模式画质会崩,λ就是让两者能放在同一个天平上称的那个砝码。
这个知识点在笔试中经常以“给你一段残差数据,判断选A模式还是B模式”的形式出现。数据本身往往并不复杂,难的是你要把J=D+λR的计算过程完整写出来,并且说清楚λ从哪个QP查表来。会算、会查、会解释,这一问才算过关。
2.2 熵编码:从Huffman到CABAC,条件概率才是关键增益
压缩原理的另一半是熵编码。信息论里,香农已经给出了无失真编码的下限,也就是信息熵。Huffman编码是大家最熟悉的接近熵限的方案:给出现概率大的符号分配较短的码字。学它的时候最关键的是理解“前缀码”为什么能无歧义解码——任何码字都不能是另一个码字的前缀。
Huffman的短板在于它对概率模型的利用比较粗糙:它在编码开始前就要统计各符号概率,并且码字长度一定是整数个比特。算术编码则直接在[0,1)区间上进行概率区间划分,符号序列越长,区间越精确,最终用区间中的任意一个实数(二进制小数)表示整段序列,因此能把“小数个比特”也利用起来。
视频编码里真正广泛使用的CABAC,就是在算术编码基础上加了两层改进:一是二值化,把各种语法元素映射成二进制串;二是上下文建模,根据之前已编码的符号自适应更新每个bin的概率,使用条件概率而不是固定概率。这三层合在一起,让CABAC比上一代CAVLC压缩率提高5%~15%。笔试里如果问“H.265为什么不用CAVLC做主熵编码器”,答案的关键就在于上下文建模带来的条件概率增益。
这里我再强调一个容易被忽略的细节:CABAC里的“上下文”不是拍脑袋想出来的。H.264里大约有400个上下文模型,HEVC里经过精简和优化,保留了更多针对大尺寸块的上下文分配策略。笔试如果写到上下文建模,能说出“概率随已编码符号动态更新”这一层,就已经比大多数背概念的人扎实了。
3. 预测—变换—量化—熵编码:H.264/H.265标准模块的送分题和陷阱
3.1 标准模块逐一拆解:每个环节到底在消除什么冗余
H.264/HEVC这类混合编码框架,笔试几乎必考的是“预测—变换—量化—熵编码”这个闭环。下面把每个环节的考点拆开说。
帧内预测利用的是图像空间域的相关性。H.264里4x4块有9种预测模式(DC、水平、垂直和各种方向对角),16x16亮度块有4种模式。HEVC把方向模式扩展到33种,再加上Planar和DC,一共35种。考得深入的笔试会让你判断:为什么相邻两个像素的差值通常比原始像素值小得多?因为预测残差的能量远小于原始信号能量,后续变换和量化才能用较少比特表示。如果你能顺手提到“帧内预测模式本身也要编码传输,所以编码器要在预测精度和模式开销之间做权衡”,这一问基本就满分了。
帧间预测利用的是时间域相关性。运动估计就是从前面已编码的参考帧里找一个最接近当前块的块,记下运动矢量MV,编码端只需传MV和残差。运动搜索算法是一个大考点:全搜索最暴力但计算量太大,三步搜索、菱形搜索、六边形搜索都是减少搜索点数的经典策略。H.264和HEVC还要求亚像素精度,因为真实物体的运动不可能每次都刚好是整数像素,1/2和1/4像素位置需要通过插值产生,这也意味着计算量进一步上升。
变换与量化这组概念常常被合起来考。DCT把残差块从空间域变到频域,让能量集中在少数低频系数上。量化则是把DCT系数除以量化步长再取整,高频系数往往被量成0,这就是有损压缩的主要来源。所以常被问到:为什么视频编码要“先变换再量化”,而不是直接量化像素值?因为变换可以让系数集中在低频,量化后保留更少的非零系数,熵编码的压缩率才能上去。
环路滤波(Deblocking)是为了去掉块边界上的伪影。HEVC里还引入了SAO(样点自适应补偿),进一步减少振铃效应。这一块经常被问:环路滤波为什么在环路内,而不是在环路外?因为参考帧也要经过滤波,否则误差会不断累积到后续帧。记住这个因果链条:滤波在环内,是为了不让未滤波的画面临时充当参考;一旦参考出错,后面的帧全都会跟着错。
3.2 直播场景带来的硬考题:低延迟、抗丢包、自适应码率
讲完标准模块,立刻切换到直播场景。欢聚时代这类公司的笔试不会满足于让你背标准,它会把你放到真实业务里考。
低延迟是直播的第一个硬指标。B帧虽然压缩率高,但需要参考未来的帧,会带来编码端到解码端一到两帧的延迟,所以低延迟场景通常会禁用B帧或者限制B帧层级。参考帧数量、码率控制平滑缓存区大小、GOP长度,都会直接影响延迟。笔试问“如何把端到端延迟从500ms降到200ms”,答案至少应该覆盖:编码器低延迟配置(关闭B帧、限制参考帧)、传输缓冲策略、解码器首帧快速启动。
抗丢包是直播的第二个硬指标。网络丢包是实时音视频的家常便饭,视频编解码算法工程师要懂得调整GOP结构,让I帧周期合适,必要时做FEC前向纠错或主动请求关键帧。还有一种思路是码流分层:把高优先级的基础层和低优先级的增强层分开传输,弱网下只保基础层,牺牲一部分清晰度但不掉线。
自适应码率排在第三。主播的网络上行带宽波动很大,编码器要能根据网络反馈动态调整码率、分辨率和帧率。这类题往往结合贪心或动态规划,比如:给定一段视频各帧的复杂度,如何分配码率使总体画质最优。这实际上就是把压缩原理和通用算法连起来考,不少人在这一问上卡壳,不是因为不会算法,而是没有意识到“帧复杂度排序后优先分配码率”天然就是一道贪心题。
4. 笔试里的通用算法:从KMP到贪心,为什么要考这些
4.1 编解码直系算法题:运动搜索、匹配准则、图像处理、重采样
这一节先列几个真正“贴着编解码”考的算法,笔试里出现频率极高。
运动搜索算法前面已经提到。全搜索在搜索窗口内逐个检查所有候选位置,能得到最优结果但复杂度极高;三步搜索从中心以固定步长搜索,步长逐级减半;菱形搜索用大小两个菱形模板迭代逼近最优位置。实际工程里,x264默认的运动搜索模式就包括菱形、六边形、非对称多六边形等,它们的区别就是搜索点数和精度的权衡。做题时你得会算复杂度:一个33x33搜索窗口,全搜索要检查1089个位置,三步搜索只检查25个,差距一眼就能看出来。
像素匹配准则也是经常考的。SAD是绝对误差和,计算最轻量,把对应像素差的绝对值加起来就行。SSD是平方误差和,对大误差惩罚更大,更贴近真实视觉但计算量大。SATD则是先对残差块做Hadamard变换再求和,融合了频域信息,在x264里常用来做亚像素或帧内模式选择。笔试里如果问“为什么不用SAD做所有模式决策”,因为SAD对块的平坦区域和纹理区域没有区分能力,SATD的频域加权更符合率失真特性。
图像处理算法同样要留意。Sobel边缘检测用两个3x3卷积核分别提取水平梯度和垂直梯度,常用来做预处理或边缘分析;拉普拉斯是二阶微分算子,图像锐化的本质是把原图减去或加上拉普拉斯响应的加权结果。这类题偶尔会以“实现一个边缘检测”的形式出现,考的就是卷积和边界处理,代码量不大但细节要写清楚。
另外音频重采样算法(最近邻、线性插值、sinc插值)也常顺手考到,因为直播链路里音频同样要做重采样和降噪。视频编解码工程师虽然主要面对图像,但音视频不分家,至少要知道每种重采样的质量差异和计算量差异。
4.2 那些“看起来无关”的经典算法题:考的是编码器背后的基本盘
然后是那些乍一看和视频编解码无关,却总被放到笔试里的经典算法。我的看法是:它们不是硬凑数,而是在考察一个编码器工程师的基本功。
关于KMP,热词里专门提到模式串p="abacaba"求next数组。next数组的核心是提取模式串自身的“自匹配”信息:失配时不用把模式串头拽回来重新比较,而是跳到已经匹配好的前缀位置。这套思路和视频编码里的预测思想很像——都是利用已有的相关性避免重复计算。H.264运动矢量预测会参考相邻块MV,码率状态会参考历史帧数据,本质上都在“用已知推断未知”。所以刷KMP并不是无用功,它训练的状态转移思维在编码器源码里随处可见。
排序和贪心在编码器里不是考试题,是日常。码率控制要做帧复杂度排序,模式选择要做RD代价排序,CABAC概率表也要维护上下文状态。贪心算法则在码率分配、GOP结构设计里很常见:把有限码率优先分给复杂帧而不是简单帧,就是一类贪心策略。动态规划偶尔也会出现,比如多参考帧选择、码率平滑的优化路径。
粒子群、模拟退火这类启发式优化算法,偶尔会在码率控制参数寻优的笔试题里出现。它们的核心是平衡全局搜索和局部搜索,这类题出现的目的更多是看你有没有“基于目标函数设计迭代优化”的意识,不一定要求你写完整实现。
所以准备视频编解码算法岗,不必把精力花在高难度压轴题上,但一定要把排序、字符串、贪心、二分、最基本的图算法这些“中档题”练熟,它们和编码器内部逻辑的契合度非常高。
5. 当笔试遇上RK3588:硬件编解码时代的新考点
5.1 RK3588视频编解码能力速览:软编和硬编的边界在哪
说完笔试的传统内容,得说点热的。热词里“rk3588视频编解码”出现频率很高,这个趋势很值得讲一讲。
RK3588是瑞芯微的旗舰SoC,内置独立VPU视频编解码单元,支持H.264、H.265、VP9、AV1等多种格式的硬件编解码,最高可以到8K级别。这在硬件编解码能力上已经非常能打。它的出现改变了视频编解码算法工程师的一部分工作方式:原来在一个小盒子上做8K视频传输,软件编码基本跑不动,必须把编码任务交给VPU,算法工程师就要去调驱动、调码率控制、调色彩空间转换。
笔试里如果出现“硬编和软编的优缺点”,别说空话,要落到具体数据上:
| 对比维度 | 软编(x264/x265) | 硬编(RK3588 VPU) |
|---|---|---|
| 压缩率 | 高,灵活调节 | 中等,受固件限制 |
| 编码速度 | CPU负载高,4K以上吃力 | 超高,8K实时可编 |
| 功耗 | 高 | 低 |
| 算法定制 | 可改源码 | 受SDK限制 |
| 典型场景 | 服务端转码、离线处理 | 盒子、相机、边缘设备实时编码 |
软编的优势在于压缩率可控、灵活性高、便于调试算法,但CPU占用高,8K实时编码几乎不可能。硬编的优势在于超低功耗、高吞吐,能扛8K,但码率控制粒度相对粗,算法可定制性差,中低码率下的画质通常不如好的软件编码器。这个对比在笔试和面试环节都很加分。
5.2 软硬协同场景下的算法工程师新技能:格式转换、参数适配、码流分析
算法工程师在RK3588这类平台上的工作,从“写编码器”更多变成了“配编码器”和“补胶水”。
一是色彩空间转换。硬件编码器通常要求NV12等特定格式输入,原始画面可能是BGRA、ARGB或者别的排列,需要先做转换。别小看这一步,格式不对出来的画面会花掉或绿屏。
二是分辨率对齐与内存对齐。硬件编码器对输入帧的宽高有对齐要求,分辨率不对齐、colorspace不对、内存对齐不正确,出来的画面就会出问题。这个经验对任何视频开发岗位都适用,也是我实际踩坑最多的位置。
三是码率控制参数的适配。硬件VPU的码率控制粒度常常不如软件精细,需要自己在上面做平滑、做补偿。你要知道怎么设目标码率、最大码率、GOP长度,还要会看码流分析工具的统计结果。
四是协议层对接。硬编码出来的码流要交给协议层做封装、加密、推流,这要求你对H.264 Annex B格式、NALU类型、SPS/PPS这些基础概念足够熟悉。笔试如果围绕这套场景出题,大概率会落到格式转换、编码参数、码流分析这类工程题上。
最后说点实际的备考经验。我帮人复盘过不少这类笔试,最大的感触是:视频编解码算法工程师的笔试,不是靠刷题和背八股能通过的。通用算法部分刷到中档水平就够了,真正拉开差距的是你对编码框架的理解深度。最好的复习路径是拿x264/x265源码,把预测、变换、量化、熵编码、码率控制这几个模块各读一遍,亲手调一调参数,看看码率、画质、延迟各有什么变化。等你能说清楚“为什么改这个参数会让码率变高”“为什么这个模式在该场景下更优”,笔试里的绝大多数题目就已经拦不住你了。