webassembly在哔哩哔哩创作中心的实践

如果无法正常显示,请先停止浏览器的去广告插件。
分享至:
1. WebAssembly 在bilibili创作中心的实践 高裕轩 bilibili主站技术中心 资深开发工程师
2. 关于我 高裕轩(清古) FE @ bilibili Ryan Gao WebAssembly / 多媒体
3. 1. 优化投稿场景时面临的挑战 目录 2. WebAssembly技术的引入 3. WebAssembly方案的实践 4. 总结
4. 01 优化投稿场景时 面临的挑战
5. 成为UP主的一小步 · 进入bilibili创作中心投稿页
6. 成为UP主的一小步 · 选择本地文件 等待上传完成 · 填写稿件信息 编辑选项 · 提交
7. 投稿场景值得优化的环节 · 视频信息的预检查需要等到上传完成后在云端进行 · 预检查 · 拦截无法解码的文件 · 拦截视频轨道缺失的文件 · 部分场景下视频分辨率检查 · 用户无法得到及时的反馈 · 云端资源的浪费
8. 投稿场景值得优化的环节 · 视频推荐封面需要等到上传完成后才能获得 · 视频推荐封面 · 从视频内容中截取 · 经过AI打分决定展示顺序 · 展示时机滞后 · 推荐封面的曝光率不高
9. 如果可以在浏览器中处理 · 在文件上传前进行预检查 · 用户可以得到及时的反馈 · 节省云端资源 · 在本地截取视频内容并计算推荐封面 · 提前推荐封面展示时机 · 减轻云端的计算压力
10. 面临的挑战 · 页面需要有分析与处理多媒体文件的能力 · 可以获取视频的元信息 · 可以解码文件 获取视频的关键帧 · 需要支持各种封装格式和编码
11. 解决的方案 · 多媒体文件的分析与处理 —— C/C++ · 通用的多媒体处理框架 —— FFMpeg · 各类封装格式及编解码器的工具库
12. 解决的方案 · 多媒体文件的分析与处理 —— C/C++ · 通用的多媒体处理框架 —— FFMpeg · 各类封装格式及编解码器的工具库 · 在浏览器中运行? · 使用JS重新实现 —— 实现成本高 效率难保证
13. 解决的方案 · 多媒体文件的分析与处理 —— C/C++ · 通用的多媒体处理框架 —— FFMpeg · 各类封装格式及编解码器的工具库 · 在浏览器中运行? · 使用JS重新实现 —— 实现成本高 效率难保证 · 将C语言的工具库编译到Web中运行 —— WebAssembly
14. 02 引入 WebAssembly
15. WebAssembly是什么 · 一种二进制格式 以 .wasm 为后缀 · 一个虚拟机指令集标准 · 为其他编程语言提供一个可移植的编译目标 · 支持在Web浏览器环境及非Web环境中运行
16. WebAssembly的特点 · 高效 · 紧凑的二进制格式 体积小 加载快 · 可以用接近原生的性能运行 · 安全 · WebAssembly会运行在一个安全的沙箱执行环境 · WebAssembly会遵循浏览器的安全策略
17. WebAssembly的 兼容性 · 2017 Oct. · 主流桌面浏览器全部支持
18. 如何使用 WebAssembly · 编译出WebAssembly文件 · 选择初始语言
19. 如何使用 WebAssembly · 编译出WebAssembly文件 · 选择初始语言 · 搭配编译工具 · emscripten · LLVM · asm.js / wasm
20. 如何使用 WebAssembly · 编译出WebAssembly文件 · 编写代码 · 编译wasm文件
21. 如何使用 WebAssembly · 运行WebAssembly文件 · 获取wasm文件 · 编译并实例化WebAssembly 模块
22. 03 WebAssembly 方案的实践
23. 面临的挑战 · 页面需要有分析与处理多媒体文件的能力 · 需要支持各种封装格式和编码 解决的方案 · 使用C工具库编写多媒体文件的分析与处理逻辑 · 将C代码编译成WebAssembly在浏览器中运行
24. 使用C处理多媒体文件
25. 使用C处理多媒体文件 · FFMpeg的核心模块 · libavformat · libavcodec · libavfilter · ……
26. 使用C处理多媒体文件 · 获取多媒体文件的元信息 · AVFormatContext · AVStream
27. 使用C处理多媒体文件 · 获取多媒体文件的元信息 · 以JSON字符串形式输出 · 经胶水代码解析后供外部使用
28. 编译WebAssembly · 编译 FFMpeg 等工具库 · 生成静态库文件 libXXX.a
29. 编译WebAssembly · 编译 FFMpeg 等工具库 · 生成静态库文件 libXXX.a · 控制wasm文件体积 · 调整C项目编译配置 · 去除不需要的工具库及依赖 · 只使用部分decoder
30. 编译WebAssembly · 编译 FFMpeg 等工具库 · 生成静态库文件 libXXX.a · 控制wasm文件体积 · 编译入口 C文件 及 js文件 · 生成wasm文件 + 胶水js文件
31. emscripten生成的 胶水代码 · 获取并实例化wasm模块 · 提供部分运行环境 · 文件系统 · Web Audio · canvas操作 · …… · 封装js与wasm间的类型转换 · 封装wasm模块暴露的函数
32. 在Web Worker中使用 WebAssembly · 避免wasm模块的计算阻塞主线程
33. 在Web Worker中使用 WebAssembly · 避免wasm模块的计算阻塞主线程 · 为wasm模块提供处理大文件的能力 · WorkerFS(FileReaderSync)
34. 在Web Worker中使用 WebAssembly · 避免wasm模块的计算阻塞主线程 · 为wasm模块提供处理大文件的能力 · 多个worker协作加速计算 · 线程池 · 并行计算 · SharedArrayBuffer
35. WebAssembly的性能 · 获取多媒体文件的元信息 · 随机批量处理500个文件 · 单文件平均耗时~40ms
36. WebAssembly的性能 · 生成推荐封面 · 不同分辨率视频生成30张封面 · 480p ~293ms · 720p ~431ms · 1080p ~1140ms
37. WASM vs Javascript · 图像处理场景 使用二维卷积算法为图片添加浮雕效果 · 测试数据 处理前 使用相同卷积核 在不同尺寸的图片下进行测试 比较 js 与 wasm 的计算耗时 720P 1280 × 720 1080P 1920 × 1080 2K 2560 × 1440 4K 3840 × 2160 处理后
38. WASM vs Javascript · JS 与 WASM 计算耗时对比 (单位: ms) 图像处理场景 使用二维卷积算法为图片添加浮雕效果 · 测试数据 使用相同卷积核 在不同尺寸的图片下进行测试 比较 js 与 wasm 的计算耗时 720P 1280 × 720 1080P 1920 × 1080 2K 2560 × 1440 4K 3840 × 2160 测试环境: Apple M1 Chrome 94
39. 04 总结
40. 实践总结 · 使用WebAssembly移植其他语言生态的代码 给Web平台 提供了无限的可能 · WebAssembly的高效特性更适用于复杂计算场景 · 搭配Web Worker使用 可以更好发挥WebAssembly的特性
41. 感谢倾听 大会官网

首页 - Wiki
Copyright © 2011-2024 iteam. Current version is 2.139.0. UTC+08:00, 2024-12-25 22:03
浙ICP备14020137号-1 $访客地图$