如何实现低延时直播——支持多终端H5播放的超低延时直播解决方案纪要

        笔者在互联网公司从事视频通信工作多年,从MPEG-1、MPEG-2到MPEG-4,再到今天的H264/AVC、H265/HEVC流行时代,研发了几代产品,虽然在每个阶段一直能满足用户的需求,但随着宽带的普及,4G、5G的飞速发展,视频通信行业的需求从以前追求视频清晰度的提高到现在转变为追求视频传输的实时性的需求了,尤其是云游戏行业,更是要求视频实时性在端到端延时低于200ms(毫秒),因此研发视频通信系统就越发艰巨了。笔者在这里就研发低延时视频通信系统所走的曲折弯路做一下记录。

      十几年以前研发视频通信系统实现低延时相当容易,原因就是视频编码端、视频服务器与视频播放客户端都是自己实现的,视频传输协议也是自己实现的,因此实现一个低延时的视频会议直播系统是非常容易的,但现在不同了,终端用户不愿意安装客户端,只愿意安装浏览器,因此如果不是专用系统,要实现低延时比较难。

笔者为了实现低延时视频通信经历了如下阶段,其中某些阶段的研发成果用户现在还在使用当中,每个阶段有每个阶段的解决办法,现记录如下。

一、ActiveX控件阶段

          实现一个浏览器端的ActiveX控件来播放视频,可以自己实现传输协议,在视频传输时采用自定义的UDP协议来传输,对网络抖动与丢包都能非常好的控制,甚至于传输带B帧的H264 High Profile 视频也能控制在7-8个帧延时之内。采用自定义协议可以避免阅读国际标准文档而浪费时间,自己想怎么实现都非常方便。只可惜随着IE的消失,Chrome与FireFox等主流浏览器对Plugin的限制,现在这种方式不好使了。

二、Flash 插件阶段

          曾几何时,Flash插件作为浏览器的标配,装机率99%以上,即便是采用了Flash插件,仍旧被号称“不要装插件就能实现播放”。笔者在这个阶段采用Flash技术进行了开发,由于Flash插件仅支持Http协议与RTMP协议,做到低延时比较难,即便是将H264的B帧去除,仍旧有1秒左右的延时,由于Flash的播放器核心曾笔者无法控制,它总是要缓冲一部分数据的,因此带来延时。笔者在撰写本文时Flash已经死亡,所以不再讨论它了。

三、MSE(Media Source Extension) 阶段

     H5成熟以后,浏览器厂商一直想取代Adobe的Flash,从2015年左右,浏览器就开始开发能对VIDEO标签提供自定义数据的能力了,称作媒体源扩展,即开发者可以自己将媒体数据打包成约定的格式(FMP4)喂给浏览器,当时笔者心想,MSE技术应该是解决低延时的一根救命稻草,于是笔者进行了潜心研究,但最后的结局也不理想。采用MSE实现的端到端的延时也在1秒以上,原因就是采用MSE,除了数据能自行控制,但解码与播放都不能自行控制,只能调用浏览器自己的代码,即便是将FMP4的片段缩小为1帧1片段,也无济于事,因为控制权在浏览器厂家。MSE技术对移动端支持得不是很理想,即便是现在,iOS系统的浏览器还是不能支持MSE技术。

四、WebAssembly/wasm WebAssembly(WASM)阶段

    WebAssembly技术是最近两年冒出的技术,能够将C/C++等语言编译成javascript的二进制伪机器码(笔者这么称呼的),笔者以为用WASM技术能够完美解决低延时直播。采用WASM技术实现低延时直播技术的实现关键技术如下:

1、采用Emscripten将FFMPEG的H264的C语言实现部分汇编成ffmpeg.wasm汇编代码

2、浏览器端JS调用ffmpeg.wasm进行H264视频解码

3、浏览器端JS用WebGL在CANVAS上面画图,实现视频图像的显示。

采用WASM技术,视频直播的整个环节从传输、解码到播放都能自己控制,基本能够实现极低的延时,如果不考虑网络带宽的情况下,端到端的延时在200毫秒左右。如果用过大华的网络摄像机,就可以看到WASM的效果,大华的网络摄像机的视频监视部分就是用WASM实现的,延时极低。

采用Web汇编,要实现如下部分技术:

1、服务器端帧排序处理

     服务器端对视频帧进行缓存排序,尤其是对关键帧的缓存。

2、服务器端帧丢弃算法

   由于网络也许并不顺畅, 服务器端针对客户端传输时可能会发生缓存的帧数据无法发送出去,服务器端发现下一个关键帧到来了,就得主动丢弃当前的缓存队列里的帧。为了能够让已经发送出去的帧能够正常解码播放,缓存的当前的GOP队列里的B帧仍旧需要发送出去。

3、播放器端的丢帧

    播放器端如果解码速度不够(毕竟是软解码),就会缓存很多帧,如果收到下一个关键帧,播放器端应该将已经缓存当中的当前GOP的帧丢弃。

但是经过广泛的用户体验,发现WASM技术性能是瓶颈,在PC机上能够正常播放720P 30FPS的视频甚至于1080P 30FPS的视频,但在移动端,720P的视频几乎不能播放,960x540以下的25FPS的视频在目前的移动端手机上能够正常播放 ,但占的CPU资源仍旧过高。
采用 WASM技术的兼容性还是比较好的,不支持MSE的iOS平台也能够支持。

如果浏览器厂商将视频解码接口暴露出来,能够让开发者自行调用浏览器里的视频解码方法,则解码性能能够得到巨大的提高,实现低延时播放就更容易了。

五、采用WEBRTC技术

Webrtc技术现在已经成熟,由于Webrtc是基于WEB的实时通信技术,本身就要求达到低延时的目标,因此采用Webrtc技术就是当前的最佳选择,笔者通过Webrtc技术实现了当前可用的低延时直播技术,主要技术如下:

1、专用网络端到端延时在200ms以内

2、互联网上端到端延时低于500ms

3、支持1080P,2K,4K视频实时解码,完美解决网络云游戏领域的要求

     由于WEBRTC采用浏览器自己的解码器来解码,可能会采用硬件解码,因此播放高码流 、高帧率,高分辨率的视频非常理想。

     备注:针对网络云游戏的低延时要求,编码端业的采用NVENC等硬件编码技术,如果仅采用CPU做软件编码,如果1080P的视频,即使是采用RTC来传输,延时也比较大。

4、支持4K的VR视频实时直播,延时在300ms之内

5、尤其适合在实时监控应用

笔者以为,WEBRTC技术将成为低延时直播的主流技术,甚至会成为低延时直播的唯一技术。

 

 

 

 

你可能感兴趣的:(流媒体应用,视频直播技术,VR直播技术,低延时直播,H5低延时直播,云游戏低延时直播,低延时实时监控,200毫秒低延时直播)