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

Home - Wiki
Copyright © 2011-2024 iteam. Current version is 2.137.1. UTC+08:00, 2024-11-16 12:00
浙ICP备14020137号-1 $Map of visitor$