直播下的HTML5
概述:
从15年起,直播异军突起,目前 WEB 上主流的视频直播方案有 HLS 和 RTMP,移动 WEB 端目前以 HLS 为主(HLS存在延迟性问题,也可以借助 video.js 采用RTMP),PC端则以 RTMP 为主实时性较好。
HLS(HTTP Live Streaming) 是一个基于 HTTP 的视频流协议,本质还是一个个的 HTTP 请求 / 响应,所以适应性很好,不会受到防火墙影响。但它也有一个致命的弱点:延迟现象非常明显。如果每个 ts 按照 5 秒来切分,一个 m3u8 放 6 个 ts 索引,那么至少就会带来 30 秒的延迟。如果减少每个 ts 的长度,减少 m3u8 中的索引数,延时确实会减少,但会带来更频繁的缓冲,对服务端的请求压力也会成倍增加。所以只能根据实际情况找到一个折中的点。
RTMP(Real Time Messaging Protocol是 Macromedia 开发的一套视频直播协议,现在属于 Adobe。这套方案需要搭建专门的 RTMP 流媒体服务如 Adobe Media Server,并且在浏览器中只能使用 Flash 实现播放器。它的实时性非常好,延迟很小,但无法支持移动端 WEB 播放是它的硬伤。
对于HLS,总的来说:移动端iOS和 Android 都天然支持HLS协议,做好视频采集端、视频流推流服务之后,便可以直接在H5页面配置 video 标签播放直播视频。H5 HLS 限制必须是H264+AAC编码。H5 HLS 播放卡顿问题,server 端可以做好分片策略,将 ts 文件放在 CDN 上,前端可尽量做到 DNS 缓存等。H5 直播为了达到更好的实时互动,也可以采用RTMP协议,通过video.js 实现播放。
WebAssembly
WebAssembly是通过Web执行低级二进制语法。但是它并不是直接用汇编语言,而提供了转换机制(LLVM IR),把高级别的语言(C,C++和Rust)编译为WebAssembly,以便有机会在浏览器中运行。主要是解决目前JS语言的效率问题,设计立足点为快速,内存安全和开放。所以它其实是一种运行机制,一种新的字节码格式(.wasm),而不是新的语言。
相对于JavaScript,WebAssembly作为使用静态类型的二进制格式,有体积小以及运行速度快的优势。在业务需求越来越复杂的现在,前端的开发逻辑越来越复杂,相应的代码量随之变的越来越多。相应的,整个项目的起步的时间越来越长。在性能不好的电脑上,启动一个前端的项目甚至要花上十多秒。为了解决这个问题,WebAssembly的前身,asm.js诞生了。asm.js是一个Javascript的严格子集,asm.js是一个编译目标。
WebAssembly是经过编译器编译之后的代码,体积小、起步快。在语法上完全脱离JavaScript,同时具有沙盒化的执行环境。WebAssembly同样的强制静态类型,是C/C++/Rust的编译目标。
MPEG-DASH-流媒体解决方案
简单来说流媒体与非流媒体的区别就是,非流媒体必须下载完所有内容才能播放,流媒体则可以“边下边播”。但是流媒体也有很多痛点,比如卡顿频繁、切换体验不佳、首帧时间长、音画不同步、音视频不独立等等。
MPEG-DASH是一种自适应比特率串流技术,使高质量流媒体可以通过传统的HTTP网络服务器以互联网传递。和HLS类似,MPEG-DASH将内容分割成一系列很小的文件segment,这些segment可以通过http直接访问。每个segment包含一小段时间长度的内容。当MPEG-DASH客户端播放content时,客户端可以根据当前的网络情况,自动下载合适的下个segment。客户端可自动选择目前状况下,最适合播放的高码率segment来播放。MPEG-DASH播放器可以无缝适应不断变化的用户网络或缓冲区大小,并提供高质量的播放体验,减少卡顿率。