百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

纯 Web 视频剪辑

yuyutoo 2025-01-06 16:13 2 浏览 0 评论


前言


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

读者可阅读笔者的入门系列文章(https://hughfenghen.github.io/tag/WebAV/)获取更详细的信息,或使用 WebAV(https://github.com/bilibili/WebAV) 开源项目在浏览器中创建/编辑音视频文件。


背景 & 方案


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

现有 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 性能表现及优化思路可阅读这篇文章(https://hughfenghen.github.io/posts/2024/07/27/webcodecs-performance-benchmark/) 。

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


功能分析



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

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

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



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


基础能力实现


素材存储

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

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

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

详情请阅读 Web 文件系统(OPFS 及工具)介绍(https://hughfenghen.github.io/posts/2024/03/14/web-storage-and-opfs/)


素材解析

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



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

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

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



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

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

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



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

了解更多详情可阅读在浏览器中解析视频(https://hughfenghen.github.io/posts/2023/07/23/webav-2-parse-video/)


视频寻帧、遍历帧

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

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

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

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

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



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

详情请阅读 I/P/B 帧、GOP、IDR 和 PTS, DTS 之间的关系(https://www.cnblogs.com/yongdaimi/p/10676309.html


图像处理

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

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

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



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


空间、时间属性

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

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

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

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

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

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



总结


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


附录


  • Web 音视频入门系列文章
  • WebCodecs 性能表现及优化思路
  • WebAV : 在 Web 平台创建/编辑音视频文件的 SDK
  • 在浏览器中解析视频
  • 基于 WebCodecs 的网页端高性能视频截帧
  • Web 文件系统(OPFS 及工具)介绍
  • I 帧、P 帧、B 帧、GOP、IDR 和 PTS, DTS 之间的关系


-End-

作者丨风痕

相关推荐

Strip JS – 响应式的 Lightbox 效果

Strip是一个灯箱效果插件,显示的时候只会覆盖部分的页面,这使得侵扰程度较低,并留出了空间与页面上的大屏幕,同时给予小型移动设备上的经典灯箱体验。StrpJS基于jQuery库实现,支持所...

「Light Box」让瓦楞纸盒变身环保质感灯具

过度包装造成资源浪费是现今许多国家都面临到的问题,而在韩国就读工业设计科系的sungraeKim发表了名为「LightBox」的环保灯具作品,瓦楞纸包装盒本身就是产品,依说明书把切痕与折线拆开,再...

如何在EXCEL中进行IP地址排序

Excel中排序IP地址是非常不友好的,它完全是通过首位进行排序,无法实现我们的实际效果。作为IT人员对于IP地址的真正诉求是想要从小到大排列。那么如何进行排序呢?在Excel中,我们可以使用如下函数...

Excel揭秘!Left函数开启高效字符串左端截取模式

今日推荐:LEFT函数。目的:把一组身份证号码或者一组电话号码的敏感信息隐藏起来。...

五十一、UiPath字符串函数的介绍和使用(转)

一、字符串属性Length:是指字符串长度如:intlen=字符串变量.Length;Chars:是指字符串转换成字符数组,数组从0开始,通常配合Length属性使用如:System.Charc=...

打工人一定要会的Excel的15个技巧!

今天给各位打工人分享15个Excel常用的小技巧,废话不多说,直接开始!先给大家看一张快捷键速查表:1.Ctrl+C和Ctrl+V只是入门你可能已经很熟悉基本的复制粘贴,但如果你想让粘贴操作更高...

go语言中字符串常用的系统函数

最近由于工作比较忙,视频有段时间没有更新了,在这里跟大家说声抱歉了,我尽快抽些时间整理下视频今天就发一篇关于go语言的基础知识吧!我这我工作中用到的一些常用函数,汇总出来分享给大家,希望对...

最全的 ES 重点内容整理(上)

●我们从很多年前就知道ES6,也就是官方发布的ES2015●从2015年开始,官方觉得大家命名太乱了,所以决定以年份命名●但是大家还是习惯了叫做ES6,不过这不重要●重要的是...

2024 最火的5个顶级白板应用,燃爆了!

大家好,很高兴又见面了,我是"...

Excel Trim函数用法的6个实例,Excel 顽固空格的去除方法

在Excel中,Trim函数用于去文本的前后空格和字符之间的空格,但在去字符之间的空格时,它不会把所有空格都去除,而是留下一个空格;如果要把字符之间的所有空格都去掉,需要用Substitute函数...

TS类型体操,看懂你就能玩转TS了

本文以Typescript4.5及以上版本为基础,于2022年02月07日在掘金首发本文要实现一种类型工具...

一种接地气的编码规则:废弃驼峰式命名,告别手敲基础代码。

一种好的编码规则,能提高工作效率。在软件编程领域内,“驼峰”式命名规则是首选方式,最早来源于Perl语言编程的畅销书《programPerl》(oRelly出版)的封面图片正是一匹骆驼,故而得名。...

AI 应用开发最常用的解释型Python语言如何保护源代码

众所周知,解释型语言Python/JavaScript/Perl/Shell是在无需编译,可以直接运行,因此很难保护源代码,例如C、C++、JAVA属于编译型语言,运行之前需要先编译才能运行...

2020年树莓派的5种最佳编程语言

树莓派是最灵活的电脑之一。也许不是在硬件上,但是它的可操作性使它成为一个独立的类。树莓派跨越了电脑和编程之间的鸿沟,让每个人都能接触到电脑。因此,各个年龄段的编程爱好者都掀起了一股编程热潮。它允许他们...

5 种即将消亡的编程语言

每个编写代码的人都有自己喜欢的语言...

取消回复欢迎 发表评论: