# 纯 Web 视频剪辑

# 前言

WebCodecs API 为 Web 平台提供了音视频编解码能力,使得在 Web 平台(网页、Electron)上实现高效、专业的视频剪辑成品成为可能。

读者可阅读笔者的入门系列文章 (opens new window)获取更详细的信息,或直接使用 WebAV (opens new window) 开源项目在浏览器中创建/编辑音视频文件。

# 背景 & 方案

为了解决主播投稿场景中,需要对直播视频进行简单编辑的诉求,我们需要开发一款轻量视频剪辑产品。 让用户能在线上完成 直播 - 编辑 - 投稿 流程。

现有 Web 平台的剪辑产品实现方案有

  1. 云端:网页提供剪辑 UI,用户操作同步到云端进行剪辑
  2. ffmpeg.wasm:将 ffmpeg 编译为 wasm,在网页中剪辑
  3. WebCodecs:使用 WebCodecs API 编解码视频数据,配合 Web API 与第三方库实现剪辑
云端 ffmpeg.wasm Webcodecs
成本
生态
扩展性
兼容性
性能

# 方案分析

Webcodecs 方案在成本与扩展性方面有明显的优势,生态成熟度、兼容性则略显不足;
云端方案是当前主流选择,如果项目成本预算足够正好可以与 WebCodecs 互补;
ffmpeg.wasm 因性能太差,无法应用。

Webcodecs 方案

优势

  • 成本:只需要少量 Web 开发即可完成前端剪辑功能,节省开发成本的同时,降低了技术复杂性,且不需要服务器运行、维护成本
  • 扩展性:能轻松与 Canvas、WebAudio 配合,实现自定义功能

缺点

  • 生态成熟度:没有直接可用的转场、滤镜、特效等功能,支持的封装格式有限
  • 兼容性:WebCodecs API 需要 Chrome/Edge 94+(约 10% 的用户不兼容)

结合产品定位(轻量剪辑工具)与用户特征(主播),对缺点包容性较高,因为

  • 生态不成熟并非能力限制,所以是开发成本问题,已有功能能满足当前产品的需要
  • 兼容性其实是时间问题;当前做好提示,引导用户升级浏览器版本

关于 WebCodecs 性能表现及优化思路可阅读这篇文章 (opens new window)

以上,最终选择了 WebCodecs 方案。

# 功能分析

overview

开发一个剪辑产品,只需要三个步骤

  1. 实现素材管理模块
  2. 实现画布模块
  3. 实现时间轴模块

每个模块下都包含许多小功能,比如素材管理、缩略图、预览播放,最终都可以拆解成基础能力,然后基于 Web 平台提供的 API 来实现。

architecture

接下来介绍这些基础能力的实现原理,掌握基础能力即可构建完整的剪辑功能。

# 基础能力实现

# 素材加载、存储

音视频素材体积一般都比较大,上传下载都有一定的时间、带宽成本。

以前在 Web 平台读写文件有很多限制,现在可借助 OPFS API,能较大提升用户体验。

OPFS 中文名是“私有源文件系统”,相当于浏览器给每个网站开辟了一个私有的存储空间,Web 开发者借助这个 API 在私有空间中创建、读写文件,不需要用户用户授权,相比读写用户空间的文件性能也会更好一些。

详情请阅读 Web 文件系统(OPFS 及工具)介绍 (opens new window)

# 素材解析

我们都知道视频是由一系列图片组成

音视频原始数据量非常庞大,为了方便存储、传输,需要将原始数据压缩、封装成常见的音视频文件。

  1. 将图像帧压缩后成组(时间连续的图像往往非常相似,成组压缩率更高)
  2. 许多压缩帧组再加上描述信息(压缩算法、时长、字幕等),构成音视频文件

图像帧压缩后分为 I/P/B 三种类型,I 帧起始加上其后的 P/B 帧构成一个分组(Group of Pictures)。

处理音视频数据的第一步就是解析文件,目的是得到音视频原始数据,反向构建过程即可

视频文件 -> 解封装 -> 压缩帧 -> 解码 -> 原始图像帧

  • 使用第三方库(如 mp4box.js)解封装视频文件,得到 压缩帧
  • 使用 WebCodecs API 解码压缩帧得到原始图像帧

EncodedVideoChunk(压缩帧) 可通过 VideoDecoder(解码器) 转换为 VideoFrame(原始图像帧)

了解更多详情可阅读在浏览器中解析视频 (opens new window)

# 视频寻帧、遍历帧

因为视频文件体积通常比较大,不可能全部加载到内存中,所以一般是按需从磁盘读取数据然后解码。

比如为视频第 10 ~ 20s 的图像嵌入水印,过程如下:

  1. 寻找到 10s ~ 20s 的帧在文件中的位置
  2. 从磁盘读取对应的帧然后解码,得到原始图像
  3. 在图像上绘制文字,然后重新编码生成新的压缩帧

以上可知,寻帧、然后流式遍历帧是音视频处理的第一步。

前文提到视频文件的帧是成组的,组内的帧分了不同类型,所以寻帧、解码也需要按一定顺序处理。

frames-seq

图像帧序列(显示顺序),其中帧类型与解码顺序的关系,注意序号与帧类型

详情请阅读 I/P/B 帧、GOP、IDR 和 PTS, DTS 之间的关系 (opens new window)

# 图像处理

了解了上述的知识点,现在已经可以随意读取或遍历视频文件的所有图像帧了。

简单图像处理,如在原图像上绘制新的内容(文字、图片),或进行简单的滤镜处理,通过 Canvas API 即可实现。

复杂图像处理,如绿幕抠图、特效、自定义滤镜等,需配合 WebGL Shader 代码实现。

Canvas/WebGL

WebGL Shader 代码在 GPU 中运行,能高效并发处理每帧图像中的所有像素值。

# 空间、时间属性

空间属性指素材的坐标、大小、旋转角度

导出视频时,根据时间获取素材的的图像帧,动态设置当前时刻图像帧的空间属性,即可实现动画效果

比如,一个图片素材的平移动画(0s ~ 1s,坐标 x 10 ~ 100),那 0.5s 时素材图像帧坐标为 x = (100 - 10) * (0.5 / 1)

时间属性指素材在视频中出现的时间偏移、持续时间

用这两个属性可描述素材在视频时间轴上的位置;

当素材支持空间、时间属性后,不仅能通过程序动态设置其属性实现动画效果,还能用于实现让用户通过鼠标操作来控制(拖动、缩放、旋转等)素材。

# 总结

  1. 了解以上基础能力的原理,再加上些许耐心与时间就能实现视频剪辑的大多数功能了
  2. 以上的基础能力除了剪辑场景外,还能应用于端上的视频批量处理、直播推流、播放能力增强等场景
  3. 在 Web 平台处理音视频仍有许多细节,以及需配合大量的其他 API,继续探索可阅读系列文章 (opens new window)、使用我们开源的 WebAV SDK (opens new window)

# 附录

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

相关文章

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

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

WebCodecs 性能表现及优化思路

笔者开源 WebAV 已经一年半,还写了系列文章帮助初学者入门 Web 音视频。 之前一直隐隐担心在 Web 平台处理音视频与 Native APP 会有明显性能差距,因为 WebCodecs API 毕竟被浏览器代理了一层,且一些数据处理需要 js 配合,不确定有多大的性能损耗。 相信刚接触 WebCodecs 的读者也非常关心它的性能表现如何。 ...

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 ...

Web 音视频(三)在浏览器中创建视频

Web 音视频目录 音视频工作流程 在 WebCodecs 之前,由于编解码能力的缺失,几乎无法在纯浏览器中编辑、创建视频。 WebCodecs 补齐了编解码能力,相当于在浏览器中提供了视频创作能力。 预计 WebCodecs 将会像 HTML5 技术(Video、Audio、MSE...)一样 ...