文章目錄
- 一、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)
);