因为有监控视频接入网页进行预览的相关需求,经过一系列实验,整理了一套较为可行的技术方案。这套方案的主要技术框架如下图所示。
视频流封装协议转码部分使用ffmpeg从摄像头(NVR)拉取rtsp视频流,并转为rtmp协议的视频流,推入流媒体服务器供其使用。
流媒体服务器使用的是开源项目LiveGo,在流媒体服务器中完成转码,形成http-flv格式的视频流,以供浏览器使用。
浏览器插件采用的是bilibili开源的flv.js模块,前端部分我知之甚少,还请了解的同志补充。
下面分别就转码后台的两部分进行较为详细的介绍。
海康威视默认的视频流是rtsp封装的视频,编码方式为h264或者h265,其他厂商的监控解决方案也类似。这里需要注意一点,由于h265压缩率比h264更高,有可能摄像头默认的是h265的编码方式,但是flv格式并不支持h265的编码方式,需要在此步骤转为h264的编码方式,这里计算量很大,会导致大量不必要的硬件资源消耗,所以应统一将摄像头设置为h264编码。
ffmpeg的安装及基本使用方法请参考一下文档,Linux版本,Windows版本,Arm版本。ffmpeg只用作rtsp转rtmp的方式相对简单,这里仅记录一些命令,更多配置的细节欢迎讨论。
假设输入的rtsp流为:rtsp://user:passwd@10.10.1.130:554/input_stream
假设输出的rtmp流为:rtmp://10.10.1.130:1935/live/test
,推荐的转码命令如下:
ffmpeg -i "rtsp://user:passwd@10.10.1.130:554/input_stream" -vcodec copy -acodec copy -f flv "rtmp://10.10.1.130:1935/live/test"
其中,视频和音频编码均直接使用了原编码方式,输出的文件格式参数为-f
这里使用的是flv
格式。
如果摄像头使用的不是h264编码,需要将参数-vcodec
改为h264
。
如果需要调整音频参数,请修改-acodec
参数,因为后续需要使用flv.js
模块,只支持aac
或MP3
编码,这个参数的调整请慎重。
调整后的命令如下:
ffmpeg -i "rtsp://user:passwd@10.10.1.130:554/input_stream" -vcodec h264 -acodec aac -f flv "rtmp://10.10.1.130:1935/live/test"
windows版本的命令大同小异,请自行按照对应的格式使用,这里就不做过多赘述,如有存在困难请联系我更新文档。
注,这里的输入和输出流需要用户根据自己的情况更改,其中输出的rtmp流地址是从LiveGo服务器获取,详见3.2.3节。
LiveGo是可以使用docker部署的一个轻量化视频流服务器,其已经发布了各个平台下的release版本,可以减少大量自行编译的工作,建议根据自身平台直接选用。
其使用方法可以参考官方文档,总体上来说十分简单,不过官方的文档讲述不太清楚存在一些歧义,导致我在第一次尝试时遇到了很大的问题,这里自己写一个简单教程,供大家参考。
我直接使用docker版本会报错,时间是2020年5月9日,可能跟作者近期的更新有关。
直接使用release版本是最简单的选择。
这个服务器的使用依照以下的流程进行。
首先启动LiveGo服务器,然后向服务器申请一个可用的房间或者说地址。然后向这个地址推流。之后其他设备或播放器就可以从这个房间拉流了。
如果这里不需要使用额外的配置选项,可以直接启动服务器,这里以Linux系统为例进行介绍。
直接执行 livego
二进制文件启动 livego 服务。
./livego
如果有更改yaml中的配置参数,需要在启动时加上--config_file
参数,该参数默认为livego.yaml
,所以如果配置写在这个文件下,直接启动就好。更多选项请使用帮助选项,即:
./livego -h
需要注意的是,LiveGo默认会存储所有推流信息的录像,默认路径为LiveGo根目录/tmp/
,至于LiveGo这种存储方式会使用多大空间的硬盘、多流情况下会对硬盘造成怎样的压力,目前都没有做过测试,后面需要对其进行更多的测试。
推流之前需要向LiveGo服务器申请推流的房间地址。需要说明的是,一个房间有两个属性,一是名字,二是其推流地址,拉流过程是通过向房间名申请流得到的,而推流则需要推向其推流地址。这么做的原因我猜测是保证房间的安全性,避免他人的流推到该房间中。
申请房间地址的方式非常简单,直接从服务器get一个房间地址就好了,接口地址如下,只要把房间名改成自己的房间即可,这里我们假设房间名为hik,LiveGo的ip是localhost,默认端口为8090。
http://localhost:8090/control/get?room=hik
如果一切正常的话,服务器会返回一个加密后的地址,如
{
"status": 200,
"data": "L17LTlsVqMNTZyLKMIFSD2x28MlgPJ0SDZVHnHJPxMKi0tWx"
}
到这里就表示申请房间已经成功了,服务器中添加了可用的房间hik
。
当我们获取了房间的推流地址后,就可以获得实际用于rtmp推流的地址了,其规则为
rtmp://{LiveGo ip}:{port}/{appname}/{channelkey}
这里假设LiveGo的ip是localhost,port为默认的1935,appname为默认的live,channelkey是3.2.2节中获取的加密后地址,则最终推流地址为
rtmp://localhost:1935/live/L17LTlsVqMNTZyLKMIFSD2x28MlgPJ0SDZVHnHJPxMKi0tWx
将第二节中介绍的推流输出地址改为上述地址,即可推送到该房间。
LiveGo支持三种输出方式,分别是rtmp、http-flv、HLS,issue中报告同时使用不同的输出方式可能存在问题,但是我并未测试出这种问题,还是要慎重同时使用多种输出。
三种输出的标准格式如下所示
RTMP
:rtmp://localhost:1935/{appname}/room
http://127.0.0.1:7001/{appname}/room.flv
HLS
:http://127.0.0.1:7002/{appname}/room.m3u8
其中appname默认为live,room为申请房间时所使用的名字,本文中以hik为例,那么三种方式最终的地址为
RTMP
:rtmp://localhost:1935/live/hik
http://127.0.0.1:7001/live/hik.flv
HLS
:http://127.0.0.1:7002/live/hik.m3u8
后续播放器直接从这三个地址拉流即可完成播放。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。