对于NVR设备,需要配web端来管理,包括NVR常用配置和视频预览。视频的预览,以前可以通过插件的方式来实现,IE通过ActiveX控件,其它浏览器通过NPAPI插件。NPAPI插件被谷歌抛弃掉,说是因为安全的原因,其它浏览器也跟风谷歌,没有办法,谁让人家是老大呢?人家就和苹果一样霸道。
NPAPI被抛弃后,替代的是称作沙盒的PPAPI。PPAPI国内资料很少,它是由谷歌开发的,所以需要到谷歌官网去找资料,包括get start,demo等。但是,问题来了,需要翻墙访问谷歌,现在翻墙比以前困难很多,不好弄。
我们选择了webassembly方案。webassembly 是一个很强大的东西,它能把 C 语言编译成 JavaScript。我们把ffmpeg通过webassembly编译成JavaScript,用作h264,h265的视频解码,把ffmpeg大部分功能裁掉,只保留用到的音视频解码,这样编译快点和编译出来的JavaScript会小点。
通过JavaScript解码出来的数据是yuv格式的,可以通过WEBGL来进行渲染,经过测试,目前最新的Firefox,谷歌和edge浏览器都支持,渲染图像画面正常。
另外一个问题是网络传输,NVR出来的是实时音视频流,都是二进制格式的,怎么传输呢?通过http不好传,交互太多,每一帧视频都要请求一次。我们采用websocket来传媒体流,包括控制命令,这样类似于RTSP协议,解决媒体流的网络传输。
目前,在个人电脑上测试,8路子码流解码没有问题。这样,通过webassembly + webgl + websocket方案,实现了无插件播放h265视频流,还免去了插件的安装,更省事。