草庐IT

WVPPro+ZLMediaKit+大华相机推流+安卓模拟GB28181设备推流

fang·up·ad 2023-04-17 原文

wvp pro有三种部署方式

(1)wvp pro jar包+ZLMediaKit。本文主要基于此种方式。

(2)docker hub直接下载docker,其内置了 wvp pro jar+ZLMediaKit。第10小节讲解了此种方式。

(3)docker-compose运行。docker-compose 运行wvp-pro_fang·up·ad的博客-CSDN博客 

1.项目源码

WVP Pro GitHub WVP是一个GB28181平台

ZLMediaKit GitHub

安装参考教程

国标GB28181介绍_嵌入彭于晏的博客-CSDN博客_28181

2. 部署WVP Pro项目

(1)下载WVP Pro源码

git clone https://gitee.com/pan648540858/wvp-GB28181-pro.git

♫)application.yml指定配置文件为application-dev.yml

spring:
  profiles:
    active: dev

♫)配置zlm节点

        application-dev.yml中修改media.http-port为ZLMediaKit的config.ini配置文件http-port属性值一致;修改media.secret和config.ini的genaral.mediaServerId一致(一般情况下,如果删除节点,重新添加节点时才需要修改;如果日志报错zlm节点重复,那么需要删除wvp mysql数据库中media_server表中此节点的zlm配置信息即不会报错)。

        这两个项目只需要配置这两个值。

#zlm 默认服务器配置
media:
    # [必须修改] zlm服务器的内网IP
    ip: 127.0.0.1
    # [必须修改] zlm服务器的http.port
    http-port: 8091
    # [可选] zlm服务器的hook.admin_params=secret
    secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc
    # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试
    rtp:
        # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输
        enable: true
        # [可选] 在此范围内选择端口用于媒体流传输,
        port-range: 30000,30500 # 端口范围
        # [可选] 国标级联在此范围内选择端口发送媒体流,
        send-port-range: 30000,30500 # 端口范围
    # 录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用
    record-assist-port: 18081

 ♫)本项目需要安装 Redis

        安装好redis后,application-dev.yml 配置好redis的密码、ip、port等。

spring:
    # REDIS数据库配置
    redis:
        # [必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1
        host: 127.0.0.1
        # [必须修改] 端口号
        port: 6379
        # [可选] 数据库 DB
        database: 6
        # [可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接
        password: face2020
        # [可选] 超时时间
        timeout: 10000

(2)编译静态页面

cd wvp-GB28181-pro/web_src/
npm --registry=https://registry.npm.taobao.org install
npm run build

编译如果报错, 一般都是网络问题, 导致的依赖包下载失败
编译完成后在src/main/resources下出现static目录。此时打成的jar包包含了web页面,前端可以直接访问。

(3)打包项目, 生成可执行jar

cd wvp-GB28181-pro
mvn package

编译如果报错, 一般都是网络问题, 导致的依赖包下载失败
编译完成后在target目录下出现wvp-pro-x.x-xxxxxxxx.jar

 3.编译ZLMediaKit

        参考官网编译教程

windows下编译

(1)获取代码

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

(2)编译器

        如果你是windows用户,推荐安装vs2017或以上。

(3)下载后使用VS打开ZLMediaKit项目根文件夹,然后CMake点击全部生成即可在文件夹 release/Windows64/Debug下生成MediaServer

(4)运行

1 进入ZLMediaKit/release/windows/Debug目录
2 双击MediaServer启动
3 你也可以在cmd或powershell中启动,通过MediaServer -h了解启动参数

windows下 下载vscode2017 ,勾选C++桌面开发。

        链接:https://pan.baidu.com/s/1cjJCAzXQTPHSWezN6ICtuQ   提取码:1234

下载后使用VS打开ZLMediaKit项目根文件夹,然后CMake点击全部生成即可在文件夹 release/Windows64/Debug下生成MediaServer

4. zlm config.ini和wvp application的配置 

构建好后打开 release/xx/Debug 目录,可以看到有 config.ini 是zlm的配置文件:ZLMediaKit/config.ini at master · ZLMediaKit/ZLMediaKit · GitHub

其中需要特别注意的有:

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

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

(3)config.ini配置文件的general.secret需要和wvp application的media.secret一致;

(4)zlm 的 genaral.mediaServerId 和 wvp 的 media.id一样。 wvp注册时需要判断是否一致。

配置好了就可以运行项目了。application中media就是配置zlm;

5.启动项目

(1)启动ZLM  ZLM必须先启动

(2) 运行WVP

        idea编译项目,生成jar包
        java -jar wvp-pro-*.jar 

        或者

                idea直接运行项目

(3)访问管理页面

http://你的ip:18080

        比如我的部署的服务ip为192.168.1.44, server.port为18080, 那么访问地址为http://192.168.1.44:108080, 会自动跳转到登陆页,默认用户名:admin, 密码:admin

(4)如果访问失败 关掉ZLM、WV 重新启动一下 注意启动顺序

 如果启动MediaServer,缺少libcrypto-1_1-x64.dll以及缺少libssl-1_1-x64.dll。那么下载这两个dll ,然后放在release/Windows64/Debug 目录下,也就是MediaServer同目录下。

链接:https://pan.baidu.com/s/1f9LjIVx7-PbGaQb79zf0hg 
提取码:1234

6.安装FFMPEG,并推流测试

ZLMediaKit推流测试 

FFMPEG

7.相机向WVP项目推送视频 

不同厂商的相机,比如大华、海康、宇视等都有各自平台,难以实现跨平台视频传输。GB28181解决这个问题。WVP就是基于GB28181协议开发。

如下演示大华相机向WVP推送视频,推送到WVP的视频可以被其他平台接收、播放。

(1)WVP配置文件

       application.yml配置sip服务器的相关配置 。wvp项目相当于sip服务器,其他设备向本sip服务器推送数据。

        sip配置可以为127.0.0.1 也可以为本机的局域网ip

(2)相机配置

        图中红框,填写WVP项目配置文件中配置的内容。

        SIP服务器编号对应id;SIP域对应domain;注册密码对应password。

        其余内容可根据需要自行填写。

(3)此时从WVP项目前端页面便可以播放相机视频流

        设备列表--通道--播放

(4)其他平台播放视频,比如VLC

        VLC可以通过资源地址播放视频,修改图中的资源地址ws://192.168.1.15:8091/rtp/0614727C.flvhttp://192.168.1.15:8091/rtp/0614727C.flv即可播放。

 点击播放不播放问题

注意:如果第3步报错 "收流超时,请稍候重试"或点击播放没有响应 ,很大可能是因为ZLM节点有问题。拉流代理会调用ZLM播放拉流地址,故必须保证ZLM节点没有问题。

注意两点,一是wvp pro 的application-dev.yml 配置文件中的ip需要配置为内网地址,二是application-dev.yml中media.http-port和ZLMediaKit的http-port属性值需要一样,默认是一样的。

(1)vlc 或 ffplay 播放拉流地址,看能否正常播放。 拉流地址前后不能有空格。尽量部署最新版本wvp pro,旧版本存在一些bug,在不断完善。

(2)如下 wvp pro 的application-dev.yml 配置文件中的ip地址需要为内网ip地址。

 (3)节点是否配置正确

        web页面 节点管理 --  编辑。

        节点就是配置zlm播放相关的一些项。

        下面的IP、HOOK IP可以为127.0.0.1。但HTTP端口需要和application配置的http-port一样。 application-dev.yml中media.http-port和ZLMediaKit配置文件config.ini的http-port属性值必须相同。参考第三小节。

        SDP IP、流IP必须为公网IP或内网IP,不能是127.0.0.1。docker-compose 就是配置.env文件的SIP_IP以及STREAM_HOST为服务器外网IP地址即可。

         如果port不一样,需要添加节点。如下,测试通过就添加成功。 

 

下面是docker-compose设置节点。通过.env文件查看port,ip设置为127.0.0.1即可。

      注意:

          如果部署wvp pro 主机修改了ip, 需要重新编辑ZLM节点。否则播放无响应。

 8.安卓手机模拟支持GB28181协议的设备推流到平台

(1)下载GB28281前端采集模拟软件 GbtDevice  

       官网: 行业音视频解决方案专家 - 武汉视跃科技有限公司 官网查找 GBT28181音视频前端设备软件

        此程序的安卓开发参考文档:用android实现GB28181的视音频前端设备_wangjie_jack的专栏-CSDN博客_gb28181 安卓

(2)安卓手机安装GbtDevice后,填写WVP配置文件对应项

        国标服务器IP对应WVP项目部署在的电脑IP;服务器通信端口对应 配置文件中sip.port;服务器ID对应配置文件中sip.id;用户ID唯一标识,任意;用户密码对应sip.password。

 

(3)点击注册 然后点击开始录像

        此时在WVP前端页面上,可以通过设备列表---通道--播放 查看上传的视频流。

        如果此时通道页没有数据,可以在设备列表页,点击刷新重新连接设备。

         如果报错 "收流超时,请稍候重试",请参考第6小节解决办法。

 

9.wvp级联到其他gb28181平台

 (1)配置上级级联平台

        国际级联--添加,设置上级支持gb28181协议的平台的sip配置信息。

 

(2)设备推流或者拉流下级wvp项目的视频流

        本wvp项目可以接受设备推流,可以接受另外的wvp项目推流。

        推流走Gb28181协议的视频流,连接列表显示在设备列表,比如本wvp项目从下级wvp项目拉流、GbtDevice上传流,;如果相机推数据、或者rtmp推流等到本wvp,显示在推流列表;如果从其他视频流拉流,显示在拉流代理。

        其他设备推流上来,相当于生成了一个视频流通道。

(3)通道和级联平台关联

        国际级联---选择通道,将平台和视频通道关联,此时视频便会推数据到上级级联平台上。

10.拉流代理

(1)填写拉流地址,可以是rtmp等流媒体。主要是拉流地址、应用名、流ID,其余参数默认即可 

 (2)点击播放即可播放

11.离线docker部署WVP

(0)安装docker 01 docker概述_fang.lovest.yang的博客-CSDN博客

(1)互联网拉取wvp

        能够访问互联网的docker宿主机,从docker hub拉取wvp;或者如果已经下载了wvp项目的docker 直接导出wvp的tar包。如果已经有了wvp的tar包,可以直接看第3步。

docker pull 648540858/wvp_pro

docker run  --env WVP_IP="你的IP" -it -p 18080:18080 -p 30000-30500:30000-30500/udp -p 30000-30500:30000-30500/tcp -p 80:80 -p 5060:5060 -p 5060:5060/udp 648540858/wvp_pro

(2)互联网宿主机导出wvp项目

        使用镜像id导出。会直接保存在当前宿主机的当前目录下。

docker save 0fdf2b4c26d3 > hangge_server.tar

        ps:如下命令将宿主机文件复制到docker指定目录下 如果参数交换位置,就实现了从docker里面向docker宿主机cp文件。【application.yml中sip的id 、password会读取环境变量值WVP_ID WVP_PWD,如果没有设置,会默认取值。环境变量值可以通过启动命令指定 --env key=value或-e key=value】

docker cp /home/toy/wvp/application.yml c3b:/opt/wvp/config/application.yml

(3)离线宿主机的docker导入wvp

docker load < wvp.tar

     wvp的tar包百度云链接:https://pan.baidu.com/s/1DNlDoZRn4UM5EjB2_e7ztg  提取码:1234 

ps. Centos7启动docker 

systemctl start docker

(4)新建并进入docker容器

docker run  --env WVP_IP="你的IP" -it -p 18080:18080 -p 30000-30500:30000-30500/udp -p 30000-30500:30000-30500/tcp -p 80:80 -p 5060:5060 -p 5060:5060/udp 648540858/wvp_pro

使用的端口

端口描述类型
80zlm的http端口tcp
554zlm的rtsp端口,非必须tcp&udp
1935zlm的rtmp端口,非必须tcp
506028181sip信令端口tcp&udp
6379redis端口,非必须tcp
18080wvp的http端口tcp
18081录像管理服务端口,非必须tcp
30000-30500zlm接收视频推流端口tcp&udp

ps:

        进入docker容器

docker exec -it 43f /bin/bash

        修改配置文件:如果docker里面没有vi软件,可以linux下vi修改,然后docker cp复制进docker容器,然后重启容器即可。

12.遇见问题

部署后,web页面无法访问

(1)查看指定端口是否开启

  • lsof -i:18082 或者netstat -antp | grep 18082 发现开启
  • 其他电脑远程访问测试端口是否可通
1)windows上一般用telnet

    如telnet ip port

2)linux上可以用telnet,跟windows一样 telnet ip port

3)也可以用wget:如:wget ip:port

4)ssh:如ssh -v -p port username@ip  -v代表打开调试模式,username可随意指定

(2)本机发现端口开启,但是远程访问端口不通。为什么?

        可以试下是否使用localhost可以访问,是的话,如果是部署在阿里云等云服务器上,一般是因为其本身的安全策略引起,需要登录云服务器管理页面,开启此接口。

虚拟机安装wvp-pro,报如下三种错 

​
(1)Resource temporarily unavailable  


(2)Error starting userland proxy:.
​

(3)iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 80 -j DNAT ...

解决:虚拟机分配内存1G,太小。修改为3G就可以解决问题。网上的其他解决方案,比如重建docker0网络恢复等无效。

有关WVPPro+ZLMediaKit+大华相机推流+安卓模拟GB28181设备推流的更多相关文章

  1. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  2. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  3. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  4. ruby-on-rails - 在这种情况下我如何模拟一个对象?没有明显的方法可以用模拟替换对象 - 2

    假设我在Store的模型中有这个非常简单的方法:defgeocode_addressloc=Store.geocode(address)self.lat=loc.latself.lng=loc.lngend如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。谢谢!特里斯坦 最佳答案 使用内置模拟和stub的rspecs,你可以做这样的事情:setupdo@subject=MyCl

  5. ruby - "public/protected/private"方法是如何实现的,我该如何模拟它? - 2

    在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定

  6. ruby - 在 RSpec 中 stub /模拟全局常量 - 2

    我有一个gem,它有一个根据Rails.env的不同行为的方法:defself.envifdefined?(Rails)Rails.envelsif...现在我想编写一个规范来测试这个代码路径。目前我是这样做的:Kernel.const_set(:Rails,nil)Rails.should_receive(:env).and_return('production')...没关系,只是感觉很丑。另一种方法是在spec_helper中声明:moduleRails;end而且效果也很好。但也许有更好的方法?理想情况下,这应该有效:rails=double('Rails')rails.sho

  7. ruby-on-rails - 如何将大于 5GB 的文件上传到 Amazon S3? - 2

    我目前正在使用带有Carrierwavegem的Rails3.2将文件上传到AmazonS3。现在我需要能够处理用户提交的大于5GB的文件,同时仍然使用Carrierwavegem。Carrierwave或Fog是否有任何其他gem或分支可以处理5GB以上的文件上传到S3?编辑:我不想重写一个完整的Rails上传解决方案,所以像这样的链接没有帮助:https://gist.github.com/908875. 最佳答案 我想出了如何做到这一点,并且现在可以正常工作了。在正确的config/environment文件中,添加以下内容以

  8. ruby-on-rails - rspec 模拟对象属性赋值 - 2

    我有一个rspec模拟对象,一个值赋给了属性。我正在努力在我的rspec测试中满足这种期望。只是想知道语法是什么?代码:defcreate@new_campaign=AdCampaign.new(params[:new_campaign])@new_campaign.creationDate="#{Time.now.year}/#{Time.now.mon}/#{Time.now.day}"if@new_campaign.saveflash[:status]="Success"elseflash[:status]="Failed"endend测试it"shouldabletocreat

  9. ruby - 如何使用 rspec stub /模拟对命令行的调用? - 2

    我正在尝试测试命令行工具的输出。如何使用rspec来“伪造”命令行调用?执行以下操作不起作用:it"shouldcallthecommandlineandreturn'text'"do@p=Pig.new@p.should_receive(:run).with('my_command_line_tool_call').and_return('resulttext')end如何创建stub? 最佳答案 使用newmessageexpectationsyntax:规范/虚拟规范.rbrequire"dummy"describeDummy

  10. ruby - 接收 block 作为参数的模拟方法 - 2

    我有一个或多或少这样的场景classAdefinitialize(&block)b=B.new(&block)endend我正在对A类进行单元测试,我想知道B#new是否正在接收传递给A#new的block。我使用Mocha作为模拟框架。这可能吗? 最佳答案 我用Mocha和RSpec都试过了,虽然我可以通过测试,但行为不正确。从我的实验中,我得出结论,验证block是否已通过是不可能的。问题:为什么要传递一个block作为参数?block将用于什么目的?什么时候调用?也许这确实是您应该用类似的东西测试的行为:classBlockP

随机推荐