WVP+ZLMediaKit+MediaServerUI实现摄像头GB28181推流播放录制

目录

本文主要介绍使用 WVP+ZLMediaKit+MediaServerUI 实现通过 GB28181 进行海康、大华、宇视等品牌的 IPCNVRDVR 接入,完成摄像头监控播放,控制,录制。

准备工作

1.服务运行环境,Linux / OS X / Windows 均可,但推荐 Linux

2.海康云台摄像头一个

4.运行 sip 服务 WVP https://github.com/swwheihei/wvp-GB28181

5.运行流媒体服务 ZLMediaKit https://github.com/xiongziliang/ZLMediaKit

7.运行前端展示项目 MediaServerUI https://gitee.com/kkkkk5G/MediaServerUI/tree/gb28181/

以上三个项目其实都有文档可供查看,因为踩了一些坑,所以写了本文,文章可能会写得比较细一点,建议结合它们的文档一起看。

运行 WVP

安装 Redis

WVP 项目中将设备信息等存放在 Redis 中,所以需要安装 Redis,安装教程请自行搜索。

配置运行 SIP

首先修改 WVP 项目配置文件:

spring:
    application:
        name: iot-vmp-vmanager
        # 影子数据存储方式,支持redis、jdbc
        database: redis
        # 通信方式,支持kafka、http
        communicate: http
    redis: 
        # Redis服务器IP
        host: 127.0.0.1
        #端口号
        port: 6379
        datebase: 0
        #访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接
        password: 123123
        #超时时间
        timeout: 10000
    datasource: 
        name: eiot
        url: jdbc:mysql://host.docker.internal:3306/eiot?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true
        username: root
        password: 123456
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
sip:
        # SIP 所在服务IP,就是本机IP
    ip: 192.168.1.102
    port: 5060
    # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007)
    # 后两位为行业编码,定义参照附录D.3
    # 3701020049标识山东济南历下区 信息行业接入
    domain: 3701020049
    id: 37010200492000000002
    # 默认设备认证密码,后续扩展使用设备单独密码
    password: 123456
media:
        # 流媒体服务的IP,内网测试可填内网IP,公网填公网服务器IP并放开端口
    ip: 177.11.11.111
    port: 10000

然后登录海康摄像头管理页面,修改配置:

平台接入选择 28181;传输协议可自选,公网建议选择TCP;协议版本选择 GB/T28181-2016(目前WVP只支持这个协议,2011后面会适配)

SIP服务器IDSIP服务器域密码 要和 WVP 项目中配置的一致。

SIP服务器地址 填写 WVP 项目的地址,内网填写内网IP地址,云服务器填写公网IP,端口写配置文件中配置的端口。

因为摄像头平台接入配置好后,摄像头会请求 SIP 服务,所以这个一定要配置好。

配置完成后就可以运行项目了!如果 SIP 服务启动成功后,会看到这个日志 "Sip Server 启动成功":

如果摄像头连接到 SIP 服务,项目会有这样的日志,显示 200 OK(公网服务器记得放开sip端口):

建立好连接后,就可以控制查询摄像头了。

GET /api/devices 查询所有设备的信息

[
    {
        "deviceId":"37010200492000000001",
        "name":"IP DOME",
        "manufacturer":"Hikvision",
        "model":"DS-2DC4223IW-D/GLT",
        "firmware":"V5.6.15",
        "transport":"TCP",
        "host":{
            "ip":"192.168.1.101",
            "port":1609,
            "address":"192.168.1.101:1609"
        },
        "online":1,
        "channelMap":{
            "34020000001320000001":{
                "channelId":"34020000001320000001",
                "name":"IPdome",
                "manufacture":"Hikvision",
                "model":"IP Camera",
                "owner":"Owner",
                "civilCode":"37010123123",
                "block":null,
                "address":"Address",
                "parental":0,
                "parentId":null,
                "safetyWay":0,
                "registerWay":1,
                "certNum":null,
                "certifiable":0,
                "errCode":0,
                "endTime":null,
                "secrecy":"0",
                "ipAddress":null,
                "port":0,
                "password":null,
                "status":1,
                "longitude":0,
                "latitude":0
            }
        }
    }
]

POST /api/ptz/{deviceId}/{channelId} 云台控制指定设备通道

http://127.0.0.1:8080/api/ptz/34020000001320000001/34020000001320000001?leftRight=1&upDown=0&inOut=0&moveSpeed=50&zoomSpeed=1

zoomSpeed 的数字不能太大于,不然运行不了,无效。

WVP 项目所有接口:https://github.com/swwheihei/wvp-GB28181/wiki/API-%E6%8E%A5%E5%8F%A3

运行流媒体服务 ZLMediaKit

获取代码

#国内用户推荐从同步镜像网站gitee下载 
git clone --depth 1 https://gitee.com/xiahcu/ZLMediaKit
cd ZLMediaKit
#千万不要忘记执行这句命令
git submodule update --init

构建项目

项目开发者贴心的提供了三个shell脚本在项目根目录:

  • build_docker_images.sh 构建为docker镜像
  • build_for_linux.sh linux下构建项目
  • build_for_mac.sh mac下构建项目

打开以后可以看到是使用CMake来编译的,我们可以直接选择运行shell脚本,Windows的话就看文档跟着一步步来吧😹。

构建好后打开 release/xx/Debug 目录,可以看到有 config.ini 是项目的配置文件:https://github.com/xiongziliang/ZLMediaKit/blob/master/conf/config.ini

其中需要特别注意的有两个地方:

一是 [http] 的 port,因为 ZLMediaKit 项目也有很多 API 接口,都需要通过这个接口来访问,包括生成的播放的URL,都是这个端口,如遇到端口被你的其它服务占用,可自行配置。

二是 [rtp_proxy] 的 port,是我们上面 SIP 项目配置的 media.port

配置好了就可以运行项目了。

运行项目

Linux 下启动:

cd ZLMediaKit/release/linux/Debug
#通过-h可以了解启动参数
./MediaServer -h
#以守护进程模式启动
./MediaServer -d &

使用守护进程模式启动后,可以通过 ps -axj 来查看进程

运行成功后会打印出如下日志:

我们可以做下推流测试,非必须操作,不需要可直接跳到下一节“项目推流”,具体操作可以查看文档:https://github.com/xiongziliang/ZLMediaKit/wiki/ZLMediaKit%E6%8E%A8%E6%B5%81%E6%B5%8B%E8%AF%95

下载一个视频文件 big_buck_bunny.mp4 放在当前目录上,使用rtp方式推流试试,在文件所在目录输入命令(没安装ffmpeg的话需要先安装下):

ffmpeg -re -i "big_buck_bunny.mp4" -vcodec h264 -acodec aac -f rtp_mpegts rtp://127.0.0.1:10000

运行后,查看 ZLMediaKit 项目会有类似这样的日志:

使用可以播放流的播放器(如:PotPlayer,IINA)打开 http://服务器IP/rtp/xxxxx.flv 就能播放了。

http://服务器IP/rtp/061484E1.flv

项目推流

SIP 服务和流媒体服务以及就绪了,我们就可以推流了。

拿到 /api/devices 查到的 deviceId 和 channelId,然后调用 SIP 服务的播放接口

GET /api/play/37010200492000000001/34020000001320000001 预览指定设备通道的音视频

成功调用后会返回ssrc:

{"ssrc":"0102008033"}

ssrc 转换为16进制后为 061484E1

我们查看流媒体服务的日志,就能看到如下:

注:公网服务器如果没有收到推流日志,记得开放端口并检查 wvp 项目的 media 配置是否正确。

那我们怎么拿到播放地址呢?其实文档已经有了:https://github.com/xiongziliang/ZLMediaKit/wiki/%E6%92%AD%E6%94%BEurl%E8%A7%84%E5%88%99

如果我的公网IP是177.11.11.111,转换过来就是:

rtsp://177.11.11.111:554/rtp/061484E1?token=abcdefg&field=value

rtmp://177.11.11.111/rtp/061484E1

http://177.11.11.111/rtp/061484E1.flv

http://177.11.11.111/rtp/061484E1/hls.m3u8

此外 ZLMediaKit 还提供了录制,截图,动态添加拉流代理等功能,很棒,大家感兴趣可以看API文档。

运行MediaServerUI

拉下项目代码:https://gitee.com/kkkkk5G/MediaServerUI/tree/gb28181/

项目启动后,SIP 服务调用 play 接口,流媒体服务受到消息,在项目的“视频广场”中就能看到我们的视频了。

dediaServerUI

这个项目需要注意的也是配置,本项目是和流媒体服务关联的,调用的接口也是流媒体 ZLMediaKit 的 API。

打开项目根目录下的 global.js

const serverip="172.16.63.208"
const host = 'http://' + serverip + '/index/api';
const secret = '035c73f7-bb6b-4889-a715-d9eb2d1925cc';
const baseMediaUrl='ws://' + serverip + '/';
function genApiUrl(method){
    return host+method+"?secret="+secret;
}
export default{
    serverip,
    host,
    secret,
    genApiUrl,
    baseMediaUrl
}

serverip是流媒体服务的IP,如果 ZLMediaKit 的配置文件中 [http] 配置项的端口改成了其它的,也记得在这里加上端口号(不同服务器请配置放开端口哦)。

secret 需要和流媒体服务配置的一样。

baseMediaUrl 是你拉流的url,你可以改成其它的,如 rtsp,rtmp,http。

整个视频请求的流程图

其中流媒体模块指 ZLMediaServer ,接口模块与信令模块指 WVP,视频设备指 IPC、NVR

后记

最后感谢大佬们这么棒的开源项目,谢谢!

标签: sip wvp GB28181 ZLMediaKit MediaServerUI

声明:本博客如无特殊说明皆为原创,转载请注明来源:WVP+ZLMediaKit+MediaServerUI实现摄像头GB28181推流播放录制谢谢!

相关文章

精彩评论
  1. 没心没肺丶 没心没肺丶  Android 11 QQbrowser

    多个页面打开,第4个以后,后面有黑窗口,看不到视频了。

  2. 没心没肺丶 没心没肺丶  Windows 10 x64 Edition Google Chrome 90.0.4430.85

    大佬们,项目启动不了

  3. 不是吧 不是吧  Windows 10 x64 Edition Google Chrome 88.0.4324.182

    请问最后这张图是WVP wiki里面的那张挂掉的视频请求流程图吗?

    1. enna enna  Windows 10 x64 Edition Google Chrome 88.0.4324.182

      是的

  4. chenjm chenjm  Windows 7 x64 Edition Google Chrome 78.0.3904.108

    大家好,请问一下 我的设备注册上了,但是通道列表一直为空,是什么原因呢

  5. chenjm chenjm  Windows 7 x64 Edition Google Chrome 78.0.3904.108

    2021-02-04 22:44:04.008 WARN 12420 --- [ntScannerThread] com.genersoft.iot.vmp.gb28181.SipLayer : 接收到失败的response响应!status:481,message:Call/Transaction Does Not Exist

    请问一下你们有遇到过这个问题吗,设备已经注册上了,但是没有通道信息

  6. kk kk  Windows 10 x64 Edition Google Chrome 88.0.4324.104

    SIP 调用play接口时候,推流失败。抓包显示IPC发BEY消息,不知道是啥原因。求解

  7. qq414215875 qq414215875  Windows 10 x64 Edition Firefox 84.0

    请问wvp项目的eiot数据库哪里有?????

    1. Flicker Flicker  Mac OS X 11.1.0 Google Chrome 87.0.4280.88

      建个库就行了,好像没使用到,设备记录在redis中

  8. Alec Alec  Mac OS X 10.14.6 Google Chrome 86.0.4240.198

    有视频拉流提示 onError | 140211959095536(xxx.xxx.xxx.xxx:port) FLV/TS/FMP4播放器(defaultVhost/rtp/0BEBC30C)断开:end of file,耗时(s):0
    客户端无法播放。

    1. yangcy yangcy  Windows 10 x64 Edition Google Chrome 65.0.3325.181

      同样的问题

  9. Venus_Na Venus_Na  Windows 10 x64 Edition Google Chrome 86.0.4240.193

    请教一下,海康威视平台的控制,我在我本地调用,摄像头却没什么反应,是有什么需要特别注意的地方,或者配置吗?
    可以正常推流,拉流,录屏,回放,就控制不行。
    postman测试地址:
    http://127.0.0.1:8080/api/ptz/34020001001320000001/34020000001320000001?leftRight=1&upDown=0&inOut=0&moveSpeed=50&zoomSpeed=1 icon_exclaim.png

    1. Flicker Flicker  Mac OS X 10.15.7 Google Chrome 86.0.4240.198

      数据放body中POST调用试试呢? icon_razz.png

      1. Flicker Flicker  Mac OS X 10.15.7 Google Chrome 86.0.4240.198

        不好意思,我刚刚看了下,参数是在url上以query的形式传递,如:POST http://localhost:8080/api/ptz/34020000001320000002_34020000001320000008?leftRight=1&upDown=0&inOut=0&moveSpeed=50&zoomSpeed=0

        因为我现在没跟这项目了,我之前测试是可以的,所以可能需要你自己DeBug一下。

        1. Venus_Na Venus_Na  Windows 10 x64 Edition Google Chrome 86.0.4240.193

          大佬,问题解决了,方法没有问题,可能只是因为摄像头注册问题,感谢大佬和这位热心网友的提示,蟹蟹二位的帮助! icon_redface.png

        2. Venus_Na Venus_Na  Windows 10 x64 Edition Google Chrome 86.0.4240.193

          大佬,我好像找着原因了,今天我以下面那名好心人@shayne的方式发送了一下请求,就是用postman,把参数放到format-data,key-value形式用post请求发到后台,然后Debug的时候,我发现终于有错误信息了,是一个SipException,大致意思是说没有连接上摄像头,我尝试ping了一下显示的地址加端口,的确是ping不通的,而且我又以各种方式尝试了几次,发现端口有时候会随机使用,所以我才没办法控制,因为在WVP中在发送完ptzXml中的内容后,会以return true;结束,所以之前我才一直觉得没有啥问题,今天我把return true去掉就有异常了。我再找找看有没有解决方法。 icon_neutral.png

        3. Venus_Na Venus_Na  Windows 10 x64 Edition Google Chrome 86.0.4240.193

          好的,蟹蟹,我再看看,有结果的话,会告诉你的,费心了 icon_wink.png

      2. Venus_Na Venus_Na  Windows 10 x64 Edition Google Chrome 86.0.4240.193

        参数放到请求体中,按照JSON的形式传过去也不行呢。
        出错原因:没有获取到指定参数。
        打印信息:
        java.lang.IllegalStateException: Optional int parameter 'leftRight' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.
        可能是因为spring的原因吧。 icon_cry.png
        其实,我已参数传过去,得到的信息是:success
        但是摄像头却没有对应的动作,让我很纠结。看代码和GB28181的文档,也没有看出来点啥名堂。 icon_sad.png
        可能到瓶颈了。

        1. Venus_Na Venus_Na  Windows 10 x64 Edition Google Chrome 86.0.4240.193

          已,打错字了,不好意思,应该是-->以
          抱歉抱歉 icon_sad.png

          1. shayne shayne  Windows 10 x64 Edition Google Chrome 86.0.4240.111

            format-data,key-value形式

            1. Venus_Na Venus_Na  Windows 10 x64 Edition Google Chrome 86.0.4240.193

              您好,谢谢您的回复。format-data,key-value形式,post请求,也是不行的,其实我觉得不是WVP项目的问题,因为请求的话,我发成功了,到后台的参数也都是我传递过去的参数,一切看起来都很正常,就是摄像头没反应,真的是见鬼了。 icon_sad.png

              1. vicky vicky  Windows 10 x64 Edition Google Chrome 85.0.4183.102

                我也遇到了PTZ云台控制,返回success,但是海康摄像头并没有反应,控制没有生效。url形式、format-data,key-value形式都试过了返回success。去掉return true也没有任何异常抛出,请问大佬最后是如何解决的。

  10. 龙崎 龙崎  Windows 10 x64 Edition Google Chrome 75.0.3770.100

    大神,我这里WVP可以接收到宇视摄像头的数据,但是ZLMediaServer没有反应,视频广场也不显示,但是我用OBS推流是没问题的,看了官方GB28181推流用ffmpeg推流,ZLMediaServer是有推流日志,大神我这个要怎么排查呢

    1. Flicker Flicker  Mac OS X 10.15.7 Google Chrome 86.0.4240.111

      先做ZLMediaServer本地推流测试,排除ZLMediaServer,如果没有问题,看看SIP推流后,ZLMediaKit有没有收到推流日志,如果没有,请检查服务器所需端口是否开放,并检查 wvp 项目的 media 配置是否正确。

      1. 龙崎 龙崎  Windows 10 x64 Edition Google Chrome 75.0.3770.100

        大神,视频广场里出来了,但是打开后,视频狂闪,不出影响啊 icon_cry.png

        1. suny suny  Windows 7 x64 Edition Google Chrome 85.0.4183.83

          去掉播放器组件的live属性,不要去实时获取直播进度,我的也闪去掉就可以了

        2. Flicker Flicker  Mac OS X 10.15.7 Google Chrome 86.0.4240.111

          你的播放地址是什么呢?能贴出来吗?另外你用其它播放器软件打开能播放视频嘛?

          1. 龙崎 龙崎  Windows 10 x64 Edition Google Chrome 75.0.3770.100

            海康威视没问题,就是宇视的不行,宇视的设备信息返回得json{"channelMap": null}

            1. Flicker Flicker  Mac OS X 10.15.7 Google Chrome 86.0.4240.111

              不好意思,我也只使用过海康威视的设备,如果你确定设备连接好了,还是读不出宇视设备的话,你可以到wvp项目github提交issue。 icon_mrgreen.png

      2. 龙崎 龙崎  Windows 10 x64 Edition Google Chrome 75.0.3770.100

        大神,我用postman发送api/play/请求返回成功,但是WVP日志:接收到失败的response响应!status:481,message:Call/Transaction Does Not Exist;这是IPC服务器没有放开端口吗?

发表评论:

icon_question.pngicon_razz.pngicon_sad.pngicon_evil.pngicon_exclaim.pngicon_smile.pngicon_redface.pngicon_biggrin.pngicon_surprised.pngicon_eek.pngicon_confused.pngicon_cool.pngicon_lol.pngicon_mad.pngicon_twisted.pngicon_rolleyes.pngicon_wink.pngicon_idea.pngicon_arrow.pngicon_neutral.pngicon_cry.pngicon_mrgreen.png