# 纯 Web 视频剪辑

ZingAI.video 字影 (opens new window)是采用纯 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)

# 附录

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

相关文章

ZingAI.video 在线口播视频剪辑

ZingAI.video 字影是采用前沿 Web 技术构建的口播视频剪辑工具,欢迎体验 背景 我发现自己消费的视频基本都是口播类视频,且 AI 生成的视频绝大多数也是这类视频。 口播类视频并不是指狭义的主播(或数字人)念稿子,它的典型特征是传达的信息以文字语音为主,图像信息为辅的视频; ...

视频编辑,如何选择技术方案

以下是视频文字稿,观看视频请移步 B 站、抖音 开场 大家好! 我是风痕, 开源项目 WebAV(音视频编辑 SDK )的作者, 在我的博客有许多 Web 音视频入门的技术文章。 随着 AI 视频技 ...

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

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

WebCodecs 性能表现及优化思路

ZingAI.video 字影是采用 WebCodecs 构建的视频剪辑工具,可在这里体验视频导出的性能 笔者开源 WebAV 已经一年半,还写了系列文章帮助初学者入门 Web 音视频。 之前一直隐隐担心在 Web 平台处理音视频与 Native APP 会有明显性能差距,因 ...

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