Web端短视频编辑器的设计与实现 - 像做PPT一样做视频
如果无法正常显示,请先停止浏览器的去广告插件。
1. 第 十 六 届 D 2 前 端 技 术论 坛
Web端短视频编辑器的设计与实现
CCO 产品技术部-阿里小蜜团队-李志成(敦固)
2. 背景
编辑器设计
编辑器实现
目录
音视频处理
渲染出片
浏览器实现的问题与挑战
End
3. 一切能够视频化的内容
都将会 视频化
4. 背景
我们为什么要做一个 Web 端短视频编辑器?
满意度
图文知识1
图文知识2
解决率
转人工率
冗长乏味
找不到重点
对老年人不友好
适老化
信息密度高
易接收
5. 制作成本高
制作效率低
专业难上手
6. 制作成本高
制作效率低
专业难上手
如何能更简单些?
7. 如何让短视频制作更简单?
像 PPT 样做视频
迁移 PPT 的使用经验 快速上手
丰富模板可定制 应对不同场景
智能脚本辅助创作
8. 简单 & 专业
音视频剪辑能力
Web 端渲染
纯前端实现
时间轴
音视频剪辑
字幕编排
动画贴纸
转场、滤镜、特效
TTS 配音
ASR 语音识别
...
9. 编辑器
音视频处理
补间动画
时间轴
HOW
?
贴纸动画
滤镜
转场
端渲染
特效
10. 编辑器的设计
总体架构
模板库
应用层
素材库
分镜管理
智能脚本
TTS 大纲 关键帧动画
时间轴 编辑器 视频录制
视频 音频
图片 lottie 动画
gif/apng 动画 字体
滤镜 特效
命令管理
剧本模型
引擎层
解析
加载
舞台
导演引擎
资源管理器
缓存
剧本解析
时钟
编排
React
依赖层
lottie
immer tweenjs
Konva gifuctjs
dexie.js
视图、状态管理
服务
渲染器
元素绘制 特效处理
图层管理 动画
录制
音频流合成
TTS
转码
ASR
webm2mp4
gl-transition ffmpeg.wasm mp4boxjs
WebGL WebCodecs API AudioContext
动画、特效
Canvas
WebWorker
音视频处理
11. 编辑器的设计
编辑器之上
视频、音频、
图片、文字
动画、Lottie、
特效
上传、选取 拖拽、配置、编辑、播放 渲染
素材 编辑器 视频
资源描述 剧本模型 剧本协议
编辑器之下
资源加载、解析、缓存
模型编辑
模型导演
渲染
12. 编辑器的设计
剧本协议的设计
Script
Scenes
BaseSegment
tracks
segments
Anim id
Video playStartTime
Audio playEndTime
Img zIndex
Text effects
... ...
... track
... scens
type
13. 编辑器的设计
以撤销重做功能为例谈变与不变的取舍
Mutable
变
命令式
V
S
不变
Immutable
快照式
只关注数据变化
不关心具体操作
视角 只关注操作序列
不关注数据变化 实现 手动编码所有操作的正逆向操作
撤销即执行逆操作 保留每次操作前后的数据快照
撤销即数据回滚
问题 新增一种操作就要新编码 快照存太多了内存会爆炸
Immutable
Immer
14. 编辑器的实现
编辑器工作流程
webm/mp4
VideoLoader
...Loader
ImgLoader
渲染器
编辑器
AudioStream
资源加载、解析、缓存
Audio PCM Data
资源管理器
AudioContext
Asset
VideoStream
Stage Canvas
剧本模型
舞台
ScriptData
Konva
Canvas
Segment
导演引擎
资
源
预
加
载
15. 编辑器的实现
编辑器工作流程
webm/mp4
VideoLoader
...Loader
ImgLoader
渲染器
编辑器
AudioStream
资源加载、解析、缓存
Audio PCM Data
资源管理器
AudioContext
Asset
VideoStream
Stage Canvas
剧本模型
舞台
ScriptData
Konva
Canvas
Segment
导演引擎
资
源
预
加
载
16. 编辑器的实现
导演引擎
循环检查 Segment 的时间
导演引擎
Segments 队列 内部时钟
元素入场 元素离场
读取剧本
舞台
问题
高精度的时钟
资源预加载
资源管理器
17. 编辑器的实现
导演引擎
循环检查 Segment 的时间
导演引擎
资源预加载
Segments 队列 内部时钟
元素入场 元素离场
读取剧本
舞台
问题
高精度的时钟
Web Audio API
AudioScheduledSource
Node
资源管理器
18. 编辑器的实现
音视频的处理与渲染
VideoFrame
Video
Demuxer
Chunk
1
mp4/avi/webm ..
.
解封装
Decoder
2
Render to
OffscrenCanvas
Convert to
texture
av sync
AudioData
3
Play with
AudioContext
解码音视频码流 渲染与音视频同步
把容器里压缩过的
音视频流拆出来 从压缩的编码中获得视频的像
素数据和音频 PCM 数据 将像素数据转为WebGL 纹理绘制到 Canvas
AAC/MP3/AC-3/... PCM H.264/H.265/MPEG2/... YUV/RGB
将音频原始采样数据 PCM 发送给
WebContext.AudioWorklet 播放
根据音频的播放时间来挑选视视频帧并绘制,
保证音画同步
19. 编辑器的实现
音视频的处理与渲染
VideoFrame
Video
Demuxer
Chunk
Decoder
1
2
Render to
OffscrenCanvas
Convert to
texture
av sync
AudioData
3
1. 根据实际需求对 FFmpeg 进行裁剪定制
通常的方案
FFmpeg
WebAssembly
2. 编译 FFmpeg 到 WebAssembly
3. 浏览器加载调用
Play with
AudioContext
20. 编辑器的实现
音视频的处理与渲染
VideoFrame
Video
Demuxer
1
Chunk
Decoder
2
Render to
OffscrenCanvas
Convert to
texture
av sync
AudioData
3
Play with
AudioContext
为什么我们要打入一个浏览
器内本身就存在的东西?
都快 2022 年了浏览器还没把
能力开放出来给人用吗?
21. 编辑器的实现
音视频的处理与渲染
VideoFrame
Video
Demuxer
1
Chunk
Decoder
2
Render to
OffscrenCanvas
Convert to
texture
av sync
AudioData
3
Play with
AudioContext
有!
但是很新!
不过没关系!
22. 编辑器的实现
音视频的处理与渲染
WebCodecs API
VideoDecoder
AudioDecoder
MP4Box.js
Demuxer
Video
1
Chunk
VideoFrame
Decoder
2
Render to
OffscrenCanvas
Convert to
texture
av sync
AudioData
3
Play with
AudioContext
WebCodecs API
问题
WebCodecs 没有提供相应的解封装 API
意味着我们需要借住
MP4Box.js/mux.js/ffmpeg 之类的工具拿
到原始编码数据
优势
WebCodecs 还给了更多
AudioDecoder AudioEncoder
VideoDecoder VideoEncoder
ImageDecoder
23. 编辑器的实现
编辑器工作流程
webm/mp4
VideoLoader
...Loader
ImgLoader
渲染器
编辑器
AudioStream
资源加载、解析、缓存
Audio PCM Data
资源管理器
AudioContext
Asset
VideoStream
Stage Canvas
剧本模型
舞台
ScriptData
Konva
Canvas
Segment
导演引擎
资
源
预
加
载
24. 编辑器的实现
渲染出片
TTS
mp3
AudioSource
Node
渲染器
编辑器
AudioStream
Canvas.
captureStream(30)
video/...
AudioSource
Node
AudioContext.
CreateMediaStreamDetination()
VideoStream
AudioStream
AudioContext
new MediaRecorder()
VideoStream
Stage Canvas
Dom Event Proxy
webm
剧本模型
...
webmToMp4
mp4
25. 编辑器的实现
渲染出片
TTS
mp3
AudioSource
Node
AudioSource
Node
渲染器
编辑器
AudioStream
AudioContext
Canvas.
captureStream(30)
Stage Canvas
...
AudioContext.
CreateMediaStreamDetination()
VideoStream
AudioStream
WebCodecs API
VideoEncoder
VideoStream
video/...
AudioEncoder
Dom Event Proxy
Muxer
剧本模型
mp4/webm
26. 浏览器实现的问题与挑战
真的有听上去那么美好吗?
C/C++
lottie
音视频等内容处理
tweenjs
gifuctjs
gl-transition ffmpeg.wasm mp4boxjs
WebGL WebCodecs API AudioContext
WebWorker AudioWorklet
offscreenCanvas
动画、特效
文件处理
Rust
go/...
遇事不决
音视频处理
尽管使用 dexie.js 通过 indexDB 存储
但视频文件和素材通常很大,所以我们的方案
目前仅适用于短视频的创作(60s 左右)
长视频的渲染 MediaRecorder 的方式出片需要和视频一样
时长的等待
更多格式的支持 mp4\webm\avi ...
我们需要找很多 demuxer, muxer 库
直接访问文件系统的 API
异步处理端侧渲染
再多给点
File System Access API
FFmpeg 录制浏览器
拆分渲染再合并
27. 不要止步于浏览器
不要止步于JS
28. Thanks