RTC中屏幕共享svt-av1:scc的优化实践
摘要:本文系统梳理了屏幕内容编码(SCC)的技术演进与AV1编码器生态。首先回顾了SCC从HEVC-SCC到AV1、VVC的标准化历程及其核心工具。随后重点对比了AOMedia生态下的三大AV1编码器(libaom、SVT-AV1、rav1e),深入剖析了SVT-AV1的架构优势、预设档位设计与线程模型。最后,针对屏幕共享场景,探讨了SVT-AV1的SCC专项优化路径,包括调色板模式、IBC的快速决策以及内存访问模式重构等,旨在实现高压缩率与低复杂度的平衡。
前言
随着远程办公、在线教育、云游戏等应用的普及,高效编码与传输计算机生成的屏幕内容(如桌面界面、文档、代码编辑器)已成为关键需求。传统视频编码标准针对自然场景设计,在处理屏幕内容时面临压缩效率低、复杂度高、画质受损等挑战。屏幕内容编码(Screen Content Coding, SCC)技术应运而生,通过利用屏幕内容的独特特征(无噪声、锐利边缘、有限颜色、空间重复性等)显著提升了编码效率。
本文旨在为开发者与技术决策者提供一份关于SCC技术及AV1编码器选型的实用指南。文章将首先概述SCC的标准演进与核心工具,然后深入对比主流AV1编码器的特性与适用场景,最后聚焦于SVT-AV1在SCC场景下的优化实践,为相关应用开发提供参考。
屏幕内容编码工具最早在 HEVC-SCC(2016 年)中正式引入,根本动机是传统视频编码标准无法高效处理计算机生成的屏幕内容。核心驱动力是 2010 年代屏幕共享、远程协作等应用的爆发式增长。HEVC-SCC 通过 IBC、调色板模式、ACT、AMVR 四大工具,利用屏幕内容的无噪声、锐利边缘、有限颜色、空间重复、离散运动等特征,实现了相比自然视频编码2倍以上的压缩效率提升。这些工具随后被 AV1 和 VVC 继承并标准化。
|
标准 |
SCC 支持情况 |
|
HEVC-SCC (2016) |
首次引入,作为扩展(非强制) |
|
AV1 (2018) |
将 SCC 工具纳入基础标准(非扩展),支持 IBC、调色板模式、变换跳过 |
|
VVC/H.266 (2020) |
继承并增强 SCC 工具,新增 TSRC(变换跳过残差编码)、BDPCM 等 |
值得注意的是,AV1 将 SCC 作为标准内建功能而非扩展,这意味着所有 AV1 解码器都必须支持屏幕内容解码,推动了 SCC 在移动端(如骁龙 8 Gen 2、天玑 9000)的硬件解码支持。
屏幕共享场景主要采集电脑如笔记本,PC。分辨率1080p起步,主流PC已经默认4k分辨率,如果按自然视频编码发送码率太高,画质也难以保障。那么引入SCC屏幕编码工具是强需求。通过上述分析,AV1编码器是最优选择。Av1编解码器有四大开源工程,即aom、svt-av1、rav1e和dav1d。它们均出自AOMedia(开放媒体联盟)组织。 Svt-av1比较特殊,单独介绍如下:
一、SVT-AV1 项目的历史与组织关系
起源:Intel + Netflix 的独立项目
SVT-AV1 最初 并非 AOMedia 官方项目,而是 Intel 与 Netflix 于 2018 年 8 月开始合作开发的独立编码器项目。
Netflix 在 2020 年的技术博客中明确说明:"Intel 和 Netflix 自 2018 年 8 月以来一直在 SVT-AV1 编码器和解码器框架上展开合作。"
被 AOMedia 正式收养(2020 年 8 月)
2020 年 8 月,AOMedia 宣布成立 Software Implementation Working Group(SIWG,软件实现工作组),正式将 SVT-AV1 收养为 AOMedia 的官方 AV1 编码器实现。
这一转变的关键信息:
- 代码仓库迁移:从 github.com/OpenVisualCloud/SVT-AV1 迁移到 github.com/AOMediaCodec/SVT-AV1(后改为 GitLab)
- SIWG 联合主席:Facebook 的 Ioannis Katsavounidis 和 Tencent 的 Xiang Li
- 软件协调员:Intel 的 Hassene Tmar
- 使命:"创建在各种应用中提供出色视频压缩的 AV1 编码器实现,消除计算复杂度权衡"
二、AOMedia 生态中的三大 AV1 编码器对比
AOMedia 生态中有三个主要的 AV1 开源编码器实现,定位各不相同:
|
维度 |
libaom |
SVT-AV1 |
rav1e |
|
开发主体 |
AOMedia官方(Google主导) |
Intel + Netflix → AOMedia SIWG |
Xiph/Mozilla 社区(Rust) |
|
定位 |
AV1 参考实现(Reference) |
生产级高性能编码器 |
安全、可审计的替代实现 |
|
语言 |
C/C++ |
C + 汇编 |
Rust |
|
编码速度 |
慢(~2-15 fps @ 1080p) |
最快(~50-120 fps @ 1080p) |
中等(~15-60 fps) |
|
压缩效率 |
最高(基准) |
接近 libaom(差距 < 2%) |
略低于 libaom |
|
标准符合性 |
黄金标准 |
完全合规 |
完全合规 |
|
配置灵活性 |
极高(研究用) |
中等(生产用) |
较低 |
|
主要场景 |
研究、AV2 开发、最高质量 VOD |
VOD 批量转码、实时编码 |
安全敏感场景、Web 集成 |
|
实时编码 |
勉强(cpu-used 7-8) |
原生支持(Preset 8-12) |
有限支持 |
|
解码器 |
有(参考解码器) |
已移除(v2.1.1+) |
无 |
三、libaom 与 SVT-AV1 的核心技术差异
1. 架构哲学
|
libaom |
SVT-AV1 |
|
递归块划分(RDO 递归决策) |
多阶段流水线(由粗到精筛选) |
|
单帧处理为主,Tile 级并行 |
三维并行:帧级 + 片级(Segment)+ 任务级 |
|
为质量优化(RDO 搜索最彻底) |
为速度优化(预设档位覆盖极广) |
|
适合离线高质量编码 |
适合大规模批量转码和直播 |
SVT-AV1 的核心架构是 Scalable Video Technology(可扩展视频技术),专为 Intel Xeon 多核处理器设计,通过将每帧拆分为多个 Segment 并行处理,在不损失质量的前提下最大化计算资源利用率。
2. Preset 档位设计
- libaom:-cpu-used 0-8,共 9 档,速度跨度约 187 倍,但最快档仍难以实时
- SVT-AV1:-preset -2 到 13,共 16 档,覆盖从极致质量到实时直播的全场景
SVT-AV1 的 Preset 10-12 已可实现实时编码,这是 libaom 无法做到的。
3. 线程模型
- libaom:Tile 级并行 + Row-MT(行级多线程),线程扩展性有限
- SVT-AV1:Segment-based 并行 + 帧级并行 + 任务流水线,在 8 线程以上仍有良好扩展性
有趣的是,SVT-AV1 的测试表明,超过 8 线程后性价比递减——从 1 线程到 8 线程的吞吐量提升与云 CPU 成本增长基本匹配,但超过 8 线程后成本效益下降。
关键要点:
- AOMedia 负责 AV1 标准规范、专利池管理和生态推广
- libaom 是 AOMedia 官方维护的参考实现,承担"算法正确性黄金标准"和 AV2 研究平台的角色
- SVT-AV1 最初由 Intel + Netflix 独立开发,2020 年被 AOMedia SIWG 收养为官方生产级编码器,专注速度-质量平衡和实时编码
- rav1e 是社区驱动的 Rust 实现,强调安全性和可审计性
- dav1d(VideoLAN)是独立的最快 AV1 软件解码器,不属于 AOMedia 官方项目
对于生产环境的选择建议:VOD 批量转码和直播场景首选 SVT-AV1,需要最高压缩效率或进行编解码研究时用 libaom,安全敏感场景考虑 rav1e,解码端统一使用 dav1d。
为什么我们只在scc场景下才选择av1编码呢?svt-av1经过多年优化,从preset上也已经覆盖到实时场景。但是对比x264和openh264在同等压缩率下复杂度没有优势,而解码器生态还不成熟,而scc场景首先通过优化scc编码工具,不需要前处后处理(包括内部的LPfliter,CDEF等)复杂度可控,压缩率提升1倍。其次屏幕共享的帧率刷新更低,通常低于15fps,有甚者分享刷新1~5fps. Svt-av1 scc实测4kp15不到1Mbps,已经满足清晰度需求。对于生产端和接收端的cpu性能都没有压力。
四、SVT-AV1的SCC优化
1.屏幕内容编码(SCC)强化
SVT-AV1 的 SCC 优化弱于传统视频,需要如下算法优化:
- 调色板模式(Palette Mode):UI/文本内容压缩效率极高,但搜索开销大,需快速决策
- IBC(Intra Block Copy):屏幕内容中大量重复图案,IBC 可替代 inter 预测
- 跳过模式(Skip Mode):静态区域直接复制参考块,几乎零码率
其次各算法模块的simd指令集优化加速。支持 x86 (SSE2/SSSE3/AVX2/AVX-512)、ARM (NEON)
2. SVT-AV1自身常规流程优化。
早期Svt-av1的解码器(24年6月移除)与dav1d解码性能对比有明显差距。Scc编码器除编码流程外还包含自解码流程。
1) 编码器双向操作(正向变换 + 量化 + 反量化 + 逆变换)
正如我们上文所言。 Svt-av1的实现有一个问题,正反变换有重复的二次转置问题。需要相应的修改扫描与反扫描矩阵,移除正反变换中的二次转置操作。
2) Dav1d解码器汇编模块的移植
Intrapred,mc,tx/itx只需要少量代码重构,可以复用dav1d的深度指令集汇编优化。比较复杂的LPFilter和cdef等模块可以屏蔽掉,或者后期进行PGO编译优化。
3) SAD/SATD重计算复用
4) 内存访问模式重构
借鉴 dav1d 的 cache-friendly 设计:
- 减少编码器各阶段间的内存拷贝(Zero-Copy)
- 优化参考帧的内存布局,提高运动估计时的缓存命中率
- 压缩上下文数据结构,减少 L2/L3 缓存占用
通过以上优化,1080p scc双线程编码能轻松达到200fps,码率降到200~300bps.
更多推荐
所有评论(0)