wvp-GB28181-pro 编译部署ubuntu

发布时间 2023-05-22 17:16:13作者: 阿风小子

一、前言
第一次进行wvp-pro编译部署遇到不少问题,主要对其中的一些依赖以及配置文件配置不熟悉,特此记录一下整个编译部署流程。本文中编译部署在ubuntu20下进行。建议Ubuntu16版本以上运行此项目。

二、wvp-GB28181-pro介绍
1. 开箱即用的28181协议视频平台
WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的开箱即用的网络视频平台,负责实现核心信令与设备管理后台部分,支持NAT穿透,支持海康、大华、宇视等品牌的IPC、NVR接入。支持国标级联,支持将不带国标功能的摄像机/直播流/直播推流转发到其他国标平台。

流媒体服务基于@夏楚 ZLMediaKit https://github.com/ZLMediaKit/ZLMediaKit
播放器使用@dexter jessibuca https://github.com/langhuihui/jessibuca/tree/v3
前端页面基于@Kyle MediaServerUI https://gitee.com/kkkkk5G/MediaServerUI 进行修改.

2. 应用场景
支持浏览器无插件播放摄像头视频。
支持摄像机、平台、NVR等设备接入。 支持国标级联。
支持rtsp/rtmp等视频流转发到国标平台。
支持rtsp/rtmp等推流转发到国标平台。

3. 部署文档
doc.wvp-pro.cn

三、编译过程
1. 安装依赖
​ apt-get install -y openjdk-11-jre git maven nodejs npm

2. 安装redis
可以参考Redis下载部署配置运行及修改登录地址、端口和密码

apt命令安装

sudo apt update

sudo apt install redis-server

启动redis

redis-server

查看redies是否启动

redis-cli

127.0.0.1是本机IP,也是redis默认的IP地址,6379是redis默认的服务端口。检查redis是否可以ping通,如果输出PONG,则说明启动成功。

3. 安装Mysql,并创建wvp数据库
可以参考ubuntu20.04安装MySQL以及MySQL-workbench可视化工具

安装Mysql

sudo apt-get update #获取最新的软件源

sudo apt-get install mysql-server #安装mysql

配置Mysql

这里本该直接sudo mysql_secure_installation对mysql进行配置,但是密码设置时出现了报错,故这里先设置密码:

sudo mysql

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';

这里'your_password'为你自己设置的密码,由于wvp配置文件中要根据自己的mysql设置来更改,所以这里为了方便直接采用wvp配置文件中的默认密码。

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';

开始配置:

sudo mysql_secure_installation

...
# 1.询问是否安装密码插件,我选择 No
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: n

# 2.为root用户设置密码
Please set the password for root here.

New password: 

Re-enter new password: 

#3.删除匿名用户,我选No
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : n

 ... skipping.

#4.禁止root管理员从远程登录,这里我选 No
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : n

 ... skipping.
 
 #5.删除test数据库并取消对它的访问权限, 我选 No
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : n

 ... skipping.
 
 #6.刷新授权表,让初始化后的设定立即生效, 选 Yes
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done! 



这里由于在之前已经设置过了密码,所以#1,#2在这里直接被输入密码替代

在MySql中创建一个名字为wvp的数据库,并在wvp数据库中执行wvp-GB28181-pro/sql/下的mysql.sql脚本创建表结构

连接mysql数据库,输入密码:

mysql -u root -p

新建一个名字为wvp的数据库:

mysql>CREATE DATABASE wvp;

这里可以用以下命令查看数据库:

mysql>show databases;

使用这个数据库:

mysql>use wvp;

执行数据库脚本(这里首先要git克隆wvp-pro源码):

mysql>source /home/hust_zhang/wvp-GB28181-pro/sql/mysql.sql

mysql>source /home/hust_zhang/wvp-GB28181-pro/sql/update.sql

这里执行update脚本会有报错,但似乎对后续使用没什么影响,可能数据库脚本没有同时更新。

另外似乎也可以用flush privileges;刷新授权,来替代运行update脚本。(这里没有实验过,如果wvp启动报错的话还是继续执行update脚本)

可以使用下面的命令查看当前数据库里面的表

mysql>show tables;

4. 编译ZLMediaKit
可以参考ZLMediaKit Wiki 快速开始,这里只截取Linux操作部分

获取代码

请不要使用github 下载zip包的方式下载源码,务必使用git克隆ZLMediaKit的代码,因为ZLMediaKit依赖于第三方代码,zip包不会下载第三方依赖源码,你可以这样操作:

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

编译器

ZLMediaKit采用了C++11的语法和库,要求编译器支持完整的C++11标准,亦即:

linux上要求gcc 版本 >= 4.8(4.7应该也能支持)

macOS上clang >= ???(我也不知道,估计大部分不会遇到这个问题)

windows 上visual stuido >= 2015(vs2013某些版本也能编译通过,如果怕麻烦建议直接vs2017)

如果你是debian系操作系统(包括ubuntu系用户),一般自带的gcc版本够新,你可以这样安装gcc编译器:

sudo apt-get install build-essential

如果你是centos7或以上用户,你可以这样安装gcc编译器:

sudo yum -y install gcc
sudo yum -y install gcc-c++

如果你是centos6.*用户,你可以这样安装gcc编译器:

sudo yum install centos-release-scl -y
sudo yum install devtoolset-4-toolchain -y
#切换到高版本gcc
scl enable devtoolset-4 bash

camke

ZLMediaKit采用cmake来构建项目,通过cmake才能生成Makefile(或Xcode/VS工程),所以必须先安装cmake才能完成后续步骤。

如果你是debian系操作系统(包括ubuntu系用户),一般自带的cmake版本够新,你可以这样安装cmake

sudo apt-get install cmake

如果你是centos7或以上用户,你也许可以这样安装cmake:

sudo yum -y install cmake
1
如果你是centos6.*用户,那么你需要下载新版本的cmake源码然后编译安装cmake

wget https://github.com/Kitware/CMake/releases/download/v3.17.0-rc3/cmake-3.17.0-rc3.tar.gz
tar -xvf cmake-3.17.0-rc3.tar.gz
cd cmake-3.17.0-rc3
./configure
make -j4
sudo make install

依赖库

ZLMediaKit可选依赖一些第三方库,这些库都不是必选的;在构建ZLMediaKit时,cmake能查找系统路径中的这些库,并根据安装情况选择是否开启相关特性,你可以选择安装这些依赖并启用相关特性:

openssl

flash player在播放rtmp时,采用的是复杂握手模式,如果不安装该库,flash player将播放不了zlmediakit 提供的rtmp url.
同时ZLMediaKit的https/rtsps/webrtc相关功能需要使用openssl才能开启。
ffmpeg

zlmediakit可以通过fork ffmpeg进程的方式实现多种协议的拉流,编译时不需要安装FFmpeg。

sdl、avcodec、avutil

这3个库供ZLMediaKit的test_player测试程序使用,你通常不需要安装这3个库。

Debian系(包括ubuntu)系统下安装依赖的方法:

#除了openssl,其他其实都可以不安装
sudo apt-get install libssl-dev
sudo apt-get install libsdl-dev
sudo apt-get install libavcodec-dev
sudo apt-get install libavutil-dev
sudo apt-get install ffmpeg

构建和编译项目

由于开启webrtc相关功能比较复杂,默认是不开启编译的,如果你对zlmediakit的webrtc功能比较感兴趣,可以参考这里

在linux系统下,你应该这样操作:

cd ZLMediaKit
mkdir build
cd build
cmake ..
make -j4

运行(如果要运行wvp整个项目,这步可以先不执行)

ZLMediaKit工程主要生成3种二进制目标文件,他们的生成的路径在release目录下,这些目标文件主要分为:

MediaServer进程

这是ZLMediaKit作为服务器的主进程,该进程可以在免去开发的情况下直接作为测试流媒体服务器使用,如果你需要更复杂的业务逻辑,可以通过Web HOOK和RESTful API实现,同时你可以通过配置文件控制其参数。

在linux下启动:

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

c api 的SDK

ZLMediaKit也提供c的api二次开发sdk库,头文件在ZLMediaKit/api/include,库文件为:

linux下:

ZLMediaKit/release/linux/Debug/libmk_api.so

SDK头文件有详细的注释,一般足够二次开发使用。

以test_开头的测试程序

相关代码在ZLMediaKit/tests目录下,你可以对照代码启动测试进程。

5. 编译WVP-PRO

可以参考[WVP使用文档](编译 (wvp-pro.cn))

这里建议从github上下载,gitee上维护似乎不是很同步

可以通过git克隆,也可以在项目下载点击下载ZIP

git clone https://github.com/648540858/wvp-GB28181-pro.git

编译前端界面

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

编译如果报错, 一般都是网络问题, 导致的依赖包下载失败
编译完成后在src/main/resources下出现static目录 编译完成一般是这个样子,中间没有报红的错误信息

打包项目, 生成可执行jar

cd wvp-GB28181-pro
mvn package

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

四、 配置运行:
1. 对ZLM和WVP进行配置
ZLM配置
## ZLMediaKit服务目录
cd ZLMediaKit/release/linux/Debug

打开config.ini配置文件,记录下http port和mediaServerId,这里原本的mediaServerId=your_server_id,将其修改为自己的id即可,这里采用的的是wvp配置文件application.yml中默认的id。http port也可以自定义更改。


wvp配置

这里截取了wvp文档doc.wvp-pro.cn中的部分,可保证基础运行,想要其他功能或者想要修改的请仔细阅读文档。

WVP配置文件位置

基于spring boot的开发方式,配置文件的加载是很灵活的。默认在src/main/resources/application.yml,部分配置项是可选,你不需要全部配置在配置文件中, 完全的配置说明可以参看all-application.yml。

默认加载配置文件方式

使用maven打包后的jar包里,已经存在了配置文件,但是每次打开jar包修改配置文件或者修改后再打包都是比较麻烦的,所以大家可通过指定配置文件路径来加载指定位置的配置文件。

cd wvp-GB28181-pro/target
java -jar wvp-pro-*.jar --spring.config.location=../src/main/resources/application.yml

迁移配置文件以方便启动

由于配置文件的命令比较长,所以为了启动方便通常会把配置文件放到jar包的同级目录,类似这样, 移除jar包内/BOOT-INF/classes/下所有以application开头的文件,使用解压缩工具打开jar即可,不需要解压出来。

cd wvp-GB28181-pro/target
mv ../src/main/resources/application-dev.yml application.yml 
java -jar wvp-pro-*.jar 

建议使用这种方式进行启动。

这时候如果按照上述方式启动,会报错,因为还没有修改wvp中的配置文件application.yml。

application.yml修改

这里先列出必须修改的配置:

# 作为28181服务器的配置
sip:
    # [必须修改] 本机的IP
    ip: 192.168.1.3
    
# zlm 默认服务器配置
media:
    # ZLMediaKit的服务ID,必须配置,要与ZLMediaKit/release/linux/Debug/config.ini文件中mediaServerId一致
    id: FQ3TF8yT83wh5Wvz
    # [必须修改] zlm服务器的内网IP,sdp-ip与stream-ip使用默认值的情况下,这里不要使用127.0.0.1/0.0.0.0
    ip: 192.168.1.3
    # [必须修改] zlm服务器的http.port
    http-port: 9080

上述配置修改完,即可运行,其他的配置可以参考文档或者本文从文档截取的部分:

配置服务启动端口(可选的可以使用默认配置)

# [可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口
server:
    port: 18080

配置28181相关信息(可选的可以使用默认配置)

# 作为28181服务器的配置
sip:
    # [必须修改] 本机的IP
    ip: 192.168.1.3
    # [可选] 28181服务监听的端口
    port: 5060
    # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007)
    # 后两位为行业编码,定义参照附录D.3
    # 3701020049标识山东济南历下区 信息行业接入
    # [可选]
    domain: 3402000000
    # [可选]
    id: 34020000002000000001
    # [可选] 默认设备认证密码,后续扩展使用设备单独密码, 移除密码将不进行校验
    password: 12345678

配置ZLMediaKit连接信息

#zlm 默认服务器配置
media:
    # ZLMediaKit的服务ID,必须配置
    id: FQ3TF8yT83wh5Wvz
    # [必须修改] zlm服务器的内网IP,sdp-ip与stream-ip使用默认值的情况下,这里不要使用127.0.0.1/0.0.0.0
    ip: 192.168.1.3
    # [必须修改] zlm服务器的http.port
    http-port: 6080
    # [可选] 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

个性化定制信息配置

# [根据业务需求配置]
user-settings:
    # [可选] 服务ID,不写则为000000
    server-id:
    # [可选] 自动点播, 使用固定流地址进行播放时,如果未点播则自动进行点播, 需要rtp.enable=true
    auto-apply-play: false
    # [可选] 部分设备需要扩展SDP,需要打开此设置
    senior-sdp: false
    # 保存移动位置历史轨迹:true:保留历史数据,false:仅保留最后的位置(默认)
    save-position-history: false
    # 点播等待超时时间,单位:毫秒
    play-timeout: 3000
    # 等待音视频编码信息再返回, true: 可以根据编码选择合适的播放器,false: 可以更快点播
    wait-track: false
    # 是否开启接口鉴权
    interface-authentication: true
    # 自动配置redis 可以过期事件
    redis-config: true
    # 接口鉴权例外的接口, 即不进行接口鉴权的接口,尽量详细书写,尽量不用/**,至少两级目录
    interface-authentication-excludes:
        - /api/v1/**
    # 推流直播是否录制
    record-push-live: true
    # 国标是否录制
    record-sip: true
    # 是否将日志存储进数据库
    logInDatebase: true
    # 第三方匹配,用于从stream钟获取有效信息
    thirdPartyGBIdReg: [\s\S]

如果配置信息无误,你可以启动zlm,再启动wvp来测试了,启动成功的话,你可以在wvp的日志下看到zlm已连接的提示。

2.运行
#启动ZLM
cd ZLMediaKit/release/linux/Debug
#通过-h可以了解启动参数
./MediaServer -h
#以守护进程模式启动
./MediaServer -d &
#如果说没有权限,请加上sudo
sudo ./MediaServer
sudo ./MediaServer -d -m 3 &

#启动WVP
cd wvp-GB28181-pro/target
java -jar wvp-pro-*.jar

成功运行后,在浏览器中打开你的ip地址+WVP监听的HTTP端口(例如:192.168.1.3:18080)即可看到登录界面