ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

360°视频编解码器性能评估:测试条件、参考软件与质量指标

360°视频编解码器性能评估:测试条件、参考软件与质量指标 360°视频这几年其实已经不算新鲜词了但真正上手做过编解码器性能评估的人恐怕没有想象中那么多。原因很简单360°视频的评估流程和传统平面视频差别太大测试条件、参考软件、评价指标几乎每个环节都是另一套逻辑。如果照搬H.264/HEVC时代那套“YUV序列QP列表VQMT算PSNR”的流程去测360°视频结果基本是废的甚至会得出和主观体验完全相反的结论。这篇文章我会按照我自己实际跑实验时的思路来梳理先讲清楚360°视频评估为什么难再把测试条件、软件参考配置、质量指标这些核心环节逐个拆开最后附上我已经踩过并且确认绕开的坑。适合刚接触VR视频编码评估、准备搭测试环境的工程师也适合想弄明白“这个测试数字到底怎么来的”的研究生。1. 360°视频评估的特殊性为什么不能直接沿用传统视频测试流程很多人刚开始做360°视频编码实验时第一反应是“先找一个4K的视频用HM或者x265压一遍算个PSNR就完事了”。这个思路放在普通平面视频上没什么大问题但放到360°视频上从输入格式到评价方式每一步都可能出问题。360°视频的“画面”本质上不是一幅画面而是一张球面映射出来的平面图。观看者在头显里看到的只是这个球面上的一个局部视口。这带来两个直接影响第一画面内容在球面不同区域的“重要程度”不一样赤道区域往往是观看者注意力集中的地方极地区域几乎没有观看价值第二直接对整张映射平面计算失真会把大量出现在“根本没人看”区域的失真也统计进去导致客观分数和真实体验严重脱钩。所以360°视频的编解码器性能评估从一开始就要带着“球面感知”的视角去做。测试条件不仅仅是一串参数列表它决定了你的实验能在多大程度上还原真实使用场景。参考软件配置也远远不是打开编码器默认参数就行投影格式、帧打包方式、QP范围、码率锚点设置每一个选项都会影响最终评估结论的可靠性。我在实际测试中最深刻的体会是360°视频评估更像是在“模拟用户”而不是“压缩像素”。你选的测试条件越接近真实头显用户的状态测试结果对产品决策的参考价值就越大。1.1 360°视频投影格式对评估流程的直接影响投影格式是360°视频和平面视频评估流程中第一个分叉点。目前用得最多的是ERP等距柱状投影也就是把球面经纬度均匀映射到矩形平面。这种投影实现简单软件生态成熟编解码器完全不需要做额外适配所以大多数公开测试序列都直接提供ERP格式。但ERP有一个著名的“极地过采样”问题赤道区域的像素密度比极地区域低得多而极地区域却占用了大量不必要的码率。另一个麻烦是ERP图像的左右边缘在球面上本来就是连续的编码时如果处理不好会在接缝处产生明显的视觉伪影。这就引出了一个关键决策测试时到底用什么投影格式如果做的是“编解码器性能对比”通常选择ERP直接编码因为所有参考软件和评价工具都支持减少变量。如果做的是“端到端系统评估”就得考虑CMP立方体映射或其他金字塔投影并配套对应的评价工具否则测出来的结果并不能代表实际产品的水准。我在项目初期图省事全部用ERP后来发现某些高压缩率场景下ERP接缝处的失真会被传统PSNR掩盖直到换成视口评价才暴露出来。这个教训后面在指标章节会继续展开。1.2 编解码器评估目标决定测试条件的选择策略评估目标不同测试条件的敏感度完全不一样。举个例子如果你想对比HEVC和AV1在360°视频上的压缩效率那么测试序列的选取、QP的设置、码率锚点画法都必须保证两种编码器都在“合理工作区间”内否则可能得出“AV1比HEVC差”这种违背常识的结果。如果你的目标是评估“某个投影预处理方案能否提升编码效率”那就不能只测高码率段因为低码率下投影带来的边界平滑效果差异往往更明显。具体来说高码率时失真主要是量化噪声主导投影格式的影响会被湮没低码率时块效应和振铃效应占主导投影格式决定的像素分布特性才会拉开差距。所以每次搭测试环境之前我都会先写清楚一句话这个实验要回答什么问题测出来的数字给谁看。后面所有测试条件的决策都围绕这句话展开而不是先抄一份公开论文的配置表。2. 360°视频编解码器性能评估的常见测试条件“测试条件”这个说法听起来宽泛但落实到代码和命令行其实就是几组有严格规范的参数集合。做编解码器性能评估这几年最常用的测试条件来源是JVET联合视频专家组在360°视频标准化过程中定义的公共测试条件Common Test Conditions。虽然这套条件主要服务于标准制定但拿来作为通用评估参考依然是最稳妥的起点。2.1 测试视频序列的选取标准分辨率、内容类型与时长的平衡测试序列是评估的地基选不好后面全白搭。JVET 360°测试序列有一个清晰的筛选逻辑分辨率覆盖至少要包括4K3840×1920和8K7680×3840两个档次。8K序列在头显设备里已经能明显感受到“纱窗效应”降低和4K的编码特性差别显著。内容多样化快慢运动、室内外、有无明显高频纹理、是否有大量细节在极地区域。只选风景慢镜头会让高码率档位的评估失真。固定时长标准做法是单序列测试10秒。为什么是10秒太短无法覆盖场景切换导致的码率波动太长会让测试时间成倍增加在多个QP下反复跑时拖慢整个实验周期。我自己做实验时会额外加一个原则序列里不能有连续的大面积纯色天空或纯色地面否则测出来的RD曲线会异常平滑给人“这个编码器很强”的错觉。真实VR内容里很少会有这么“友好”的画面。![测试序列内容选择要点]此处以一个立体混合场景为例说明运动复杂度和纹理丰富度对编码难度的影响2.2 编码器运行参数QP范围和码率锚点怎么定在对比不同编解码器的RD性能时最常见的方式是固定QP量化参数让编码器自然输出各自码率再拟合RD曲线。这个思路在360°视频里依然适用但QP的范围设置要更谨慎。我常用的配置是四个QP点22、27、32、37。这组值从视觉无损到中等劣化都有覆盖且是编解码器RD对比中使用最广泛的锚点方便和公开结果对比。对360°视频来说由于球面映射带来的空间冗余结构相同QP下输出码率往往比平面视频高这不算异常。如果项目更倾向于“限定码率”的评估方式比如“在15Mbps下对比各编码器的视口质量”那么锚点码率的选择要参考目标业务。移动端VR一体机的码率预算通常是10-20MbpsPC有线串流可以到40-80Mbps不同档位下编解码器的相对排名是有可能翻转的所以只测单一码率档位会遗漏重要信息。提示做码率控制的评估时如果只用一次编码的码率控制结果就直接下结论风险很大。稳妥的做法是先花一轮时间做“码率逼近”——调整QP或CRF让输出码率尽量贴近目标误差控制在±5%以内再开始正式对比。2.3 帧率、位深以及编码结构配置细节360°视频测试中帧率设定通常跟随源内容走常见是30fps和60fps。60fps的序列比30fps敏感得多高帧率下运动拖影和时域闪烁会导致相同QP档位的MOS分数大幅下降。如果测试目标涉及高帧率VR场景必须把帧率作为显式变量纳入测试条件。位深方面目前主流参考软件都支持10bit编码360°视频我强烈建议直接用10bit做评估。原因很简单8bit在暗场景下极易出现banding伪影这类伪影在头显放大观看时非常显眼却在PSNR指标上几乎没有体现。用10bit可以把这个变量排除掉让评估结果聚焦到编解码器本身的压缩性能。编码结构上I帧间隔和参考帧数量也需要注意。实时VR streaming场景通常用较短GOP例如32或64帧低延迟配置而离线点播场景可以放心用全I帧长GOP。如果评估目标是“真实业务对比”最好严格按照你的实际streaming配置来跑而不是用编码器默认参数。因为参考帧数量的差异可能比编码器本身之间的差异还大。3. 软件参考配置从HM/VTM到360Lib的配套工具链测试条件定了以后软件参考配置就直接决定了实验能否顺利复现。很多刚开始做360°评估的同学卡在这一步因为参考软件不仅指编解码器本身还包括投影转换、质量评估等一整套工具链。3.1 编解码器参考软件怎么选每种软件的定位和局限HMHEVC参考软件最经典的HEVC参考实现提供完整的编码工具集跑出来的RD结果非常稳定适合验证算法思路。缺点是速度太慢跑一个8K序列的4个QP实验基本上要挂机一整天。适用于做标准化对比不适合作大规模参数扫描。VTMVVC参考软件VVC时代的参考软件在HEVC基础上加入了很多新的编码工具压缩效率明显优于HM。如果你的评估目标是“下一代编码标准相对上一代能省多少码率”VTM对比HM是最干净的回答方式。x265 / x264实际工程中最常用的开源编码器。它们和HM/VTM的关系可以理解成“量产车和测试车”——x265追求压缩效率和编码速度的平衡编码工具默认开启的策略经过大量调优。做360°视频产品级评估时x265是主力做学术对比时则要谨慎因为它并未实现HEVC的全部工具。AV1参考编码器libaom如果你关心AV1在360°视频上的表现绕不开libaom。它的编码速度比x265慢很多但工具完整支持滤波强度和Tiling调节。实际测下来AV1在低码率档位的视口质量确实有明显优势但编码耗时确实让人抓狂。在360°视频评估中不同参考软件之间还有一个坑全景映射的边界处理策略。ERP图像左右边缘虽然在球面上是相邻的但编码时如果参考软件的环路滤波跨越了图像边界会产生接缝预测错误。HM和VTM对这类边界情况的行为并不完全一致严格做算法对比时最好先确认参考软件是否启用了360°边界处理支持。3.2 360Lib投影转换和质量评估的枢纽工具如果说编解码器是评估流程的引擎那么360Lib就是连接源序列、编码器和质量指标的传动轴。这个库主要负责两类工作一是在不同投影格式之间转换ERP转CMP、转视口等二是提供360°专用的质量评估指标计算。360Lib里有一个工具叫Mapa专门做投影映射转换。它的用法我举个例子你想把一段ERP序列转成8×8面的CMP序列可以一条命令搞定同时指定输出位深、边界填充方式等。这里最需要注意的是边界填充方式。CMP展开后相邻面之间本来应该有连续的几何信息简单的像素复制会导致编码后接缝处出现视觉割裂。360Lib里可选“拉伸填充”或“几何填充”效果差异肉眼可见。质量评估方面360Lib提供了一系列针对球面感知的指标计算器包括WS-PSNR、CPP-PSNR等后面我会重点展开。这里先明确一点使用360Lib时输入和输出的投影格式必须与你的评价目标严格匹配否则算出来的“球面PSNR”名不副实。注意360Lib的编译依赖关系比较繁琐建议严格按照README的版本号匹配来装不要偷懒用系统自带的老版本cmake否则会在编译阶段浪费很多时间。我自己的做法是常用Ubuntu 20.04 gcc 9.4 cmake 3.16的稳定组合一年没出过编译问题。3.3 最容易被低估的配置项GOP结构、运动估计范围和环路滤波接触参考软件配置越久越会发现真正决定评测结果质量的往往不是那些宏大的编码工具开关而是几个不起眼的配置项。GOP结构360°视频中时域预测的参考关系直接影响运动补偿效率。尤其是8K序列运动矢量范围需要更大默认配置里运动搜索范围设置为64像素的话在高速旋转镜头的序列上会明显吃力。建议根据测试序列的运动剧烈程度把运动搜索范围适当提高到128甚至256但要权衡编码时间。环路滤波强度ERP图像在极地过采样区域产生的块效应以及CMP面与面之间的边界不连续都可以靠环路滤波缓解。参考软件默认的滤波强度是为平面视频调的对360°视频不一定最优。如果对比不同编码器需要保持这个参数设置的一致性否则差异不全是编码器本身造成的。Tile/分块配置这是360°视频独有的重点。VR streaming产品常用Tile技术实现视口自适应传输如果你想知道“Tile切割对编码效率有多少损耗”就得在参考配置里打开Tile工具并合理选择Tile尺寸。经验值是4×2或6×3的Tile网格在视口自适应和编码效率之间比较平衡。4. 质量评价指标为什么传统PSNR会误导360°视频评估质量评价是整个评估流程的“裁判”但它也是最容易出争议的环节。360°视频的失真分布在球面不同位置对主观体验的影响是极其不均匀的。4.1 平面PSNR和WS-PSNR、S-PSNR的本质差异传统PSNR是对整幅图像所有像素的MSE取对数然后映射到分贝尺度。在平面视频里观看者一帧内所有区域的关注度相对均匀所以这个指标还能用。但在360°视频中ERP展开图的极地区域被严重拉伸每个像素代表的球面面积差异非常大。如果直接在ERP图上计算PSNR相当于给“重要度低”的极地像素和“重要度高”的赤道像素分配了相同的权重结果自然失真。WS-PSNR的思路就是针对这个问题设计的它不是简单地对每个像素的MSE取平均而是按照每个像素在球面上对应的面积比例来加权。简单理解赤道附近的像素权重高极地像素权重低最终得分更接近用户在头显里的真实感知。S-PSNR的另一个思路是在球面上均匀采样视口再对每个采样视口计算传统PSNR并取平均。这更接近“用户随机看向任意方向”时的平均体验。实际项目中WS-PSNR计算速度快、稳定性高适合大规模自动评估S-PSNR更贴近主观但采样视口的数量和位置选择会影响分数结果的波动性稍大。4.2 视口级评价从“整幅图像质量”到“用户真实所见”我真正意识到传统指标无效是在一个8K测试序列上。源视频有一段镜头是高空俯瞰城市地面纹理极其丰富天空部分是大面积渐变。用传统PSNR看编码器A明显领先编码器B可拿给体验者做主观评价结论正好反过来。后来排查发现天空渐变区域在ERP图里占了大面积像素编码器B在天空区域使用了更强的平滑滤波导致整图PSNR偏低但真正会被用户看到的城市纹理区域编码器B反而保留了更多的细节。传统PSNR被“没人关心的天空”带偏了。从此之后我的评估流程里增加了“视口级评价”这一项。具体做法是把编码后的ERP序列根据用户头部运动轨迹转成若干个视口视频然后在视口视频上计算PSNR或SSIM。这个方法计算成本高但能直接反映真实体验适合在小样本关键序列上做“压舱石”验证。还有一个不可忽视的环节主观评价。客观指标再优化也不能完全替代人眼。在做主观实验时我建议采用SSIM-MOS或DSCQS方法注意控制头显设备的分辨率和FOV被试的注视方向尽量自由否则实验结果容易受设备限制的影响而不完全是编码质量的差异。4.3 各种评价指标的组合使用策略现在遇到很多同学问我“到底该用哪个指标”我的回答是不要只用一个。我自己在项目交付时的指标组合是这样的主体实验用WS-PSNR稳定、快速、可复现关键序列用视口PSNR贴近真实体验最后再用一轮小规模主观实验校准客观指标的可靠性。这样既保证了效率又防止了单一指标的盲区。在写报告时必须同时给出指标名称、投影格式、编码配置和软件版本没有这些上下文的PSNR数字毫无意义。5. 实操记录搭建一套完整的360°编码器评估流水线前面讲了这么多理论和配置思路现在落地上手走一遍从测试序列到评估结果的完整流程。这一节我按自己跑实验的操作顺序来写你可以直接照做。5.1 环境准备与工具链编译操作系统我推荐Ubuntu 20.04 LTS内存建议32GB以上跑8K序列时内存和磁盘都会比较紧张。磁盘预留至少200GB因为8K YUV原序列加上编码输出会轻松吃掉几十GB。编译顺序是先编译360Lib再编译FFmpeg用于YUV和MP4的转换最后编译编码器。如果用的是VTM记得在编译配置里把360Lib路径指进去这样VTM才能直接处理360°专用的投影信息。5.2 把原始序列转为编码器认识的格式大多数公开360°测试序列原始格式往往是ERP的8K YUV或者以MP4容器封装。第一步需要统一格式如果是MP4封装的源用FFmpeg提取成YUV420P10LE格式并记录好分辨率、帧率信息。需要注意MP4里可能包含H.265编码后的“已压缩”内容直接用提取的YUV做评估会导致“压缩后的再压缩”问题所以尽量寻找未压缩的原始母版序列。如果是YUV文件直接检查文件大小和帧数是否匹配。我经常遇到序列文件被截断或者padding的问题稳妥的方法是写个脚本校验文件总字节数是否等于“宽×高×1.5×帧数”。5.3 编码器配置文件和命令行参考以VTM为例一份用于360°视频评估的编码配置大致包括输入分辨率7680×3840或3840×1920输入格式P01010bit YUV帧率30或60QP22 27 32 37逐次运行GOP长度32运动搜索范围128开启360边界处理如果编解码器支持然后执行VTM编码器每跑一个QP都能得到对应的码流和重建YUV。重建YUV是后续质量计算的关键输入务必保存好。5.4 质量指标计算与结果整理质量指标计算使用360Lib提供的小工具分别计算ERP域的WS-PSNR和视口PSNR。输出结果整理成CSV表格包含每个序列、每个QP的码率、WS-PSNR、视口PSNR。最终画RD曲线时横轴用码率通常取对数纵轴用指标值。对比不同编码器时可以使用BD-RateBjontegaard Delta Rate计算“在相同质量下节省的码率百分比”。BD-Rate是编解码器评估里的标准沟通语言报告结论时一定要给出来。6. 常见问题与排查技巧实录实操里总会遇到一些反复出现的坑我整理了这几条比较典型的希望能帮你省下几天时间。6.1 编码后重建视频出现接缝彩条这是ERP序列编码最常见的异常之一。先检查源序列在拼接成ERP时是否做了边缘填充如果没做编码时左右边缘的块预测会互相干扰。处理方法是使用360Lib预处理阶段把ERP边缘的8像素重叠复制。如果边缘正常但重建后仍有彩条就需要检查编码器是否启用了环路滤波的边界处理开关。部分开源编码器对非标准分辨率比如3840×1920这种宽高比2:1但编码块尺寸不整除处理不完善建议把分辨率水平对齐到编码块尺寸的整数倍。6.2 客观分数高但主观体验差当出现“PSNR明明很高但戴上头显觉得差”的情况我习惯先排除两个原因第一是否在ERP图上直接计算的普通PSNR如果加权了极地信息分数就会失真。换成WS-PSNR或视口PSNR再看。第二是否在时域上存在闪烁效应。360°视频对时域稳定性极其敏感两个编码器如果静态帧质量差不多动态场景下的时域一致性可能是拉开体验差距的关键。这类问题靠单帧PSNR无法检测需要统计多帧的PSNR波动曲线或者增加主观观察。6.3 不同编码器跑相同QP但码率差距过大如果对比的编码器在相同QP下的输出码率差异超过30%以上先别急着下“某编码器压缩效率高”的结论。先检查两个编码器的GOP结构是否一致——HEVC的I帧间隔为32和间隔为64码率差异非常大。再检查是否都开启了相同的码率控制选项CQP模式下不同编码器的RateControl逻辑差异会导致QP到码率的映射关系不同。标准的做法是统一所有编码器的GOP长度、参考帧数、码率控制模式再对比。如果做到这一步还是有较大差异那才是真正反映了编码器本身的压缩效率差异。6.4 8K序列编码内存溢出VTM或HM处理8K序列时内存占用轻松超过16GB。编译时一定要开启64位模式并确保系统有足够的交换分区。如果还是溢出可以尝试把序列按帧切片处理但要注意切片段与段之间需要有GOP边界不能简单硬切否则对比结果会引入误差。7. 最后再分享几点实用经验这套流程跑下来至少需要一两周时间但很多环节是可以并行的。多台机器分工跑不同配置的编码任务能把整体时间压缩到两三天。编码任务比较吃CPU建议用带超线程的高端桌面处理器而不是虚拟机虚拟机的性能损耗在接受对比实验时不可接受。还有一点关于数据管理的心得每次实验最好都固定一个输出目录命名规则比如{编码器}_{分辨率}_{QP}_{日期}。我早期因为文件名不规范把不同版本的编码结果混在一起重新跑实验浪费了整整一个周末。现在每次跑完都会立即写一个README记录环境版本、源码commit号、配置文件的哈希值确保三个月后还能完全复现当时的实验。另外选测试序列时尽量选择有公开主观评价结果的序列集这样你的客观指标可以间接和公开主观分做校准。如果客观指标趋势和公开主观分趋势矛盾排查的优先级应该是先检查指标计算是否用了正确的投影域再检查参考软件的配置是否和公开实验一致最后才怀疑序列文件本身。360°视频的编解码器性能评估本质上是在“压缩的像素”和“用户的视线”之间建立一座桥。测试条件和软件参考配置就是这座桥的桥墩只有桥墩扎实桥面上跑的任何算法、任何数据才可信。希望这篇文章能帮你少踩几个坑把时间花在真正有价值的内容对比上。
返回列表