前端技术专场
今天周六无事,抱着学习的目的参加了之前报名的这场前端技术沙龙。
主题
- 多端多场景下的H5混合开发
- 基于
WebAssembly
的移动端网页媒体解码 - 无处不在Flutter:Flutter在多平台应用的探索
多端多场景下的H5混合开发
APP与H5是如何交互的?
Native调用H5
- H5根据约定将一组API绑定到webview的window对象上。
- Native通过webview获取window对象的方法,调用H5。
H5调用Native
- H5根据某种触发条件主动修改URL(比如iframe.src)。
- Native监控webview发出的URL请求,拦截URL,调用相应的原生操作
注:以上通过拦截 URL SCHEME的方式调用Native,实际上还可以通过注入API的方式调用Native,拦截 URL SCHEME更多是为了支持IOS6。
功能交互设计
- 相册、扫码、GPS
- 唤醒APP或者下载APP
- 唤醒原生页面
- 在新的webview中打开H5
- 分享[图文、图片、小程序]
多场景判断和统一收口
- 跳转地址方法
- 设备环境判断
- APP判断
- 内嵌环境判断
版本和手机兼容
- 全局在body元素上添加手机环境判断的className
- 比如安卓手机按钮不居中问题
- iPhoneX以及max底部按钮兼容
基于WebAssembly的移动端网页媒体解码
说实话我主要还是想了解下浏览器下WebAssembly接口的使用场景,以及未来发展方向。该主题主要内容如下:

详情:https://caniuse.com/#feat=rtcpeerconnection
Android | IOS | |
H.264 | 不支持 | 12.1.4及以后版本支持 |
VP8 | 支持 | 12.2及以后版本支持 |
WebAssembly是什么
WebAssembly或者wasm是一个可移植、体积小、加载快并且兼容Web的全新格式。



WebAssembly的优势
- WebAssembly 提供了一种符合 W3C 标准的技术,从而可以取代那些私有的、非标的、安全性差的插件,如 Flash 和 Silverlight。
- WebAssembly 使得有更多语言能够用于打造Web应用。
- WebAssembly 使得Web应用具备了原生应用性能的可能性。
WebAssembly有什么不足
- 运行速度快,但比不上原生
- 只适合计算任务重的场景
- 需要用户下载.wasm文件
推荐的WASM方案
- 桌面端主流浏览器继续使用原生WebRTC
- 移动端Webview使用WASM来解码H.264
- 利用WebGL和WebAudio完成最后的渲染
开发流程 – 项目结构
- 传输层(WebSocket/DataChannel/WebTransport)
- 解码层(使用WASM编译C的264解码库)
- 渲染层(WebGL+WebAudio)
开发流程 – 编译H.264的解码器
- Emscripten:一个C/C++到WASM的编译工具链
- Broadway:一个基于H.264BSD的WASM解码器
- FFmpeg:目前最好的264软解
开发流程-编译RTS的Decoder代码
使用emcc编译对接JS层API的decoder代码到bitcode,最后再使用emcc将这些bitcode链接并输出到wasm.
开发流程-解码流程

开发流程-WebGL渲染器
- 核心就是一个渲染YUV贴图的Fragment Shader
- 避免使用2DCanvas(yuv -> rgb开销)
- 需要处理crop/rotate等情况
开发流程-WebAudio播放
- 不需要使用ScriptProcessNode
- 需要实现AudioBufferNode的调度播放
- 推荐的Buffer大小是20ms左右
- 可以利用强大的WebAudio实现后处理
性能及兼容性表现
虽然大部分浏览器支持WASM,但是为了更广泛的兼容性,我们需要一个fallback的方案。
asm.js – 一个WASM的替代方案
- 编译流程和WASM基本一致,只是输出的是JS文件而不是二进制的WASM文件
- 内部通过一个大Uint8Array来模拟内存
- 通过JS实现对这个Uint8Array的汇编指令
- 大小通常是WASM文件的4~5倍
常见问题
- 秒开策略(预加载/解码器反馈/IDR缓存)
- 抗弱网(带宽估计)
- WASM/ASM缓存(indexDB/浏览器缓存)
- 音视频同步
- 解码器压力检测
展望未来-接下来做什么
- 支持VP8/AAC解码
- 利用WebGL可以实现美颜的后处理
- 利用WebAudio可以实现声音的后处理
- 使用DataChannel替代WebSocket,通过UDP传输音视频包
- 利用WASM将WebRTC的带宽估计/接收端反馈等罗技应用到项目中
- …
其他案例
WebAssembly案例,是我在网络查找相关资料时看到的,罗列此处,拓展WebAssembly应用场景思维。
- Google Earth — 支持各大浏览器的 3D 地图,而且运行流畅(貌似百度地球也在使用了?)
- Egret Engine — 最受欢迎的 HTML 5 游戏引擎,让游戏引擎快三倍
- Web-DSP — 使用浏览器就能即时制作多媒体影音特效
- Walt — 用 JavaScript 语法也能快速开发原生的极速应用
无处不在Flutter:Flutter在多平台应用的探索
注:该主题因之前没做太多功课,并且兴趣不大,故没有太多详细记录,仅梳理几个问题备忘。
问题
- Flutter和React Native的区别?
- Flutter和Electron的区别?
留以后思考~~
这篇文章目前没有评论