一、背景

现在到处是摄像头的时代,随着带宽的不断提速和智能手机的普及催生出火热的网络直播行业,新冠病毒的大流行又使网络视频会议系统成为商务会议的必然选择,因此RTSP实时视频流播放及处理不再局限于安防行业。在如道路、工厂、楼宇、学校、港口、农场、景区等场景实施的信息化系统中,已基本全采用B/S架构,迫切需要在浏览器中嵌入多路摄像头RTSP流的超低延迟(小于500毫秒)播放功能,而在IE及Chrome 49以下版本等浏览器中,采用ActiveX控件或NPAPI插件即可实现。然而美好总是短暂的,从2015年开始Chrome及Firefox等浏览器纷纷取消了NPAPI插件的支持,而IE又在与Chrome及Firefox等浏览器竞争的过程中不断被用户抛弃,到现在市场份额已降到可怜的个位数。微软在几经折腾后,索性也拥抱Chromium内核推出Edge新版来杀死自己的IE,以挽救自己在浏览器这块岌岌可危的江湖地位。

在Chrome、Edge、Firefox等当前主流的高版本浏览器中,即使是HTML5标准的Video也并未对RTSP流播放提供原生支持,从而导致如何在当前主流的浏览器中实现低延迟、低成本并可同时播放多路RTSP成为了一个重大技术难题。这几年国内外的技术专家经过不断研究总结,形成一些闭源或开源、收费或免费的方案,但多数时候无法完全满足客户的实际需求。

二、现有方案

在浏览器中实现播放RTSP实时视频流,大体上有如下几个方案:

  • 浏览器插件方案

此方案主要适用于在IE及Chrome 49以下版本的浏览器,在2015年前是绝对主流的选择。使用ActiveX播放控件或NPAPI播放插件实际调用的是本地原生程序进行直接播放,从而可充分利用本机的硬件加速能力,可实现满意的多路低成本、低延迟播放效果。一般使用VLC这个免费开源的跨平台多媒体播放器,IE、Chrome、Firefox等浏览器分别有对应的播放插件,对移动端支持也非常好。此方案非常灵活,可以方便的对接各品牌的视频流,也可以很容易实现截图和录像功能。缺点是需要额外安装VLC软件,对个别明确规定不能用插件的场景不太适用。摄像头厂家一般也会提供适配的播放插件,比如海康威视提供的播放控件,是和自己的DSS系统捆绑使用的。

  • 先转码再转流方案

此方案需要架设一个或多个视频流转码服务器,先在服务器上对RTSP流用ffmpeg进行转码串流成RTMP,然后前端使用VideoJS再调用Adobe Flash Player进行播放,然而2020年底开始基于Chromium内核的所有浏览器就彻底取消对Adobe Flash Player的支持,VideoJS失效。不过幸好还有开源的替代播放方案flv.js(https://github.com/bilibili/flv.js)工作原理是要求在服务端先把RTSP视频流转换为flv后用Web Socket或WebRTC推送到前端,前端收到后再转换为Video所支持的MP4后播放,这就导致RTSP视频流,需要经过2次转码才播放,画面延迟时间大幅度增加,保守估计延迟至少也是2-3秒级别了。况且如果有多路视频流时,服务器端转码和转流对CPU、内存、网络带宽的压力大幅度增加,长期使用成本很高。此方案要求浏览器支持流媒体扩展特性(MSE),且无法利用本机硬件加速实现解码和渲染。优点是可兼容移动端网页播放。

此方案在国内有TSINGSEE的免插件EasyPlayer RTSP播放器,项目地址是https://github.com/tsingsee/EasyPlayer和linkingvision的免插件播放器H5stream,项目地址是https://github.com/linkingvision/h5stream等。

  • 先转流再转码方案

此方案的典型代表是Streamedian公司的免插件播放器Html5 RTSP Player,项目地址https://github.com/Streamedian/html5_rtsp_player。此方案需要架设一个Web Socket的视频流转发服务器,前端连接到此服务器后,服务端不断把RTSP视频流通过Web Socket不断转发给前端的JS处理库,JS处理库再把视频流转换为Video所支持的MP4后播放。此方案不支持IE浏览器,最大的问题是画面延迟达数秒,首屏内容显示慢,而且无法利用本机硬件加速实现解码和渲染,CPU占用高,播放时有卡顿现象,体验比较差。另外无法实现本地自动截图、录像等操作。此方案同样要求浏览器支持流媒体扩展特性(MSE),对延迟不敏感的单源播放尚可,多路播放就只能洗洗睡了,另外根据一些用户的反馈,对各品牌摄像头的兼容性也不太友好,作为商业用途使用是不可行的。

  • 扩展程序方案

此方案典型代表是基于Chrome浏览器的Native Client(NaCl)和Portable Native Client(PNaCl)技术实现开源播放器VXG RTSP Player,项目地址是https://git.code.sf.net/p/rtsp-player-chrome/code rtsp-player-chrome-code。此方案很显然不适用于IE和Firefox等浏览器,也不适用于49版以前的Chrome 浏览器。VXG RTSP Player是Chrome浏览器的扩展程序,对国内客户来说,由于谷歌服务器在墙外,想要大规模自主可控部署是不现实的。另外最关键的是谷歌已官方宣布,2021年6月终止对NaCl,PNaCl和PPAPI API的支持,因而此方案也无继续探讨的必要。

  • 双内核方案

此方案典型实现是采用Chrome浏览器上的扩展程序IETab来实现,官方网站是https://www.ietab.net,通过在Chrome标签页界面覆盖加载显示一个IE内核渲染的网页,此网页再调用比如VLC的开源ActiveX多媒体播放控件实现。此方案和方案4一样,存在大规模自主可控部署难问题。另外和上面的浏览器插件方案类似,需要在播放终端电脑中下载运行IEHelpTab.exe客户端程序,对一些高安全要求无插件播放的场景来说不适用。最大的问题是在Chrome网页中对播放控件的控制很难实现,只有网页和播放控件都是在IE内核环境下才可以,而IE对当前一些新技术和前端主流框架的兼容已经不行了,况且IE对运行和下载安装ActiveX控件经常弹出警告,用户体验很差。

  • Wasm方案

此方案采用的是高版本浏览器所支持的一种方便把更复杂的原生应用直接搬进 Web 的标准技术,然而对浏览器的兼容存在很大问题,IE肯定是不支持的,低版本的Chrome及Firefox等浏览器也不支持Wasm,具体兼容性可看这里https://caniuse.com/wasm。实现的基本思路就是把RTSP视频流通过ffmpeg的Wasm版软解码成Video所支持的MP4后播放,由于Wasm不支持硬件解码,对多路同时播放来说,CPU和内存占用会比较高,性能有很大瓶颈。此方案有时应用在需要支持H265编码的场景,同样要求浏览器支持流媒体扩展特性(MSE)。由于存在诸多兼容性问题,此方案实际应用的案例较少。

三、改进方案

通过上述总结的现有技术方案可以看出,想要在浏览器中实现低延迟、低成本的多路RTSP同时播放,只有做到不转码直接播放和充分利用终端的硬件加速这两个核心要求才能办到,这就只能采用插件方案。核心就在于如何在浏览器中实现一个统一的不依赖浏览器本身扩展技术的插件系统,同时必须让改进方案对各品牌及各版本浏览器有比较好的兼容能力才具有较大的实用价值。所以改进方案基本思路就是要在浏览器网页中指定位置和大小,实现一个内嵌到网页中显示的播放窗口,这个内嵌播放窗口前端还必须可对其进行控制,而且播放窗口必须跟随浏览器窗口的移动和缩放、网页滚动、标签页切换、关闭等操作进行自动联动。这就要求播放窗口必须是本地程序,最好用高性能的C++语言来实现,这样还可充分利用终端的硬件加速能力。这个播放窗口同时提供Web Socket的服务端和JSON打包的命令解析执行模块,前端就可以通过Web Socket连接后发送JSON打包的控制命令实现控制播放窗口。

目前本公司经过攻城狮的艰苦技术攻关,成功研发出采用此思路实现的VLC网页播放小程序软件并成功在一些客户现场实施,此小程序基于PluginOK中间件(https://github.com/wangzuohuai/WebRunLocal),提供了一个统一的不依赖浏览器本身扩展技术的插件系统,能实现当前主流浏览器的全兼容,包括低版本的Chrome和IE浏览器;而且对插件的下载和安装提供了类似ActiveX控件的机制,去掉了一些影响用户体验的告警并附加了调用方安全验证机制。而这个播放窗口程序也提供了比较好的范例实现,其具体调用方法可以参考这里的说明:VLC网页小程序开发接口,难能可贵的是在这个播放窗口还直接实现了多路RTSP的同时播放支持,可点选切换播放窗口焦点和全屏播放。据了解,此方案已经成功在多个客户现场完成实施并取得了良好的效果,获得了客户的一致好评,毕竟能实现低延迟、低成本的同时播放是硬道理。下面是播放效果视频展示:

VLC网页播放小程序效果演示

某视频监控大厂最近也发布了此思路实现的版本,不过经过测试发现,不支持Firefox高版本浏览器不说,其播放窗口程序框架采用的是臃肿的QT来实现的,看上去播放窗口只是模拟显示的效果而不是真正内嵌到浏览器窗口中的,导致和浏览器的联动效果比较差,插件包也很大,为提供前端自动升级和安全调用机制。另外想用此播放插件还必须购买其DSS系统,而这套DSS系统的售价不菲,对非安防行业客户来说性价比很低。

对于个别客户要求免插件的要求,主要还是因为安全原因。其实那些所谓免插件的实现方案中,也是需要浏览器从服务器下载JS版播放器的,而插件版下载的是本地程序播放器,只需要保证下载到本地的播放器程序是安全的即可,必要的话可开放源代码来打消客户对安全的顾虑。另外原因就是需要额外下载插件程序导致部署和升级麻烦,为了超低延迟的播放效果,这个是必要的代价,况且前文提到的PluginOK中间件提供了播放插件的自动安装和升级机制,这样就大大降低了部署和升级的压力,效果比IE中的ActiveX控件更好。

四、总结

一个好的技术实施方案,首先是要满足客户的需求,其次是尽量降低开发、实施及运营的总成本,再次是是良好的兼容性和可靠性,最后需尽量确保技术方案不能因为浏览器的升级而失效。本文基于当前最新的技术信息和实践经验,提供了这样一个稳定可靠、兼容性好、低延迟又可同时播放多路RTSP的低成本技术方案,以供大家参考。如还有疑问,欢迎加微信咨询:ZorroSoft

在Chrome、Firefox等高版本浏览器中实现低延迟播放海康、大华RTSP的更多相关文章

  1. 解决Safari高版本浏览器中默认禁用第三方COOKIE(含demo)

    前段时间在项目里遇到了一个比较头疼的问题,就是高版本的Safari中默认会阻止第三方cookie,这使得使用Safari浏览器的用户无法按照正常的业务逻辑进行操作. 问题展现 知识点 什么是第三方co ...

  2. 浏览器低延时播放监控摄像头RTSP海康大华硬盘录像机NVR视频(EasyNVR播放FLV视频流)

    背景描述 EasyNVR的使用者应该都是清楚的知道,EasyNVR一个强大的功能就是可以进行全平台的无插件直播.主要原因在于rtsp协议的视频流(默认是需要插件才可以播放的)经由EasyNVR处理后可 ...

  3. SqlServer高版本数据本分还原到低版本方法

    最近遇见一个问题: 想要将Sqlserver高版本备份的数据还原到低版本SqlServer上去,但是这在SqlServer中是没法直接还原数据库的,所以经过一系列的请教总结出来一下可用方法. 首先.你 ...

  4. 从高版本JDK换成低版本JDK报错Unsupported major.minor version 52.0的解决方案

    从高版本JDK换成低版本JDK报错Unsupported major.minor version 52.0 java.lang.UnsupportedClassVersionError: PR/Sor ...

  5. 高版本SQL备份在低版本SQL还原问题

    问题描述: 高版本SQL备份在低版本SQL还原问题(出现媒体簇的结构不正确)      分析原因: SQL版本兼容问题,SQL SERVER兼容级别是用作向下兼容用,高版本的SQL备份在低版本中不兼容 ...

  6. 从高版本JDK换成低版本JDK报错Unsupported major.minor version 52.0

    ava.lang.UnsupportedClassVersionError: PR/Sort : Unsupported major.minor version 52.0这个错误是由于高版本的java ...

  7. 高版本Sqlserver数据库导入低版本Sqlserver

    今天想跑一个关于java网站的demo,结果在附加数据库项这一块出现问题,例程的数据库用的是sqlserver2014,而我的是2008,添加数据库出现错误.经过一番查找,也找到某人写的一些博客上的解 ...

  8. SqlServer高版本数据备份还原到低版本(转)

    原文地址:https://www.jb51.net/article/96454.htm 想要将Sqlserver2014高版本备份的数据还原到低版本SqlServer2008R2上去,但是这在SqlS ...

  9. iOS高版本备份恢复到低版本系统的方法

    一般来说,在更新iOS系统的时候我们都会建议大家先用iTunes对系统进行完整备份.但时不时都会有人偷懒,或者使用手机OTA升级而没有对系统备份,最终导致不满意新系统了,想降级却无备份可以恢复的尴尬局 ...

随机推荐

  1. a标签禁用

    a标签禁用可以使用CSS3的特性来控制 <a class="disabled">我是a标签</a> a.disabled { pointer-events: ...

  2. 2020-11-02(三年之约D92)-优秀不是一种行为,而是一种习惯

    1.阅读:<软技能-代码之外的生存指南>- 第45章 培养习惯:刷新你的代码 成就我们的恰恰就是那些不断重复做的事情.因此,优秀不是一种行为,而是一种习惯--亚里士多德 习惯主要由三个要素 ...

  3. ERP出入库进阶操作与子流程--开源软件诞生28

    赤龙ERP出入库进阶讲解--第28篇 用日志记录"开源软件"的诞生 [进入地址 点亮星星]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redr ...

  4. 新鲜出炉!花了三天整理的JVM复习知识点,面试突击必备!

    此次JVM知识点包含以下几个部分 1.类加载机制 2.jvm运行时数据区 3.java对象内存布局 4.jvm内存模型 5.垃圾回收机制 6.垃圾收集器 7.问题排查 一 类加载机制 主要说的部分是这 ...

  5. 如何用Camtasia将喜欢的视频做出复古的感觉

    不知道各位可有看老电影的习惯,我个人觉得一些老电影那种别具一格的画面感是非常吸引人的韵味,尽管其色彩不是很鲜艳,但是这种黑白的感觉,对于现在的我们,往往有着不一样的吸引力.于是,我就尝试着用Camta ...

  6. jQuery 第五章 实例方法 事件

    .on() .one() .off() .trigger() .click / keydown / mouseenter ...    .hover() ----------------------- ...

  7. Java中类加载的过程

    类加载过程 这里的加载过程是严格按照加载开始顺序进行的,注意是加载开始而不是加载完成.也就是有可能会有两个或几个阶段是同时进行的. 比如下面提到的验证过程中的符号引用验证是在解析阶段开始之后进行. 加 ...

  8. C#设计模式-装饰器模式(Decorator Pattern)

    引言 当我们完成一个软件产品开发后就需要对其进行各种测试,适配快速迭代下质量的保障.当有一个完善的产品的对象后,如果我们想要给他添加一个测试功能,那么我们可以用一个新的类去装饰它来实现对原有对象职责的 ...

  9. Robot Framework安装和入门

    1:安装 python 安装python并且配置好环境变量 2:安装 Robot Framework pip install robotframework 3:安装GUI界面 pip install ...

  10. 【刷题笔记】DP优化-单调队列优化

    单调队列优化 眼界极窄的ZZ之前甚至不会单调队列--(好丢人啊) 单调队列优化的常见情景: 转移可以转化成只需要确定一个维度,而且这个维度的取值范围在某个区间里 修剪草坪 这个题学长讲的好像是另外一个 ...