# WebCodecs 性能表现及优化思路

笔者开源 WebAV (opens new window) 已经一年半,还写了系列文章帮助初学者入门 Web 音视频。

之前一直隐隐担心在 Web 平台处理音视频与 Native APP 会有明显性能差距,因为 WebCodecs API 毕竟被浏览器代理了一层,且一些数据处理需要 js 配合,不确定有多大的性能损耗。

相信刚接触 WebCodecs 的读者也非常关心它的性能表现如何。

如今 WebAV (opens new window) 已经稳定下来,v1.0 即将发布,于是做了一些简单的性能测试,结果还算乐观 :)

注:WebAV 是基于 WebCodecs 构建的 SDK,在 Web 平台创建/编辑视频文件

# 环境信息

测试资源:bunny_avc_frag.mp4 (fMP4),1080P,10min,AVC 编码;
输出: 10min,3M 码率,30 FPS
方法:在视频中央绘制一个最简单的文本,合成导出视频

# 设备

  1. 设备 1:MacBook Pro, M1(2020), 16 GB
  2. 设备 2:AMD Ryzen 7 5800 8-core,RTX 3080, 32 GB
  3. 设备 3:Intel i9-9900k, RTX 2070, 32 GB
  4. 设备 4:Intel i5-8265U, UHD Graphics 620, 8 GB

# WebCodecs 性能表现

数字是合成视频消耗的时间(单位 秒),WebAV 性能数据以后文最新版为准
benchmark

注 1:本地合成(WebAV、ffmpeg、剪映 APP),跟设备的硬件配置强相关;云端合成(剪映 Web),跟服务资源分配的资源强相关
注 2:剪映 APP 是由官方下载器自动安装的,有个 4.1.0 版本很奇怪,我也不知道原因

2024.08.12 更新 WebAV v0.14.6 优化后数据

benckmark-240812

2024.08.16 更新 WebAV v0.14.9 优化后数据 benckmark-240816

若读者有兴趣可自行对比或在评论区讨论,WebAV 性能测试代码在这里 (opens new window),其它工具请自行安装。

# 总结

WebCodecs 能利用硬件加速进行编解码,经过三次优化 WebAV 的性能表现有明显进步;
跟 Native 方案在部分设备上还有一些差距,虽然还有优化空间,但个人感觉性能不再是方案选择的主要考量因素了;
所以,接下来主要优化 SDK 的稳定性,以及准备发布 v1.0 版本 (opens new window)

也说不定未来还会再次优化性能,关注 WebAV(WebCodecs)性能优化数据的同学,可以订阅该 文章评论对应的 issue (opens new window) 以接收更新。

image

# 性能优化思路

以下记录一些笔者的经验,欢迎读者讨论与补充

# 性能瓶颈在于编码

编码任务是最消耗计算资源的,所以不要因其他任务(解封装、解码、合成等等)让编码器处于阻塞等待状态;
可以提前准备好帧数据,一旦开始合成视频,要让编码器持续工作,让编码队列有不间断的视频帧供给。

但需要注意控制好内存/显存占用,不要提前解码太多数据;
编码队列也不能太大,避免打爆显存,详情阅读后文控制显存占用

# 多编码器并行

因为性能瓶颈在于视频编码阶段,稍加分析可发现大量时间在等待编码器输出;
所以可以创建多个编码器,充分利用 GPU 硬件加速,将编码任务按 GoP 分配给多个编码器,然后按时间顺序组装多个编码器输出的数据,在部分设备上有明显的优化效果。

# 优化内存占用

音视频文件体积通常会比较大,如果将整个文件加载到内存中将占用过多内存空间,导致频繁 GC 降低性能,加载特别大的音视频文件还会溢出导致错误或崩溃。

可以将视频文件写入到 OPFS(私有源文件系统),按需读取到内存中;
WebAV (opens new window) 依赖了 opfs-tools (opens new window) 来操作私有源文件,大幅降低了内存占用。

# 优化内存分配

在 js 语言中 ArrayBuffer 是可操作的内存数据的抽象。

Web 开发者很少需要关注内存的分配与回收,但音视频处理过程中经常需要对较大的内存数据进行操作,如果频繁创建、回收内存会对性能造成负面影响。

这里介绍一些跟 Web 音视频性能优化相关的 API。

注意 resize、transfer 的兼容性,启用 SharedArrayBuffer 的条件

# 控制显存占用

视频帧(VideoFrame (opens new window))是图像的原始数据,会占用较大的显存空间,切记同一时刻不能持有过多的视频帧对象,按需创建、用完立即 close,否则会打爆显存,严重影响性能。

解码阶段,解码器(VideoDecoder)输出的 VideoFrame 如果没有及时关闭,累积一定数量后,解码器将停止输出

编码阶段,编码器(VideoEncoder)接收的 VideoFrame 是 js 创建的,此时需要开发者主动控制创建视频帧对象的数量;
检测到 VideoEncoder encodeQueueSize (opens new window) 数量过大,应暂停创建新的视频帧,等待编码器消化队列中的视频帧。

# 附录

💗 博主正处于裸辞待业状态,欢迎 商务合作 💗

相关文章

WebAV SDK(Web 视频编辑)V1 发布

前言 WebAV 是基于 WebCodecs 构建的 SDK,用于在 Web 平台上创建/编辑视频文件。 V1 对项目来说是里程碑版本,意味着 API 已经稳定,且功能的稳定性也经过了长时间的考验,可用于生产环境。 我在 20 年加入 B 站,开始接触 Web 音视频相关的知识(Web 播放器), WebCodecs API 在 21 年发布; 我预期 WebCode ...

纯 Web 视频剪辑

前言 WebCodecs API 为 Web 平台提供了音视频编解码能力,使得在 Web 平台(网页、Electron)上实现高效、专业的视频剪辑成品成为可能。 读者可阅读笔者的入门系列文章获取更详细的信息,或直接使用 WebAV 开源项目在浏览器中创建/编辑音视频文件。 背景 & 方案 为了解决主播投稿场景中,需要对直播视频进行简单编辑的诉求, ...

Google IO 分享 WebCodecs、OPFS 文字版

背景 2024 北京 Google I/O 邀请我参加合作者开发者论坛,主题是 "Build powerful Web App"; 笔者近期在公司项目中实践 WebCodecs,对应的开源项目是 WebAV,在 Web 音视频领域算是相对前沿的探索; 本文主要分享基于 WebCodecs、OPFS 实现的视频剪辑产品,探讨这些 API 还有哪些应用场景; W ...

WebCodecs 编码字符串(codec)介绍

笔者的 Web 音视频系列文章 视频播放经常会看到这样的字符串 video/mp4; codecs="avc1.4d002a",WebCodecs 编解码器初始化也需要配置 codec 参数,本文尝试简单介绍编码字符串含义。 视频编码分许多种类,每个种类还分多个版本,不同种类、版本对应的编解码算法、支持的能力(分辨率上限、色深等等)不同 ...

WebCodecs 开启 Web 音视频新篇章

你可以先略过下面的无聊文字,体验一番 WebCodecs 的实力 WebCodecs 是什么 WebCodecs 是一个 Web 规范,21 年 9 月份在 Chrome 94 中实现 WebCodecs 提供访问编解码能力的接口,可精细控制音视频数据 Web 音视频 API 存在什么问题 音视频技术在 Web 平台上的应用非常广泛,已有许多 Web ...

【译】WebCodecs 说明

本文翻译至 WebCodecs Explainer 问题与动机 已有许多 Web API 在内部使用媒体编解码器来支持特定用途,比如: HTMLMediaElement and Media Source Extensions WebAudio (decodeAudioData) MediaRecorder WebRTC 但是还没有一种通用的方式来灵活 ...

Web 音视频(六)图像素材处理

Web 音视频目录 前序章节介绍了如何在浏览器中解析、创建视频,以及给视频添加一些自定义素材(图片、音频、文字...); 本章介绍如何给图像素材加特效、加动画,实现转场、移动水印、图像滤镜美化等功能。 你可以跳过原理介绍,直接查看 WebAV 示例 素材动画 在视频制作中实现动画跟其他场景略有不同,因为视频 ...

Web 音视频(七)中期回顾

Web 音视频目录 个人回顾 本系列更新至今,持续了一个月时间,内容可以总结为音频、视频数据的 解析 - 处理 - 合成,在浏览器中比较粗粒度地实现音视频编辑的主要环节,差不多是把 WebAV 项目的原理讲完了。 讲解的知识非常浅,目标读者是准备在 Web 平台进行音视频开发的新手; 这是我第一次进行高频率技术写作,将一 ...

Web 音视频(五)在浏览器中合成视频

Web 音视频目录 经过前序章节的介绍,读者能大致了解如何在播放器中解析、创建视频; 本章介绍何在浏览器中合成视频,这是视频编辑中最基础的功能。 你可以跳过原理介绍,直接查看 WebAV 合成视频示例 在视频上叠加素材 常见的素材有:视频、音频、图片、文字 [在浏览器中创建视频](/posts/2 ...

Web 音视频(四)在浏览器中处理音频

Web 音视频目录 为什么单独介绍音频处理? 网络上缺乏音频处理的资料,绝大多数示例都是针对视频而略过音频,很多人在网上寻找音频处理的示例 对前端开发者来说,音频处理相对视频略微复杂一些 所以,本文专门针对音频数据,汇总讲解采集-处理-编码-封装全过程,帮助初学者入门。 ![audio-data-flow](./audio ...