/hk-hls-client

基于nodejs实现海康摄像头推送hls流并生成m3u8播放连接

Primary LanguageJavaScriptApache License 2.0Apache-2.0

ip-camera-hls

将ip摄像头支持的rtsp、rtmp转成hls

使用它做啥?

为了解决不会android开发,ios开发,不懂c++,然后又想在浏览器上、混合app上观看实时的摄像头,那就可以使用它来作为媒介中转。

由于flash不久将会退出浏览器市场(谷歌已经说明在2020年不再支持flash),所以使用rtmp流的摄像头,暂时能通过flash播放。 基于这样的现状,我查阅了网上的一些资料,大体都是将其转成hls,在使用video-js-hls插件播放 对于ios用户,可以直接在浏览器下播放m3u8文件

使用如下

  • 配置videos.json(配置路径与package.json同级) 目前是把摄像头配置在文件里,存哪里可以自行修改;下面展示的是海康摄像头的参数
      {
        "name": "192.168.0.102",// 摄像头名称
        "code": 10002,// 摄像头唯一标识
        "ip": "192.168.0.102",// 摄像头IP
        "port": 554,// 摄像头端口
        "username": "admin",// 账户
        "password": "123456",// 密码
        "videoEncode": "h264",// 编码方式
        "channel": "ch1",// 通道
        "streamType": "sub/av_stream"// 码率类型:主码流和子码流
      }
  • 配置config.js(配置路径与package.json同级)

    module.exports = {
        hlsPath: 'public/videos',// m3u8生成文件的目录
        apiHost: '0.0.0.0',// api接口主机名
        apiPort: 8080,// api接口端口号
        hlsHost: '0.0.0.0',// hls播放服务主机名
        hlsHostName: '127.0.0.1',// hls播放服务对外主机名
        hlsPort: 10860,// hls播放服务端口号
        tcpHost: '0.0.0.0',// 转流服务主机名
        tcpPort: 12860,// 转流服务端口
        tcpMaxConnect: 100,// 转流服务最大连接客户端
        heartTime: 1000 * 60 * 5,// 心跳检测时间
        hlsHeartTime: 1000 * 60 * 1,// hls客户端心跳检测时间
        outHeartTime: 1000 * 60 * 3,// m3u8存活时间
        indexCode: 'pvcMB!',// 转流服务握手包
        m3u8Created: 20,// 等待生成m3u8文件时间(单位:秒)
        thumbCreated: 10,// 等待生成视频第一帧图片时间(单位:秒)
        imageDataFolder: "D:\\www\\ImgData\\Camera",// 视频帧图片存放目录
        imageDataServer: 'http://192.168.0.102:8003/',// 图片服务器
        redis: {// redis配置,暂时不需要
            host: '127.0.0.1',
            port: 6379
        }
    };
  • 启动转流服务

   node TcpServer.js
  • 启动api服务
   node ApiServer.js
  • 启动hls播放服务
   node HlsServer.js
  • 以windows服务启动

    1、 安装node-windows

     $ npm install -g node-windows
     
     $ npm link node-windows
    

    2、 安装tcp、api、hls顺序执行

     $ node TcpWinService.js
     
     $ node ApiWinService.js
     
     $ node HlsWinService.js
    

运行测试

使用http测试工具请求``http://{apiHost}:{apiPort}/api/video/getUrl`

该请求连接为post请求,必须带code参数且code作为post参数,code是摄像头的唯一标识

当返回如下数据(url连接为测试数据):

    {
        "data": {
            "url": "http://127.0.0.1:10860/public/videos/10004/20191016162246/38222c.m3u8"
        },
        "code": 1000,
        "msg": "successed"
    }

表示成功,其他返回表示失败。

说明

* 要求系统配置比较高,转码本身就需要高配置的服务器。在我的测试下:最快3秒接口返回数据(播放文件生成),平均11秒左右

* 当前版本需要优化,目前是请求转码才创建FFmpeg进程,我能想到的是:预先生成进程,在需要的时候使用它,也就是做成FFmpeg进程池

思维导向

* 项目整体要求

    该项目的核心就是将摄像头的rtsp流转成hls,并返回一个可播放的地址。
    
* 各服务作用

    1. apiServer
        用于客户端请求接口,并返回播放地址
      
    2. tcpServer
        用于操作解码器解码,并自动治理ffmpe进程和播放文件
        
    3. hlsServer
        是一个http服务,仅支持hls协议相关的资源,请求任何其它资源都是404;该服务还有个作用就是监听客户端浏览视频文件的时间

升级

尽快做出进程池方式     

wiki

....