文章目录
- 一、DEV_WVP流媒体开发手册
- 1、搭建流媒体服务
- clone代码:
- 安装编译器
- cmake
- 构建和编译项目
- 修改配置文件
- 启动项目
- 2、搭建GB28181协议视频平台
- 安装 jdk, nodejs, maven, git
- 安装redis
- 安装postgresql
- clone代码
- 编译前端代码
- 编译后端代码
- 配置文件修改
- 3、设备接入测测试
- EasyGBD
- OBS推流
- 4、附录
- sql
一、DEV_WVP流媒体开发手册
1、搭建流媒体服务
clone代码:
- 请不要使用github 下载zip包的方式下载源码,务必使用git克隆ZLMediaKit的代码,因为ZLMediaKit依赖于第三方代码,zip包不会下载第三方依赖源码,你可以这样操作、
git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit
cd ZLMediaKit
git submodule update --init #务必执行
安装编译器
sudo apt update
sudo apt install -y build-essential
说明:
build-essential
包含了gcc
、g++
、make
等常用开发工具,适用于大多数编译需求。- 不需要单独安装
gcc
和g++
,除非你有特殊版本要求。
cmake
- ZLMediaKit采用cmake来构建项目,通过cmake才能生成Makefile(或Xcode/VS工程),所以必须先安装cmake才能完成后续步骤。
sudo apt update
sudo apt install -y cmake
构建和编译项目
cd ZLMediaKit
mkdir build
cd build
cmake ..
make
修改配置文件
config.ini
cd ZLMediaKit/release/linux/Debug
配置文件相关修改
- secret
- mediaServerId
- 端口修改
启动项目
cd ZLMediaKit/release/linux/Debug
#通过-h可以了解启动参数
./MediaServer -h
#以守护进程模式启动
nohup ./MediaServer -d -m 3 &
启动成功如下
2、搭建GB28181协议视频平台
WVP-GB28181-PRO
安装 jdk, nodejs, maven, git
sudo apt update
sudo apt install -y openjdk-8-jdk git maven nodejs npm
项目需要nodejs版本≥16
安装redis
使用 Docker CLI:
docker pull redis:6.2
启动 Redis 容器
docker run -d \--name redis \--restart unless-stopped \-p 6379:6379 \redis:6.2
参数说明:
参数 | 说明 |
---|---|
-d | 后台运行 |
--name redis | 容器名称为 redis |
--restart unless-stopped | 开机自动启动,除非手动停止 |
-p 6379:6379 | 将主机的 6379 端口映射到容器内 Redis 默认端口 |
redis:6.2 | 指定镜像和版本 |
安装postgresql
使用 Docker CLI:
docker pull postgis/postgis:14-3.3
启动 postgresql 容器
ocker run --name postgres -d \--restart unless-stopped \-p 55432:5432 \-v ./pg/data:/var/lib/postgresql/data \-v ./backup:/backup \-e POSTGRES_PASSWORD=postgres \-e POSTGRES_USER=postgres \-e POSTGRES_DB=postgres \postgis/postgis:14-3.3
参数说明:
参数 | 说明 |
---|---|
--name postgres | 设置容器名称为 postgres ,方便管理(如 docker stop postgres ) |
-d | 以后台方式运行容器 |
--restart unless-stopped | 开机自动启动容器,除非你手动停止过它 |
-p 55432:5432 | 将主机的 55432 端口映射到容器的 PostgreSQL 默认端口 5432 (避免和主机已有 PostgreSQL 冲突) |
-v ./pg/data:/var/lib/postgresql/data | 将 PostgreSQL 数据文件映射到本地 ./pg/data ,实现数据持久化 |
-v ./backup:/backup | 将容器中的 /backup 目录映射到主机的 ./backup ,用于备份数据库 |
-e POSTGRES_PASSWORD=postgres | 设置 PostgreSQL 的 postgres 用户密码为 postgres |
-e POSTGRES_USER=postgres | 设置初始化用户名为 postgres |
-e POSTGRES_DB=postgres | 设置初始化数据库名称为 postgres |
postgis/postgis:14-3.3 | 使用带有 PostGIS 扩展的 PostgreSQL 14 镜像,PostGIS 版本为 3.3 |
创建数据库名为wvp273
插入数据SQL
clone代码
git clone https://github.com/648540858/wvp-GB28181-pro.git
如果无法拉取镜像,请手动下载 ZIP 包并放置到指定目录下。
编译前端代码
cd wvp-GB28181-pro/web/
npm --registry=https://registry.npmmirror.com install
npm run build:prod
项目需要nodejs版本≥16
编译后端代码
cd wvp-GB28181-pro
mvn package
如需使用war部署
# 如需使用war部署
cd wvp-GB28181-pro
mvn package -P war
配置文件修改
cd wvp-GB28181-pro/target
# 移动配置文件到当前 target目录下
mv ../src/main/resources/application-dev.yml application.yml
编辑application.yml
启动
nohup java -jar wvp-pro-*.jar &
3、设备接入测测试
默认使用以下地址访问 WVP 管理界面:
http://192.168.0.44:18080/
默认账号:
admin
默认密码:admin
EasyGBD
通过 EasyGBD 工具可快速模拟或注册 GB28181 设备。
成功录入设备示例:
OBS推流
推流到 ZLMediaKit(ZLM)时,请务必设置正确的应用名和鉴权信息,否则视频流将无法播放。
OBS 推流地址:
-
服务器(Server):
rtmp://192.168.0.44:1935/live
-
串流密钥(Stream Key):
live?sign=41db35390ddad33f83944f44b8b75ded
这样 ZLM 会注册为:
- 应用名:
live
- 流名:
live
当前的 sign
是从 wvp_user
表中 push_key
字段的值生成的,方式是对该值进行 MD5 加密,结果是:41db35390ddad33f83944f44b8b75ded
。
推流成功后,你可以在管理界面中查看流状态:
4、附录
sql
/*建表*/
drop table IF EXISTS wvp_device;
create table IF NOT EXISTS wvp_device
(id serial primary key,device_id character varying(50) not null,name character varying(255),manufacturer character varying(255),model character varying(255),firmware character varying(255),transport character varying(50),stream_mode character varying(50),on_line bool default false,register_time character varying(50),keepalive_time character varying(50),ip character varying(50),create_time character varying(50),update_time character varying(50),port integer,expires integer,subscribe_cycle_for_catalog integer DEFAULT 0,subscribe_cycle_for_mobile_position integer DEFAULT 0,mobile_position_submission_interval integer DEFAULT 5,subscribe_cycle_for_alarm integer DEFAULT 0,host_address character varying(50),charset character varying(50),ssrc_check bool default false,geo_coord_sys character varying(50),media_server_id character varying(50) default 'auto',custom_name character varying(255),sdp_ip character varying(50),local_ip character varying(50),password character varying(255),as_message_channel bool default false,heart_beat_interval integer,heart_beat_count integer,position_capability integer,broadcast_push_after_ack bool default false,server_id character varying(50),constraint uk_device_device unique (device_id)
);drop table IF EXISTS wvp_device_alarm;
create table IF NOT EXISTS wvp_device_alarm
(id serial primary key,device_id character varying(50) not null,channel_id character varying(50) not null,alarm_priority character varying(50),alarm_method character varying(50),alarm_time character varying(50),alarm_description character varying(255),longitude double precision,latitude double precision,alarm_type character varying(50),create_time character varying(50) not null
);drop table IF EXISTS wvp_device_mobile_position;
create table IF NOT EXISTS wvp_device_mobile_position
(id serial primary key,device_id character varying(50) not null,channel_id character varying(50) not null,device_name character varying(255),time character varying(50),longitude double precision,latitude double precision,altitude double precision,speed double precision,direction double precision,report_source character varying(50),create_time character varying(50)
);drop table IF EXISTS wvp_device_channel;
create table IF NOT EXISTS wvp_device_channel
(id serial primary key,device_id character varying(50),name character varying(255),manufacturer character varying(50),model character varying(50),owner character varying(50),civil_code character varying(50),block character varying(50),address character varying(50),parental integer,parent_id character varying(50),safety_way integer,register_way integer,cert_num character varying(50),certifiable integer,err_code integer,end_time character varying(50),secrecy integer,ip_address character varying(50),port integer,password character varying(255),status character varying(50),longitude double precision,latitude double precision,ptz_type integer,position_type integer,room_type integer,use_type integer,supply_light_type integer,direction_type integer,resolution character varying(255),business_group_id character varying(255),download_speed character varying(255),svc_space_support_mod integer,svc_time_support_mode integer,create_time character varying(50) not null,update_time character varying(50) not null,sub_count integer,stream_id character varying(255),has_audio bool default false,gps_time character varying(50),stream_identification character varying(50),channel_type int default 0 not null,gb_device_id character varying(50),gb_name character varying(255),gb_manufacturer character varying(255),gb_model character varying(255),gb_owner character varying(255),gb_civil_code character varying(255),gb_block character varying(255),gb_address character varying(255),gb_parental integer,gb_parent_id character varying(255),gb_safety_way integer,gb_register_way integer,gb_cert_num character varying(50),gb_certifiable integer,gb_err_code integer,gb_end_time character varying(50),gb_secrecy integer,gb_ip_address character varying(50),gb_port integer,gb_password character varying(50),gb_status character varying(50),gb_longitude double precision,gb_latitude double precision,gb_business_group_id character varying(50),gb_ptz_type integer,gb_position_type integer,gb_room_type integer,gb_use_type integer,gb_supply_light_type integer,gb_direction_type integer,gb_resolution character varying(255),gb_download_speed character varying(255),gb_svc_space_support_mod integer,gb_svc_time_support_mode integer,record_plan_id integer,data_type integer not null,data_device_id integer not null,gps_speed double precision,gps_altitude double precision,gps_direction double precision,constraint uk_wvp_unique_channel unique (gb_device_id)
);CREATE INDEX idx_data_type ON wvp_device_channel (data_type);
CREATE INDEX idx_data_device_id ON wvp_device_channel (data_device_id);drop table IF EXISTS wvp_media_server;
create table IF NOT EXISTS wvp_media_server
(id character varying(255) primary key,ip character varying(50),hook_ip character varying(50),sdp_ip character varying(50),stream_ip character varying(50),http_port integer,http_ssl_port integer,rtmp_port integer,rtmp_ssl_port integer,rtp_proxy_port integer,rtsp_port integer,rtsp_ssl_port integer,flv_port integer,flv_ssl_port integer,ws_flv_port integer,ws_flv_ssl_port integer,auto_config bool default false,secret character varying(50),type character varying(50) default 'zlm',rtp_enable bool default false,rtp_port_range character varying(50),send_rtp_port_range character varying(50),record_assist_port integer,default_server bool default false,create_time character varying(50),update_time character varying(50),hook_alive_interval integer,record_path character varying(255),record_day integer default 7,transcode_suffix character varying(255),server_id character varying(50),constraint uk_media_server_unique_ip_http_port unique (ip, http_port, server_id)
);drop table IF EXISTS wvp_platform;
create table IF NOT EXISTS wvp_platform
(id serial primary key,enable bool default false,name character varying(255),server_gb_id character varying(50),server_gb_domain character varying(50),server_ip character varying(50),server_port integer,device_gb_id character varying(50),device_ip character varying(50),device_port character varying(50),username character varying(255),password character varying(50),expires character varying(50),keep_timeout character varying(50),transport character varying(50),civil_code character varying(50),manufacturer character varying(255),model character varying(255),address character varying(255),character_set character varying(50),ptz bool default false,rtcp bool default false,status bool default false,catalog_group integer,register_way integer,secrecy integer,create_time character varying(50),update_time character varying(50),as_message_channel bool default false,catalog_with_platform integer default 1,catalog_with_group integer default 1,catalog_with_region integer default 1,auto_push_channel bool default true,send_stream_ip character varying(50),server_id character varying(50),constraint uk_platform_unique_server_gb_id unique (server_gb_id)
);drop table IF EXISTS wvp_platform_channel;
create table IF NOT EXISTS wvp_platform_channel
(id serial primary key,platform_id integer,device_channel_id integer,custom_device_id character varying(50),custom_name character varying(255),custom_manufacturer character varying(50),custom_model character varying(50),custom_owner character varying(50),custom_civil_code character varying(50),custom_block character varying(50),custom_address character varying(50),custom_parental integer,custom_parent_id character varying(50),custom_safety_way integer,custom_register_way integer,custom_cert_num character varying(50),custom_certifiable integer,custom_err_code integer,custom_end_time character varying(50),custom_secrecy integer,custom_ip_address character varying(50),custom_port integer,custom_password character varying(255),custom_status character varying(50),custom_longitude double precision,custom_latitude double precision,custom_ptz_type integer,custom_position_type integer,custom_room_type integer,custom_use_type integer,custom_supply_light_type integer,custom_direction_type integer,custom_resolution character varying(255),custom_business_group_id character varying(255),custom_download_speed character varying(255),custom_svc_space_support_mod integer,custom_svc_time_support_mode integer,constraint uk_platform_gb_channel_platform_id_catalog_id_device_channel_id unique (platform_id, device_channel_id),constraint uk_platform_gb_channel_device_id unique (custom_device_id)
);drop table IF EXISTS wvp_platform_group;
create table IF NOT EXISTS wvp_platform_group
(id serial primary key,platform_id integer,group_id integer,constraint uk_wvp_platform_group_platform_id_group_id unique (platform_id, group_id)
);drop table IF EXISTS wvp_platform_region;
create table IF NOT EXISTS wvp_platform_region
(id serial primary key,platform_id integer,region_id integer,constraint uk_wvp_platform_region_platform_id_group_id unique (platform_id, region_id)
);drop table IF EXISTS wvp_stream_proxy;
create table IF NOT EXISTS wvp_stream_proxy
(id serial primary key,type character varying(50),app character varying(255),stream character varying(255),src_url character varying(255),timeout integer,ffmpeg_cmd_key character varying(255),rtsp_type character varying(50),media_server_id character varying(50),enable_audio bool default false,enable_mp4 bool default false,pulling bool default false,enable bool default false,enable_remove_none_reader bool default false,create_time character varying(50),name character varying(255),update_time character varying(50),stream_key character varying(255),server_id character varying(50),enable_disable_none_reader bool default false,relates_media_server_id character varying(50),constraint uk_stream_proxy_app_stream unique (app, stream)
);drop table IF EXISTS wvp_stream_push;
create table IF NOT EXISTS wvp_stream_push
(id serial primary key,app character varying(255),stream character varying(255),create_time character varying(50),media_server_id character varying(50),server_id character varying(50),push_time character varying(50),status bool default false,update_time character varying(50),pushing bool default false,self bool default false,start_offline_push bool default true,constraint uk_stream_push_app_stream unique (app, stream)
);drop table IF EXISTS wvp_cloud_record;
create table IF NOT EXISTS wvp_cloud_record
(id serial primary key,app character varying(255),stream character varying(255),call_id character varying(255),start_time int8,end_time int8,media_server_id character varying(50),server_id character varying(50),file_name character varying(255),folder character varying(500),file_path character varying(500),collect bool default false,file_size int8,time_len double precision
);drop table IF EXISTS wvp_user;
create table IF NOT EXISTS wvp_user
(id serial primary key,username character varying(255),password character varying(255),role_id integer,create_time character varying(50),update_time character varying(50),push_key character varying(50),constraint uk_user_username unique (username)
);drop table IF EXISTS wvp_user_role;
create table IF NOT EXISTS wvp_user_role
(id serial primary key,name character varying(50),authority character varying(50),create_time character varying(50),update_time character varying(50)
);drop table IF EXISTS wvp_user_api_key;
create table IF NOT EXISTS wvp_user_api_key
(id serial primary key,user_id int8,app character varying(255),api_key text,expired_at int8,remark character varying(255),enable bool default true,create_time character varying(50),update_time character varying(50)
);/*初始数据*/
INSERT INTO wvp_user
VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 1, '2021-04-13 14:14:57', '2021-04-13 14:14:57','3e80d1762a324d5b0ff636e0bd16f1e3');
INSERT INTO wvp_user_role
VALUES (1, 'admin', '0', '2021-04-13 14:14:57', '2021-04-13 14:14:57');drop table IF EXISTS wvp_common_group;
create table IF NOT EXISTS wvp_common_group
(id serial primary key,device_id varchar(50) NOT NULL,name varchar(255) NOT NULL,parent_id int,parent_device_id varchar(50) DEFAULT NULL,business_group varchar(50) NOT NULL,create_time varchar(50) NOT NULL,update_time varchar(50) NOT NULL,civil_code varchar(50) default null,constraint uk_common_group_device_platform unique (device_id)
);drop table IF EXISTS wvp_common_region;
create table IF NOT EXISTS wvp_common_region
(id serial primary key,device_id varchar(50) NOT NULL,name varchar(255) NOT NULL,parent_id int,parent_device_id varchar(50) DEFAULT NULL,create_time varchar(50) NOT NULL,update_time varchar(50) NOT NULL,constraint uk_common_region_device_id unique (device_id)
);drop table IF EXISTS wvp_record_plan;
create table IF NOT EXISTS wvp_record_plan
(id serial primary key,snap bool default false,name varchar(255) NOT NULL,create_time character varying(50),update_time character varying(50)
);drop table IF EXISTS wvp_record_plan_item;
create table IF NOT EXISTS wvp_record_plan_item
(id serial primary key,"start" int,stop int,week_day int,plan_id int,create_time character varying(50),update_time character varying(50)
);