1 Star 0 Fork 0

Ron / video_show

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

视频监控接入网页预览的技术路径总结

1. 概述

因为有监控视频接入网页进行预览的相关需求,经过一系列实验,整理了一套较为可行的技术方案。这套方案的主要技术框架如下图所示。

总体流程图

视频流封装协议转码部分使用ffmpeg从摄像头(NVR)拉取rtsp视频流,并转为rtmp协议的视频流,推入流媒体服务器供其使用。

流媒体服务器使用的是开源项目LiveGo,在流媒体服务器中完成转码,形成http-flv格式的视频流,以供浏览器使用。

浏览器插件采用的是bilibili开源的flv.js模块,前端部分我知之甚少,还请了解的同志补充。

下面分别就转码后台的两部分进行较为详细的介绍。

2. 使用ffmpeg将rtsp视频流转为rtmp视频流

海康威视默认的视频流是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模块,只支持aacMP3编码,这个参数的调整请慎重。

调整后的命令如下:

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节。

3. 使用LiveGO视频流服务器进行转码分发操作

LiveGo是可以使用docker部署的一个轻量化视频流服务器,其已经发布了各个平台下的release版本,可以减少大量自行编译的工作,建议根据自身平台直接选用。

其使用方法可以参考官方文档,总体上来说十分简单,不过官方的文档讲述不太清楚存在一些歧义,导致我在第一次尝试时遇到了很大的问题,这里自己写一个简单教程,供大家参考。

3.1 LiveGo的安装

我直接使用docker版本会报错,时间是2020年5月9日,可能跟作者近期的更新有关。

直接使用release版本是最简单的选择。

3.2 LiveGo的使用

这个服务器的使用依照以下的流程进行。

使用流程

首先启动LiveGo服务器,然后向服务器申请一个可用的房间或者说地址。然后向这个地址推流。之后其他设备或播放器就可以从这个房间拉流了。

3.2.1 启动LiveGo服务器

如果这里不需要使用额外的配置选项,可以直接启动服务器,这里以Linux系统为例进行介绍。

直接执行 livego 二进制文件启动 livego 服务。

./livego

如果有更改yaml中的配置参数,需要在启动时加上--config_file参数,该参数默认为livego.yaml,所以如果配置写在这个文件下,直接启动就好。更多选项请使用帮助选项,即:

./livego -h

需要注意的是,LiveGo默认会存储所有推流信息的录像,默认路径为LiveGo根目录/tmp/,至于LiveGo这种存储方式会使用多大空间的硬盘、多流情况下会对硬盘造成怎样的压力,目前都没有做过测试,后面需要对其进行更多的测试。

3.2.2 申请房间地址

推流之前需要向LiveGo服务器申请推流的房间地址。需要说明的是,一个房间有两个属性,一是名字,二是其推流地址,拉流过程是通过向房间名申请流得到的,而推流则需要推向其推流地址。这么做的原因我猜测是保证房间的安全性,避免他人的流推到该房间中。

申请房间地址的方式非常简单,直接从服务器get一个房间地址就好了,接口地址如下,只要把房间名改成自己的房间即可,这里我们假设房间名为hik,LiveGo的ip是localhost,默认端口为8090。

http://localhost:8090/control/get?room=hik

如果一切正常的话,服务器会返回一个加密后的地址,如

{
    "status": 200,
    "data": "L17LTlsVqMNTZyLKMIFSD2x28MlgPJ0SDZVHnHJPxMKi0tWx"
}

到这里就表示申请房间已经成功了,服务器中添加了可用的房间hik

3.2.3 向房间推流

当我们获取了房间的推流地址后,就可以获得实际用于rtmp推流的地址了,其规则为

rtmp://{LiveGo ip}:{port}/{appname}/{channelkey}

这里假设LiveGo的ip是localhost,port为默认的1935,appname为默认的live,channelkey是3.2.2节中获取的加密后地址,则最终推流地址为

rtmp://localhost:1935/live/L17LTlsVqMNTZyLKMIFSD2x28MlgPJ0SDZVHnHJPxMKi0tWx

将第二节中介绍的推流输出地址改为上述地址,即可推送到该房间。

3.2.4 获取播放流

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

后续播放器直接从这三个地址拉流即可完成播放。

TODO

  1. 使用ffmpeg将多路视频流合成一路视频流推到流媒体服务器
  2. 流媒体服务器的docker部署
  3. LiveGo的压力测试
  4. LivoGo取消录像的选项

空文件

简介

暂无描述 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/RightRon/video_show.git
git@gitee.com:RightRon/video_show.git
RightRon
video_show
video_show
master

搜索帮助