WebRTC是为了解决实时音视频传输问题,致力于提供免安装、免插件、免专利费,人人可用的高效便捷的实时流媒体传输。
1. 3种实时流媒体实现比较
目前实时流媒体主流有三种实现方式:WebRTC、HLS、RTMP,当你看直播网站的时候会发现很多采用了HLS(HTTP Live Streaming,http直播),它是一种把流媒体拆分成多个独立小文件的技术,按照播放时间请求不同文件,把hls的文件进行解复用之后取出音视频数据然后丢给video去播放(Safari和安卓版的Chrome能直接播放hls)。它的优点是:使用了传统http协议,所以兼容性和稳定都非常好,服务端可以把hls文件上传到cdn,进而能够应对百万级别观众的直播,缺点是延时比较大,通常在10s以上,适合观众和主播没有什么交互的场景。因为一个hls文件时间长度通常在10s以上,再加上生成文件的时间就导致延迟很大。
它是苹果推出的一种标准,而另一种RTMP是Adobe推出的,使用长连接,是一套完整的流媒体传输协议,使用flv视频容器,原生浏览器不支持(flash插件支持),不过可以使用websocket + MSE的方式,相关的类库比较少,在Android/IOS客户端上的直播应该用得比较多一点。相对于HLS请求分片的形式,RTMP由于使用长连接,接收不间断的数据流,它的延迟要比HLS小很多,通常是1~3秒,所以如果观众和主播之间有通话或者视频交互,这种方式的延迟是可以接受的。
第3种WebRTC(Web Real Time Communication)是谷歌在2012年推出的,到现在已经有6年的发展。今年2018年3月份WebRTC 1.0正式定稿,并得到了Safari在内的所有主流浏览器的支持(Edge弄了一个ORTC),WebRTC致力于高效的实时音视频通信,做到比RTMP提供更低的延迟和更小的缓冲率。并且官方还提供了配套的native的Andorid/IOS的库,不过实际的实现可能是套一个webview,由webview启动webrtc,再把数据给native层渲染。
先介绍下WebRTC的组成。
2. WebRTC的组成
WebRTC由三大块组成,如下图所示:
(1)getUserMedia是负责获取用户本地的多媒体数据,如调起摄像头录像等。
(2)RTCPeerConnection是负责建立P2P连接以及传输多媒体数据。
(3)RTCDataChannel是提供的一个信令通道,在游戏里面信令是实现互动的重要元素。
3. getUserMedia
getUserMedia负责获取用户本地的多媒体数据,包括调起麦克风录音、摄像头捕获的视频和屏幕录制这三种,我已经在《