最近在研究一个摄像头 ,通信协议是 gb/t28181。对于这个协议也是第一次接触,通过查阅多方资料,找到了两个开源的源码,来实现 视频播放、摄像头直播。以前也没有深入的了解过关于视频播放的这方面的技术,偶尔网站播放视频 也都是 mp4视频,通过html标签直接播放。通过这次的学习,对于视频播放的技术有了一部分的了解。这篇文章主要是讲解 怎么搭建一下 我找的这两个开源的源码服务,从来对gb/t28181协议的设备 进行一个管理。
源码1:ZLMediaKit
对于ZLMediaKit 源码 他提供 docker部署的 方案,所以我们就不需要下载源码自行编译了
这个服务 我们主要是用来做视频流转换与播放等等
源码2:wvp-GB28181-pro
对于这个源码 已经集成了各种设备协议和ZLMediaKit的使用。
他是带前后端的管理系统,如果你们已经有了前端页面。可以只是用他的后端,通过api的方式调用即可。
好了,简单的介绍了这两个项目。
接下来我们来搭建 ZLMediaKit
docker 部署:
1、拉取官方镜像
bash
docker pull zlmediakit/zlmediakit:master
2、 首次运行临时容器
arduino
docker run -d --name zlmediakit-tmp zlmediakit/zlmediakit:master
3、提取默认配置文件
bash
# 创建宿主机配置目录
mkdir /home/zlmediakit/conf
# 复制容器内配置文件到宿主机
docker cp zlmediakit-tmp:/home/zlmediakit/conf/config.ini /opt/zlmediakit/conf/
# 删除临时容器
docker rm -f zlmediakit-tmp
4、修改config.ini配置文件
ini
[api]
secret = your_custom_secret # 必须修改默认值
[rtp_proxy]
# 端口范围需与容器映射一致 这个拉流的时候 随机使用的端口
# 如果设备同时在线多 再增加即可 现在是500个端口
port_range = 30000-30500
[http]
port = 9092 # 保持与容器映射端口对应
allow_ip_range = 0.0.0.0/0 # 允许所有IP访问
ssl_port=443 # 若开启HTTPS 默认443 也可以改成别的 8443
[rtmp]
port=1935 # 必须与Docker映射的容器端口一致
[websocket]
port=9000 # 若开启WebSocket
[general]
mediaServerId = sdaafdgfdgferdz #服务器唯一id 可自定义
配置文件别的 一般情况就不需要改了,当 wvp-GB28181-pro 源码启动的时候 和 ZLMediaKit 服务建立通信成功后 ,wvp-GB28181-pro 会把 一些参数 同步到 config.ini 配置文件里。
最后启动ZLMediaKit :
docker-compose.yml 文件方式启动:
大家可以根据自己的需求自行修改
bash
version: "3.7"
services:
zlmediakit:
image: zlmediakit
ports:
- "1935:1935" # rtmp 端口
- "9092:9092" # web 80端口
- "8443:8443" # web 443端口
- "8554:8554" # rtsp 端口
- "10000:10000" # rtp_proxy 端口
- "10000:10000/udp" # rtp 代理端口 udp
- "8000:8000/udp" # rtc 端口
- "9000:9000/udp" # srt 端口
- "30000-30500:30000-30500/tcp" # rtp 代理端口范围(WebRTC/RTP转发)
- "30000-30500:30000-30500/udp" # rtp 代理端口范围(WebRTC/RTP转发)
restart: always
container_name: zlmediakit
volumes:
- /home/lianxi/ZLMediaKit/conf/config.ini:/opt/media/conf/config.ini # 配置文件
注意:zlmediakit 服务的 9092 web 端口 通过浏览器可以直接访问,可以访问到一些目录结构,还不知道有没有安全方面的影响,目前不知道怎么关闭。有知道的小伙伴也欢迎留言~
这个 wvp-GB28181-pro 项目他默认是 3个 配置文件夹 我给他整合成1个了。

我修改后的 application.yml 配置文件 和上面的这个 docker-compose.yml是配到的。
更多配置 可以去翻看他的源码里有。
application.yml 内容:
yaml
spring:
application:
name: wvp
profiles:
active: dev # 设置接口超时时间
mvc:
async:
request-timeout: 20000
thymeleaf:
cache: false # [可选] 上传文件大小限制
servlet:
multipart:
max-file-size: 10MB
max-request-size: 100MB
cache:
type: redis # REDIS数据库配置
redis:
# [必须修改] Redis服务器IP, REDIS安装在本机的, 使用127.0.0.1
host: 127.0.0.1 # [必须修改] 端口号
port: 6379
# [可选] 数据库 DB
database: 1
# [可选] 访问密码, 若你的redis服务器没有设置密码,就不需要用密码去连接
password: 123456
# [可选] 超时时间
timeout: 10000
mysql:
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/gb28181?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
username: root
password: root
# [可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口
server:
port: 18080
# [可选] HTTPS配置, 默认不开启
ssl:
# [可选] 是否开启HTTPS访问
enabled: false
# [可选] 证书文件路径,放置在resource/目录下即可,修改xxx为文件名
key-store: classpath:test.monitor.89iot.cn.jks
# [可选] 证书密码
key-store-password: gpf64qmw
# [可选] 证书类型, 默认为jks,根据实际修改
key-store-type: JKS
# 作为28181服务器的配置
sip:
# [可选] 28181服务监听的端口
port: 8116
# 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007) 后两位为行业编码,定义参照附录D.3
# [可选] domain: 4101050000
# [可选] id: 41010500002000000001
# [可选] 默认设备认证密码,后续扩展使用设备单独密码, 移除密码将不进行校验
password: 12345678
# 是否存储alarm告警信息
alarm: false
# zlm 默认服务器配置
media:
id: sdaafdgfdgferdz # 要和 zlmediakit 服务配置文件里mediaServerId一致
# [必须修改] zlm服务器的内网IP
ip: 192.168.0.110
# [必须修改] zlm服务器的http.port
http-port: 9092
# 要和 zlmediakit docker映射的端口一致
http-ssl-port: 8443
rtmp-port: 1935
rtsp-port: 8554
# [必选选] zlm服务器的 secret
secret: tnc4XpPRdsasawQCaslpAsaaK
# 要和 zlmediakit 服务配置文件里secret一致
rtp:
# [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输
enable: true
# [可选] 在此范围内选择端口用于媒体流传输, 必须提前在zlm上配置该属性,不然自动配置此属性可能不成功
port-range: 30000,30500 # 端口范围
# [可选] 国标级联在此范围内选择端口发送媒体流, send-port-range: 30000,30500
send-port-range: 30000,30500 # 端口范围
# [根据业务需求配置]
user-settings:
# 点播/录像回放 等待超时时间, 单位:毫秒
play-timeout: 180000
# [可选] 自动点播, 使用固定流地址进行播放时,如果未点播则自动进行点播, 需要rtp.enable=true
auto-apply-play: true
# 推流直播是否录制
record-push-live: false
# 国标是否录制
record-sip: false
# 国标点播 按需拉流, true:有人观看拉流,无人观看释放, false:拉起后不自动释放
stream-on-demand: true
# 是否返回Date属性,true:不返回,避免摄像头通过该参数自动校时,false:返回,摄像头可能会根据该时间校时
disable-date-header: false
serverId: sdaafdgfdgferdz
# 关闭在线文档(生产环境建议关闭)
springdoc:
api-docs:
enabled: false
swagger-ui:
enabled: false
对于 wvp-GB28181-pro 项目部署 这里就不说了 ,非常简单 把数据库 表导入到数据库 ,数据库配置一下
java8 环境 idea编辑器 启动即可
网上找的模拟设备协议工具 进行9屏播放效果

最后:非常感谢这些大佬们开源的源码,让我了解了这么多关于视频播放的相关编程知识,向大佬致敬~