技术分享| WVP+ZLMediaKit实现摄像头GB28181推流播放
介绍
WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的开箱即用的网络视频平台,负责实现核心信令与设备管理后台部分,支持NAT穿透,支持海康、大华、宇视等品牌的IPC、NVR接入。支持国标级联,支持将不带国标功能的摄像机/直播流/直播推流转发到其他国标平台。
应用场景
· 支持浏览器无插件播放摄像头视频。
· 支持摄像机、平台、NVR等设备接入。 支持国标级联。
· 支持rtsp/rtmp等视频流转发到国标平台。
· 支持rtsp/rtmp等推流转发到国标平台。
服务部署
ZLMediaKit部署
下载地址: git clone —depth 1 https://gitee.com/xia-chu/ZLMediaKit
1. ## 准备环境
2. [root@localhost artc]# yum install -y epel-release
3.
4. ## gcc和yasm需要高版本 小编用的是gcc4.8.5 yasm1.2.0
5. [root@localhost artc]# yum -y install yasm gcc*
6. [root@localhost artc]# yum -y install openssl-devel SDL-devel
7.
8. ## 编译安装cmake 3.8.2
9. [root@localhost ~]# cd /home/artc
10. [root@localhost artc]# wget https://cmake.org/files/v3.8/cmake-3.8.2.tar.gz
11. [root@localhost artc]# tar zxvf cmake-3.8.2.tar.gz
12. [root@localhost artc]# cd cmake-3.8.2
13. [root@localhost cmake-3.8.2]# ./bootstrap
14. [root@localhost cmake-3.8.2]# gmake
15. [root@localhost cmake-3.8.2]# gmake install
16.
17. ## 国内库比较快
18. [root@localhost ~]# cd /usr/local/
19. [root@localhost local]# git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit
20. [root@localhost local]# cd ZLMediaKit
21. #千万不要忘记执行这句命令
22. [root@localhost ZLMediaKit]# git submodule update --init
23.
24. ## 编译安装
25. [root@localhost ZLMediaKit]# mkdir build
26. [root@localhost ZLMediaKit]# cmake .
27. [root@localhost ZLMediaKit]# make -j4
28.
29. ## ZLMediaKit服务目录
30. [root@localhost ZLMediaKit]# cd release/linux/Debug
配置文件
[root@localhost Debug]# vim config.ini
1. [general]
2. mediaServerId=12345678 ##后面和WVP-PRO对接
3.
4. [hook]
5. admin_params=secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc ##后面和WVP-PRO对接
1. ## 程序启动
2. [root@localhost Debug]# ./MediaServer ## 前台启动
3. [root@localhost Debug]# ./MediaServer -d & ## 后台启动
4.
5. ## 软连接
6. [root@localhost Debug]# ln -sf /home/ZLMediaKit/release/linux/Debug/MediaServer /usr/bin/
WVP-PRO部署
项目运行依赖redis、jdk1.8,打包依赖git、maven、nodejs、npm。
Redis部署
1. ## 下载epel仓库
2. [root@localhost ~]# yum install epel-release -y
3.
4. ## 下载redis数据库
5. [root@localhost ~]# yum install redis -y
6.
7. ## 启动redis和设置开启自启动
8. [root@localhost ~]# systemctl start redis
9. [root@localhost ~]# systemctl enable redis
1. ## 设置redis 远程连接和密码 (如果都在同一台机器上 不用这一步)
2. [root@localhost ~]# vim /etc/redis.conf
3. 注释 #bind 127.0.0.1
4. 修改 protected-mode no
5. 修改 daemonize yes
6. 修改 requirepass 123456
7.
8. ## 关闭防火墙或者开放6379端口
9. [root@localhost ~]# systemctl stop firewalld //关闭防火墙
10. [root@localhost ~]# firewall-cmd --zone=public --add-port=6379/tcp --permanent //开放端口
11. [root@localhost ~]# firewall-cmd --reload //开放端口后 需要更新一下
12.
13. ## 重启redis
14. [root@localhost ~]# systemctl restart redis
MySQL部署
1. [root@localhost ~]# yum -y install mariadb mariadb-server
2. [root@localhost ~]# systemctl enable mariadb
3. [root@localhost ~]# systemctl start mariadb
4. [root@localhost ~]# mysql -uroot
5. mysql> set password = password('123456');
6. mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; //设置mysql外网连接密码
7. mysql> flush privileges;
JDK部署
1. [root@localhost ~]# tar zxvf jdk-8u121-linux-x64.tar.gz
2. [root@localhost ~]# mv jdk1.8.0_121/ /usr/local/jdk
3. [root@localhost ~]# vim /etc/profile
4. ##末尾添加
5. export JAVA_HOME=/usr/local/jdk
6. export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/
7. export PATH=$PATH:$JAVA_HOME/bin
1. [root@localhost ~]# source /etc/profile
2. [root@localhost ~]# java -version
3. java version "1.8.0_121"
4. Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
5. Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
Maven部署
1. [root@localhost ~]# tar zxvf apache-maven-3.5.0-bin.tar.gz
2. [root@localhost ~]# mv apache-maven-3.5.0 /usr/local/maven
3. [root@localhost ~]# vim /etc/profile
4. ##末尾添加
5. export MAVEN_HOME=/usr/local/maven
6. export PATH=$MAVEN_HOME/bin:$PATH
1. [root@localhost ~]# source /etc/profile
2. [root@localhost ~]# mvn -version
3. Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-04T03:39:06+08:00)
4. Maven home: /usr/local/maven
编译WVP-PRO
1. ## 安装依赖
2. [root@localhost ~]# yum -y install git nodejs npm
3.
4. ## 下载源码
5. [root@localhost ~]# cd /usr/local
6. [root@localhost local]# git clone https://gitee.com/pan648540858/wvp-GB28181-pro.git
7.
8. ## 编译静态页面
9. [root@localhost ~]# cd /usr/local/wvp-GB28181-pro/web_src/
10. [root@localhost web_src]# npm --registry=https://registry.npm.taobao.org install
11. [root@localhost web_src]# npm run build
12.
13. ## 打包项目, 生成可执行jar
14. [root@localhost web_src]# cd ..
15. [root@localhost wvp-GB28181-pro]# mvn package
16.
17. ## 编译完成后在target目录下出现wvp-pro-x.x-xxxxxxxx.jar
1. ## 导入MySQL文件
2. [root@localhost ~]# cd /usr/local/wvp-GB28181-pro/sql
3. [root@localhost sql]# mysql -uroot -p123456
4. MariaDB [(none)]> create database wvp;
5. MariaDB [(none)]> use wvp;
6. MariaDB [(none)]> source mysql.sql ## 可能会出现字节错误 将mysql.sql里面的255字节修改小点
1. ## 配置文件修改
2. [root@localhost wvp-GB28181-pro]# mv src/main/resources/application-dev.yml target/application.yml
3. [root@localhost wvp-GB28181-pro]# vim target/application.yml
1. spring:
2. # [可选]上传文件大小限制
3. servlet:
4. multipart:
5. max-file-size: 10MB
6. max-request-size: 100MB
7. # REDIS数据库配置
8. redis:
9. # [必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1
10. host: 127.0.0.1
11. # [必须修改] 端口号
12. port: 6379
13. # [可选] 数据库 DB
14. database: 6
15. # [可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接
16. password:
17. # [可选] 超时时间
18. timeout: 10000
19. # mysql数据源
20. datasource:
21. type: com.alibaba.druid.pool.DruidDataSource
22. driver-class-name: com.mysql.cj.jdbc.Driver
23. url: jdbc:mysql://127.0.0.1:3306/wvp?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true
24. username: root
25. password: 123456
26. druid:
27. initialSize: 10 # 连接池初始化连接数
28. maxActive: 200 # 连接池最大连接数
29. minIdle: 5 # 连接池最小空闲连接数
30. maxWait: 60000 # 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
31. keepAlive: true # 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。
32. validationQuery: select 1 # 检测连接是否有效sql,要求是查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
33. testWhileIdle: true # 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
34. testOnBorrow: false # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
35. testOnReturn: false # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
36. poolPreparedStatements: false # 是否開啟PSCache,並且指定每個連線上PSCache的大小
37. timeBetweenEvictionRunsMillis: 60000 # 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒
38. minEvictableIdleTimeMillis: 300000 # 配置一個連線在池中最小生存的時間,單位是毫秒
39. filters: stat,wall,slf4j # 配置监控统计拦截的filters,监控统计用的filter:sta, 日志用的filter:log4j, 防御sql注入的filter:wall
40. useGlobalDataSourceStat: true # 合并多个DruidDataSource的监控数据
41. # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
42. connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=1000
43. #stat-view-servlet.url-pattern: /admin/druid/*
44.
45. #[可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口
46. server:
47. port: 18080
48.
49. # 作为28181服务器的配置
50. sip:
51. # [必须修改] 本机的IP
52. ip: 192.168.1.13
53. # [可选] 28181服务监听的端口
54. port: 5060
55. # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007)
56. # 后两位为行业编码,定义参照附录D.3
57. # 3701020049标识山东济南历下区 信息行业接入
58. # [可选]
59. domain: 4401020049
60. # [可选]
61. id: 44010200492000000001
62. # [可选] 默认设备认证密码,后续扩展使用设备单独密码, 移除密码将不进行校验
63. password: admin123
64.
65. #zlm 默认服务器配置
66. media:
67. id: 12345678 ##ZLMediaKit配置的ID
68. # [必须修改] zlm服务器的内网IP
69. ip: 192.168.1.13
70. # [必须修改] zlm服务器的http.port
71. http-port: 80
72. # [可选] zlm服务器的hook.admin_params=secret
73. secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc
74. # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试
75. rtp:
76. # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输
77. enable: true
78. # [可选] 在此范围内选择端口用于媒体流传输, 必须提前在zlm上配置该属性,不然自动配置此属性可能不成功
79. port-range: 30000,30500 # 端口范围
80. # [可选] 国标级联在此范围内选择端口发送媒体流,
81. send-port-range: 30000,30500 # 端口范围
82. # 录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用
83. record-assist-port: 18081
84. # [可选] 日志配置, 一般不需要改
85. logging:
86. config: classpath:logback-spring-local.xml
87.
88. # 版本信息, 不需修改
89. version:
90. version: "@project.version@"
91. description: "@project.description@"
92. artifact-id: "@project.artifactId@"
1. ## 启动WVP
2. [root@localhost wvp-GB28181-pro]# cd target
3. [root@localhost target]# java -jar wvp-pro-2.3.1-06151618.jar
4.
5. ## 访问管理页面
6. http://192.168.1.13:18080
7. 默认用户名:admin, 密码:admin
8. 点击控制台--》媒体服务器配置--》有相关信息即可
自启动脚本
1. [root@localhost target]# cat wvp-pro.sh
2. #!/bin/sh
3. ##
4. if [ -f /etc/init.d/functions ]; then
5. . /etc/init.d/functions
6. elif [ -f /etc/rc.d/init.d/functions ]; then
7. . /etc/rc.d/init.d/functions
8. else
9. echo -e "\aJnice: unable to locate functions lib. Cannot continue."
10. exit 0
11. fi
12.
13. ulimit -n 65000
14. echo 1024 65000 > /proc/sys/net/ipv4/ip_local_port_range
15.
16. ## jar文件名称
17. export JAVA_HOME=/usr/lib/jvm/java-1.8.0
18. export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/
19. export PATH=$PATH:$JAVA_HOME/bin
20. JAR_HOME=/usr/local/wvp-GB28181-pro/target
21. JAR_NAME=wvp-pro-2.3.1-06151618.jar
22.
23. ## 过滤pid进程号
24. wvp_pro=`ps -ef|grep $JAR_NAME | grep -v grep | grep -v kill | awk '{print $2}'`
25.
26. #---------------------------------------------------------------------------
27. # START
28. #---------------------------------------------------------------------------
29. Start()
30. {
31. if [ $tpid ]; then
32. echo -n "wvp_pro process [${prog}] already running"
33. echo_failure
34. echo
35. return 1
36. fi
37.
38. if [ ! -f ${JAR_HOME}/${JAR_NAME} ]; then
39. echo -n "wvp_pro binary [${prog}] not found."
40. echo_failure
41. echo
42. return 1
43. fi
44.
45. echo -n "starting service (wvp_pro): "
46. cd ${JAR_HOME}
47. nohup java -jar ${JAR_HOME}/${JAR_NAME} > /dev/null 2>&1 &
48. retval=$?
49. if [ ${retval} == 0 ]; then
50. echo_success
51. echo
52. else
53. echo_failure
54. echo
55. break
56. fi
57. sleep 1
58.
59. return 0
60. }
61.
62. #---------------------------------------------------------------------------
63. # STOP
64. #---------------------------------------------------------------------------
65. Stop()
66. {
67. echo -n "stopping service (wvp_pro): "
68. kill -9 $wvp_pro
69. echo
70. return 0
71. }
72.
73. #---------------------------------------------------------------------------
74. # MAIN
75. #---------------------------------------------------------------------------
76. case "$1" in
77. start)
78. Start
79. ;;
80. stop)
81. Stop
82. ;;
83. restart)
84. Stop
85. sleep 3
86. Start
87. ;;
88. *)
89. echo "please use : $0 {start|stop|restart}"
90. esac
91.
92. exit
1. [root@localhost target]# crontab -l
2. */1 * * * * sh /usr/local/wvp-GB28181-pro/target/wvp-pro.sh start >/dev/null 2>&1