# video_show **Repository Path**: RightRon/video_show ## Basic Information - **Project Name**: video_show - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-05-11 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 视频监控接入网页预览的技术路径总结 ## 1. 概述 因为有监控视频接入网页进行预览的相关需求,经过一系列实验,整理了一套较为可行的技术方案。这套方案的主要技术框架如下图所示。 ![总体流程图](http://assets.processon.com/chart_image/5eb8c21b7d9c08156c3394df.png) 视频流封装协议转码部分使用ffmpeg从摄像头(NVR)拉取rtsp视频流,并转为rtmp协议的视频流,推入流媒体服务器供其使用。 流媒体服务器使用的是开源项目[LiveGo](https://github.com/gwuhaolin/livego),在流媒体服务器中完成转码,形成http-flv格式的视频流,以供浏览器使用。 浏览器插件采用的是[bilibili](https://github.com/bilibili)开源的[flv.js](https://github.com/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`,推荐的转码命令如下: ```shell 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节。 ## 3. 使用LiveGO视频流服务器进行转码分发操作 LiveGo是可以使用docker部署的一个轻量化视频流服务器,其已经发布了各个平台下的[release版本](https://github.com/gwuhaolin/livego/releases),可以减少大量自行编译的工作,建议根据自身平台直接选用。 其使用方法可以参考[官方文档](https://github.com/gwuhaolin/livego),总体上来说十分简单,不过官方的文档讲述不太清楚存在一些歧义,导致我在第一次尝试时遇到了很大的问题,这里自己写一个简单教程,供大家参考。 ### 3.1 LiveGo的安装 我直接使用docker版本会报错,时间是2020年5月9日,可能跟作者近期的更新有关。 直接使用release版本是最简单的选择。 ### 3.2 LiveGo的使用 这个服务器的使用依照以下的流程进行。 ![使用流程](http://assets.processon.com/chart_image/5eb8acf9e401fd16f42ac649.png) 首先启动LiveGo服务器,然后向服务器申请一个可用的房间或者说地址。然后向这个地址推流。之后其他设备或播放器就可以从这个房间拉流了。 #### 3.2.1 启动LiveGo服务器 如果这里不需要使用额外的配置选项,可以直接启动服务器,这里以Linux系统为例进行介绍。 直接执行 `livego` 二进制文件启动 livego 服务。 ```shell ./livego ``` 如果有更改yaml中的配置参数,需要在启动时加上`--config_file`参数,该参数默认为`livego.yaml`,所以如果配置写在这个文件下,直接启动就好。更多选项请使用帮助选项,即: ```shell ./livego -h ``` 需要注意的是,LiveGo默认会存储所有推流信息的录像,默认路径为`LiveGo根目录/tmp/`,至于LiveGo这种存储方式会使用多大空间的硬盘、多流情况下会对硬盘造成怎样的压力,目前都没有做过测试,后面需要对其进行更多的测试。 #### 3.2.2 申请房间地址 推流之前需要向LiveGo服务器申请推流的房间地址。需要说明的是,一个房间有两个属性,一是名字,二是其推流地址,拉流过程是通过向房间名申请流得到的,而推流则需要推向其推流地址。这么做的原因我猜测是保证房间的安全性,避免他人的流推到该房间中。 申请房间地址的方式非常简单,直接从服务器get一个房间地址就好了,接口地址如下,只要把房间名改成自己的房间即可,这里我们假设房间名为hik,LiveGo的ip是localhost,默认端口为8090。 ```shell http://localhost:8090/control/get?room=hik ``` 如果一切正常的话,服务器会返回一个加密后的地址,如 ``` { "status": 200, "data": "L17LTlsVqMNTZyLKMIFSD2x28MlgPJ0SDZVHnHJPxMKi0tWx" } ``` 到这里就表示申请房间已经成功了,服务器中添加了可用的房间`hik`。 #### 3.2.3 向房间推流 当我们获取了房间的推流地址后,就可以获得实际用于rtmp推流的地址了,其规则为 ```shell 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取消录像的选项