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. 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中

  2. 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

      同样的问题

  3. 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

  4. 龙崎 龙崎  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服务器没有放开端口吗?

  5. 月亮上的大象 月亮上的大象  Mac OS X 10.15.5 Google Chrome 86.0.4240.183

    弹出视频预览地址了,无资源内容该如何排除呢

    1. Flicker Flicker  Mac OS X 10.15.7 Google Chrome 86.0.4240.111

      你说的预览地址是指MediaServerUI中的?你可以自己组合出预览地址,使用播放器来播放,如:

      rtmp://177.11.11.111/rtp/061484E1

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

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

  6. cs cs  Windows 10 x64 Edition Google Chrome 86.0.4240.75

    我想问一下,如果我的zlmediakit直接在windows系统下运行,其他配置都没改,那我media的ip是什么啊,不太懂啊

    1. Flicker Flicker  Mac OS X 10.15.7 Google Chrome 86.0.4240.80

      可以填你本地内网IP

  7. 灵异故事 灵异故事  Windows 10 x64 Edition Firefox 79.0

    日常打卡~ 加油-_- icon_exclaim.png

  8. 啊哦额 啊哦额  Windows 10 x64 Edition Google Chrome 85.0.4183.102

    请问以下 如果要推H.265视频编码的应该怎么弄啊 icon_question.png

  9. 啊哦额 啊哦额  Windows 10 x64 Edition Google Chrome 85.0.4183.102

    请问以下 如果要推H.265视频编码的应该怎么弄啊 icon_question.png

  10. leo leo  Windows 10 x64 Edition Google Chrome 86.0.4238.0

    大神牛皮 icon_biggrin.png

发表评论:

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