前言
大概有几年没有更新文章了,最近机缘巧合,项目中还是涉及到web端播放视频相关业务,所以不得不再次重拾C++,不过作为C++老程序员,兼顾java或cpp技术方面研发还不是什么大问题。言归正常,今天我要解决的问题就是web端播放摄像机实时视频,总结一下有如下几种方案:
- (1)使用ActiveX插件播放
这是传统安防行业最古老的解决方案,适合c++开发人员,优点是c++开发速度快,缺点是只适合IE内核使用,且需要证书或需要较 为复杂的浏览器配置。 - (2)使用Flash插件播放
相对于ActiveX的好处就是flash插件更通用,适合大部分浏览器,缺点就是还是需要插件且google在2021年底就不在支持flash了。 - (3)使用HLS协议播放
hls是苹果开发的一套基于http协议的浏览器,优点是适合普通浏览器和移动端,无需任何插件,缺点是延时稍大(大概在3-10s) - (4)使用http-flv协议播放
这种协议也是基于http协议传输flv文件(不需要flash插件的adobe格式文件播放),缺点是协议通用性不及hls。 - (5)使用websocket播放
这种方式是排除插件方式播放视频,使用websocket发送音视频数据,然后前端使用js的h264库进行解码渲染,缺点效率低,仅支持 h264,前端也要借助js播放库。 - (6)使用webrtc播放
既websocket通用协议之后,google退出的webrtc播放协议也普遍在各大浏览器上得到支持和使用,效率较高,但开发难度较大。
HLS协议
我们这里使用的就是HLS协议,由于HLS在各个终端的支持性非常友好,在对实时性要求又不是非常高的情况下(我这里开发测试大概在3-4秒的延时),我们可以非常大胆的选择HLS协议进行实时视频点播,使用HLS实时播放网络摄像机存在以下几个问题,也是本章节我们要解决的问题:
- (1)传统摄像机或设备不支持HLS协议
做传统安防行业的应该都知道,安防常用的设备包括IPC摄像机、NVR录像机、DVR录像机、解码器、门禁、卡口等带有视频能力的 设备都不支持HLS传输协议,一般都支持rtsp、GB28181协议,有的只有服务器才支持rtmp协议,但是这些协议都有一个特点:不能 在浏览器上无插件播放。 - (2)浏览器播放要求无插件播放
要将实时视频在普通的浏览器播放且是不需要任何插件的播放是基本所有用户需要面临和解决的一个问题,大家的解决方案各不一 样,各有优点和缺点,要根据实际情况选择并进行独立开发,最重要的是这种需求对开发能力要求很高,为什么?音视频编解码要求 程序员需要深入了解c++语音的同时还要求对编解码这块非常熟悉,同时对web端编码有一定的了解和积累,一般情况下不能全能型 的技术开发员很难做到!
今天我要解决的就是这两大难题,决绝方法就是将RTSP协议(几乎所有摄像机都支持,只不过rtsp地址格式不一样)转换为HLS协议!
为了实现以上功能,我决定开发一套cpp流媒体服务器,专门接入所有rtsp视频流,然后通过协议转换为HLS视频流,web端就可以通过video标签实时播放视频了。媒体服务提供了如下接口: (1)动态添加rtsp设备 通过该接口动态给媒体服务器添加rtsp设备并接入进来。 (2)动态删除rtsp设备 在不需要接入设备,可以直接从接入服务中删除,如果正在录像则停止所有录像,停止播放的视频,最后删除设备并释放服务器资源。 (3)动态更新设备录像策略 支持配置周一到周日的各个时段录像配置,录像支持mp4或flv格式文件存储。 (4)启动rtsp视频转HLS点播 为充分利用服务器资源,在播放的时候才启动rtsp拉取和hls协议转换 (5)手动停止rtsp视频点播 播放HLS视频之后,如果一直有拉取ts视频流则视频不会自动关闭,如果hls视频关闭后,媒体服务会自动检测到并关闭视频,释放服务器 资源,当然也可以通过接口手动强制关闭视频。
媒体接入服务效果: HLS播放效果(测试用网上搜索到的HLS在线测试网站:http://192.168.8.19:180/9/1/1/index.m3u8) 视频录制播放:
功能简介
基于c++开发的媒体服务功能亮点如下 (1)支持rtsp设备接入 (2)支持HLS视频点播 (3)提供http控制接口(设备添加、录像控制、视频点播停止等) (4)支持mp4或flv实时视频录制和下载播放 (5)支持本地磁盘轮询覆盖视频录制 (6)支持与第三方云平台对接(包括设备管理、录像策略、录像记录、设备状态等) (7)支持设备报警联动录像 (8)支持http安全认证(basic和bearer)
媒体服务器配置如下
<?xml version="1.0" encoding="utf-8"?>
<config>
<!—媒体服务本地配置-->
<local>
<!—媒体服务启动生成的唯一id —>
<id>bUm7gMEQrG</id>
<!—媒体服务器在第三方平台的唯一设备序列号,根据实际情况配置即可—>
<serailNo>123456</serailNo>
<!—媒体服务器可识别的设备名称-->
<name>大润发商场媒体服务</name>
<!—媒体服务本机的设备ipv4地址,多网卡情况需要正确配置一个-->
<ip>192.168.8.19</ip>
<!—媒体服务提供的rtsp服务的侦听端口-->
<rtspPort>8090</rtspPort>
<!—媒体服务提供的http服务侦听端口,这里主要是hls协议播放视频所用-->
<httpPort>180</httpPort>
<!—媒体服务是否启用用户认证功能,如果启用调用媒体服务http接口都需要认证-->
<enableRight>true</enableRight>
<!—启用认证后,访问该媒体服务验证的用户名-->
<user>media</user>
<!—启用认证后,访问该媒体服务器验证的密码-->
<password>123456</password>
</local>
<!—媒体服务日志配置-->
<log>
<!—媒体服务器系统日志打印级别,从0到5五个级别对应打印全部日志或致命错误-->
<level>0</level>
<!—系统日志是否上传,目前该功能未对接-->
<upload>false</upload>
</log>
<!—云平台配置-->
<cloud>
<!—云平台服务器地址-->
<url>http://81.71.74.135:5002</url>
<!—登录云平台账户名-->
<user>admin</user>
<!—登录云平台账户密码md5-->
<password>0192023A7BBD73250516F069DF18B500</password>
</cloud>
<!—hls视频配置-->
<hls>
<!—hls视频存储的根目录,http会挂载该目录-->
<path>D:/media/hls</path>
<!—hls生成的ts文件携带的前缀-->
<prefix>lixx</prefix>
<!—hls切割ts文件最大个数-->
<spliteSize>5</spliteSize>
<!—hls切割的单个ts文件时长-->
<duration>1</duration>
<!—hls播放协议保活时长:多久不访问后自动关闭rtsp实时视频-->
<aliveTime>15</aliveTime>
</hls>
<!—媒体服务器录像配置-->
<record>
<!—是否启用视频预览图拍功能,该功能暂未启用,请不要开启-->
<capture>
<!—是否启动抓拍-->
<enable>false</enable>
<!—抓拍间隔,时间单位为秒-->
<gap>300</gap>
<!—实时视频预览图抓拍存储路径-->
<path>D:/media/capture</path>
</capture>
<!—是否开启录像,默认开启,如果关闭则所有接入设备都不录像,及时配置了录像策略-->
<enable>true</enable>
<!—录像存储目录—>
<path>D:/media/record</path>
<!—录像存储格式,目前支持flv或mp4两种类型-->
<format>flv</format>
<!—每一个录像文件大小,单位字节,默认100M-->
<filesize>104857600</filesize>
<!—系统预留磁盘最大空间,超出剩余空间则自动清理最老录制的录像文件-->
<reserve>2147483648</reserve>
<!—报警录像保留最大天数,目前不支持报警录像短视频录制-->
<alarmSaveDay>30</alarmSaveDay>
<items/>
</record>
<!—本地录像存储的数据库配置—>
<db>
<!—数据库类型0为mysql,1为sqlite—>
<type>1</type>
<!—本地数据库地址,mysql有效-->
<ip>127.0.0.1</ip>
<!—本地数据库端口,mysql有效-->
<port>3306</port>
<!—本地数据库账号,mysql有效-->
<user>root</user>
<!—本地数据库密码,mysql有效-->
<pwd>root</pwd>
<!—本地数据库名称-->
<name>record</name>
</db>
</config>
媒体服务器提供对接文档
源码获取、合作、技术交流请获取如下联系方式:
QQ交流群:961179337 微信账号:lixiang6153 公众号:IT技术快餐 电子邮箱:lixx2048@163.com
|