流媒体服务ZLMediaKit + Wvp安装及配置记录

1. 参考文章

参考文章:

(a) 使用最新版的wvp和ZLMediaKit搭建Gb28181测试服务器

(b) 新手使用wvp-pro和ZLMediaKit的菜鸟说明(手把手教)

在看本文章之前建议先多次阅读上方文章

软件安装可额外参考

JDK+Maven+Nginx+Redis+Mysql+Nacos+Emqx+Geoserver+Minio+RocketMq+ES+WVP+ZLMediaKit安装记录

注: 前端项目可以 先在本地手动打包, 然后再打包java项目, 省的在服务器上安装前端环境


官方教程指路:
ZLMediaKit快速开始!!!

ZLMediaKit-WIKI

WVP-PRO官方文档地址!!!

2. 路径说明

相关流媒体配置所在目录:

/usr/local/software/media/

# 结构如下
- media
	- bin
		- start_wvp.sh
		- start_zlm.sh
	- config
		- wvp-config.yml
		- zlm-config.ini
	- log
		- wvp.log
		- zlm.log
		- wvp_logs
	- wvp
		- wvp-pro-2.7.3.jar
	- zlm	
		- ZLMediaKit
			- 编译文件等
			- 编译文件等

3. 启动脚本

wvp启动脚本:

#!/bin/bash

source /etc/profile


APP_PATH="/usr/local/software/media/wvp/wvp-pro-2.7.3.jar"
CONFIG_PATH="/usr/local/software/media/config/wvp-config.yml"
LOG_FILE="/usr/local/software/media/log/wvp.log"

# 确保日志目录存在
mkdir -p "$(dirname "$LOG_FILE")"

# 启动 java 项目,日志统一写到一个文件
nohup java -jar "$APP_PATH" \
  --spring.config.location="$CONFIG_PATH" \
  >> "$LOG_FILE" 2>&1 &

echo "WVP 已启动,日志输出到: $LOG_FILE"

zlm启动脚本:

#!/bin/bash

# 启动路径
APP_PATH="/usr/local/software/media/zlm/ZLMediaKit/release/linux/Debug/MediaServer"
CONFIG_PATH="/usr/local/software/media/config/zlm-config.ini"
LOG_PATH="/usr/local/software/media/log/zlm.log"

# 如果日志目录不存在则创建
mkdir -p "$(dirname "$LOG_PATH")"

# 启动命令
nohup "$APP_PATH" -c "$CONFIG_PATH" -d >> "$LOG_PATH" 2>&1 &

echo "ZLMediaKit 已启动,日志输出到: $LOG_PATH"

4. 配置文件

修改如下配置:

[api]
 #和 wvp_gb28181.yml 中 media:secret: 一致
 secret=TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj

[general]
 #和 wvp_gb28181.yml 中 media:id: 一致
 mediaServerId=yfs1024

[http]
 #和 wvp_gb28181.yml 中 media:http-port: 一致
 port=8888

[rtp_proxy]
	 #和 wvp_gb28181.yml 中 media:rtp:port-range: 一致
 port_range=30000-30500	

1. wvp配置文件
spring:
  # 设置接口超时时间
  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: 3
    # [可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接
    password: reids123
    # [可选] 超时时间
    timeout: 10000
    # mysql数据源
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/wvp_pro?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: wvp_pro
    password: wvp_pro
#[可选] 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: 5060
  # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007)
  # 后两位为行业编码,定义参照附录D.3
  # 3701020049标识山东济南历下区 信息行业接入
  # [可选]
  domain: 4101050000
  # [可选]
  id: 41010500002000000001
  # [可选] 默认设备认证密码,后续扩展使用设备单独密码, 移除密码将不进行校验
  password: 12345678
  # 是否存储alarm信息
  alarm: false

#zlm 默认服务器配置
media:
  id: yfs1024
  # [可选] 有公网IP就配置公网IP, 不可用域名
  wan_ip: 8.155.172.246
  # [可选] zlm服务器访问WVP所使用的IP, 默认使用127.0.0.1,zlm和wvp没有部署在同一台服务器时必须配置
  hook-ip: 127.0.0.1
  # [必须修改] zlm服务器的内网IP
  ip: 127.0.0.1
  # [必须修改] zlm服务器的http.port
  http-port: 8888
  # [必选选] zlm服务器的hook.admin_params=secret
  secret: TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj
  # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试
  rtp:
    # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输
    enable: true
    # [可选] 在此范围内选择端口用于媒体流传输, 必须提前在zlm上配置该属性,不然自动配置此属性可能不成功
    port-range: 30000,30500 # 端口范围
    # [可选] 国标级联在此范围内选择端口发送媒体流,
    send-port-range: 50000,55000 # 端口范围
# [根据业务需求配置]
user-settings:
  # 点播/录像回放 等待超时时间,单位:毫秒
  play-timeout: 180000
  # [可选] 自动点播, 使用固定流地址进行播放时,如果未点播则自动进行点播, 需要rtp.enable=true
  auto-apply-play: true
  # 推流直播是否录制
  record-push-live: true
  # 国标是否录制
  record-sip: true
  # 国标点播 按需拉流, true:有人观看拉流,无人观看释放, false:拉起后不自动释放
  stream-on-demand: true

2. zlm配置文件:
#!!!!此配置文件为范例配置文件,意在告诉读者,各个配置项的具体含义和作用,
#!!!!该配置文件在执行cmake时,会拷贝至release/${操作系统类型}/${编译类型}(例如release/linux/Debug) 文件夹。
#!!!!该文件夹(release/${操作系统类型}/${编译类型})同时也是可执行程序生成目标路径,在执行MediaServer进程时,它会默认加载同目录下的config.ini文件作为配置文件,
#!!!!你如果修改此范例配置文件(conf/config.ini),并不会被MediaServer进程加载,因为MediaServer进程默认加载的是release/${操作系统类型}/${编译类型}/config.ini。
#!!!!当然,你每次执行cmake,该文件确实会被拷贝至release/${操作系统类型}/${编译类型}/config.ini,
#!!!!但是一般建议你直接修改release/${操作系统类型}/${编译类型}/config.ini文件,修改此文件一般不起作用,除非你运行MediaServer时使用-c参数指定到此文件。

[api]
#是否调试http api,启用调试后,会打印每次http请求的内容和回复
apiDebug=1
#一些比较敏感的http api在访问时需要提供secret,否则无权限调用
#如果是通过127.0.0.1访问,那么可以不提供secret
secret=TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj
#截图保存路径根目录,截图通过http api(/index/api/getSnap)生成和获取
snapRoot=./www/snap/
#默认截图图片,在启动FFmpeg截图后但是截图还未生成时,可以返回默认的预设图片
defaultSnap=./www/logo.png
#downloadFile http接口可访问文件的根目录,支持多个目录,不同目录通过分号(;)分隔
downloadRoot=./www

[ffmpeg]
#FFmpeg可执行程序路径,支持相对路径/绝对路径
bin=/usr/bin/ffmpeg
#FFmpeg拉流再推流的命令模板,通过该模板可以设置再编码的一些参数
cmd=%s -re -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s
#FFmpeg生成截图的命令,可以通过修改该配置改变截图分辨率或质量
snap=%s -i %s -y -f mjpeg -frames:v 1 -an %s
#FFmpeg日志的路径,如果置空则不生成FFmpeg日志
#可以为相对(相对于本可执行程序目录)或绝对路径
log=./ffmpeg/ffmpeg.log
# 自动重启的时间(秒), 默认为0, 也就是不自动重启. 主要是为了避免长时间ffmpeg拉流导致的不同步现象
restart_sec=0

#转协议相关开关;如果addStreamProxy api和on_publish hook回复未指定转协议参数,则采用这些配置项
[protocol]
#转协议时,是否开启帧级时间戳覆盖
# 0:采用源视频流绝对时间戳,不做任何改变
# 1:采用zlmediakit接收数据时的系统时间戳(有平滑处理)
# 2:采用源视频流时间戳相对时间戳(增长量),有做时间戳跳跃和回退矫正
modify_stamp=2
#转协议是否开启音频
enable_audio=1
#添加acc静音音频,在关闭音频时,此开关无效
add_mute_audio=1
#无人观看时,是否直接关闭(而不是通过on_none_reader hook返回close)
#此配置置1时,此流如果无人观看,将不触发on_none_reader hook回调,
#而是将直接关闭流
auto_close=0

#推流断开后可以在超时时间内重新连接上继续推流,这样播放器会接着播放。
#置0关闭此特性(推流断开会导致立即断开播放器)
#此参数不应大于播放器超时时间;单位毫秒
continue_push_ms=15000

#平滑发送定时器间隔,单位毫秒,置0则关闭;开启后影响cpu性能同时增加内存
#该配置开启后可以解决一些流发送不平滑导致zlmediakit转发也不平滑的问题
paced_sender_ms=0

#是否开启转换为hls(mpegts)
enable_hls=1
#是否开启转换为hls(fmp4)
enable_hls_fmp4=0
#是否开启MP4录制
enable_mp4=0
#是否开启转换为rtsp/webrtc
enable_rtsp=1
#是否开启转换为rtmp/flv
enable_rtmp=1
#是否开启转换为http-ts/ws-ts
enable_ts=1
#是否开启转换为http-fmp4/ws-fmp4
enable_fmp4=1

#是否将mp4录制当做观看者
mp4_as_player=0
#mp4切片大小,单位秒
mp4_max_second=3600
#mp4录制保存路径
mp4_save_path=./www

#hls录制保存路径
hls_save_path=./www

###### 以下是按需转协议的开关,在测试ZLMediaKit的接收推流性能时,请把下面开关置1
###### 如果某种协议你用不到,你可以把以下开关置1以便节省资源(但是还是可以播放,只是第一个播放者体验稍微差点),
###### 如果某种协议你想获取最好的用户体验,请置0(第一个播放者可以秒开,且不花屏)
#hls协议是否按需生成,如果hls.segNum配置为0(意味着hls录制),那么hls将一直生成(不管此开关)
hls_demand=0
#rtsp[s]协议是否按需生成
rtsp_demand=0
#rtmp[s]、http[s]-flv、ws[s]-flv协议是否按需生成
rtmp_demand=0
#http[s]-ts协议是否按需生成
ts_demand=0
#http[s]-fmp4、ws[s]-fmp4协议是否按需生成
fmp4_demand=0

[general]
#是否启用虚拟主机
enableVhost=0
#播放器或推流器在断开后会触发hook.on_flow_report事件(使用多少流量事件),
#flowThreshold参数控制触发hook.on_flow_report事件阈值,使用流量超过该阈值后才触发,单位KB
flowThreshold=1024
#播放最多等待时间,单位毫秒
#播放在播放某个流时,如果该流不存在,
#ZLMediaKit会最多让播放器等待maxStreamWaitMS毫秒
#如果在这个时间内,该流注册成功,那么会立即返回播放器播放成功
#否则返回播放器未找到该流,该机制的目的是可以先播放再推流
maxStreamWaitMS=15000
#某个流无人观看时,触发hook.on_stream_none_reader事件的最大等待时间,单位毫秒
#在配合hook.on_stream_none_reader事件时,可以做到无人观看自动停止拉流或停止接收推流
streamNoneReaderDelayMS=20000
#拉流代理时如果断流再重连成功是否删除前一次的媒体流数据,如果删除将重新开始,
#如果不删除将会接着上一次的数据继续写(录制hls/mp4时会继续在前一个文件后面写)
resetWhenRePlay=1
#合并写缓存大小(单位毫秒),合并写指服务器缓存一定的数据后才会一次性写入socket,这样能提高性能,但是会提高延时
#开启后会同时关闭TCP_NODELAY并开启MSG_MORE
mergeWriteMS=0
#服务器唯一id,用于触发hook时区别是哪台服务器
mediaServerId=yfs1024

#最多等待未初始化的Track时间,单位毫秒,超时之后会忽略未初始化的Track
wait_track_ready_ms=10000
#最多等待音频Track收到数据时间,单位毫秒,超时且完全没收到音频数据,忽略音频Track
#加快某些带封装的流metadata说明有音频,但是实际上没有的流ready时间(比如很多厂商的GB28181 PS)
wait_audio_track_data_ms=1000
#如果流只有单Track,最多等待若干毫秒,超时后未收到其他Track的数据,则认为是单Track
#如果协议元数据有声明特定track数,那么无此等待时间
wait_add_track_ms=3000
#如果track未就绪,我们先缓存帧数据,但是有最大个数限制,防止内存溢出
unready_frame_cache=100
#是否启用观看人数变化事件广播,置1则启用,置0则关闭
broadcast_player_count_changed=0
#绑定的本地网卡ip
listen_ip=::

[hls]
#hls写文件的buf大小,调整参数可以提高文件io性能
fileBufSize=65536
#hls最大切片时间
segDur=2
#m3u8索引中,hls保留切片个数(实际保留切片个数+segRetain个)
#如果设置为0,则不删除切片且m3u8文件全量记录切片列表
segNum=3
#HLS切片延迟个数,大于0将生成hls_delay.m3u8文件,0则不生成
segDelay=0
#HLS切片从m3u8文件中移除后,继续保留在磁盘上的个数
segRetain=5
#是否广播 hls切片(ts/fmp4)完成通知(on_record_ts)
broadcastRecordTs=0
#直播hls文件删除延时,单位秒,issue: #913
deleteDelaySec=10
#此选项开启后m3u8文件还是表现为直播,但是切片文件会被全部保留为点播用
#segDur设置为0或segKeep设置为1的情况下,每个切片文件夹下会生成一个vod.m3u8文件用于点播该时间段的录像
segKeep=0
#如果设置为1,则第一个切片长度强制设置为1个GOP。当GOP小于segDur,可以提高首屏速度
fastRegister=0

[hook]
#是否启用hook事件,启用后,推拉流都将进行鉴权
enable=0
#播放器或推流器使用流量事件,置空则关闭
on_flow_report=
#访问http文件鉴权事件,置空则关闭鉴权
on_http_access=
#播放鉴权事件,置空则关闭鉴权
on_play=
#推流鉴权事件,置空则关闭鉴权
on_publish=
#录制mp4切片完成事件
on_record_mp4=
# 录制 hls ts(或fmp4) 切片完成事件
on_record_ts=
#rtsp播放鉴权事件,此事件中比对rtsp的用户名密码
on_rtsp_auth=
#rtsp播放是否开启专属鉴权事件,置空则关闭rtsp鉴权。rtsp播放鉴权还支持url方式鉴权
#建议开发者统一采用url参数方式鉴权,rtsp用户名密码鉴权一般在设备上用的比较多
#开启rtsp专属鉴权后,将不再触发on_play鉴权事件
on_rtsp_realm=
#远程telnet调试鉴权事件
on_shell_login=
#直播流注册或注销事件
on_stream_changed=
#过滤on_stream_changed hook的协议类型,可以选择只监听某些感兴趣的协议;置空则不过滤协议
stream_changed_schemas=rtsp/rtmp/fmp4/ts/hls/hls.fmp4
#无人观看流事件,通过该事件,可以选择是否关闭无人观看的流。配合general.streamNoneReaderDelayMS选项一起使用
on_stream_none_reader=
#播放时,未找到流事件,通过配合hook.on_stream_none_reader事件可以完成按需拉流
on_stream_not_found=
#服务器启动报告,可以用于服务器的崩溃重启事件监听
on_server_started=
#服务器退出报告,当服务器正常退出时触发
on_server_exited=
#server保活上报
on_server_keepalive=
#发送rtp(startSendRtp)被动关闭时回调
on_send_rtp_stopped=
#rtp server 超时未收到数据
on_rtp_server_timeout=

#hook api最大等待回复时间,单位秒
timeoutSec=10
#keepalive hook触发间隔,单位秒,float类型
alive_interval=10.0
#hook通知失败重试次数,正整数。为0不重试,1时重试一次,以此类推
retry=1
#hook通知失败重试延时,单位秒,float型
retry_delay=3.0

[cluster]
#设置源站拉流url模板, 格式跟printf类似,第一个%s指定app,第二个%s指定stream_id,
#开启集群模式后,on_stream_not_found和on_stream_none_reader hook将无效.
#溯源模式支持以下类型:
#rtmp方式: rtmp://127.0.0.1:1935/%s/%s
#rtsp方式: rtsp://127.0.0.1:554/%s/%s
#hls方式: http://127.0.0.1:80/%s/%s/hls.m3u8
#http-ts方式: http://127.0.0.1:80/%s/%s.live.ts
#支持多个源站,不同源站通过分号(;)分隔
origin_url=
#溯源总超时时长,单位秒,float型;假如源站有3个,那么单次溯源超时时间为timeout_sec除以3
#单次溯源超时时间不要超过general.maxStreamWaitMS配置
timeout_sec=15
#溯源失败尝试次数,-1时永久尝试
retry_count=3

[http]
#http服务器字符编码集
charSet=utf-8
#http链接超时时间
keepAliveSecond=30
#http请求体最大字节数,如果post的body太大,则不适合缓存body在内存
maxReqSize=40960
#404网页内容,用户可以自定义404网页
#notFound=<html><head><title>404 Not Found</title></head><body bgcolor="white"><center><h1>您访问的资源不存在!</h1></center><hr><center>ZLMediaKit-4.0</center></body></html>
#http服务器监听端口
port=8888
#http文件服务器根目录
#可以为相对(相对于本可执行程序目录)或绝对路径
rootPath=./www
#http文件服务器读文件缓存大小,单位BYTE,调整该参数可以优化文件io性能
sendBufSize=65536
#https服务器监听端口
sslport=443
#是否显示文件夹菜单,开启后可以浏览文件夹
dirMenu=1
#虚拟目录, 虚拟目录名和文件路径使用","隔开,多个配置路径间用";"隔开
#例如赋值为 app_a,/path/to/a;app_b,/path/to/b 那么
#访问 http://127.0.0.1/app_a/file_a 对应的文件路径为 /path/to/a/file_a
#访问 http://127.0.0.1/app_b/file_b 对应的文件路径为 /path/to/b/file_b
#访问其他http路径,对应的文件路径还是在rootPath内
virtualPath=
#禁止后缀的文件使用mmap缓存,使用“,”隔开
#例如赋值为 .mp4,.flv
#那么访问后缀为.mp4与.flv 的文件不缓存
forbidCacheSuffix=
#可以把http代理前真实客户端ip放在http头中:https://github.com/ZLMediaKit/ZLMediaKit/issues/1388
#切勿暴露此key,否则可能导致伪造客户端ip
forwarded_ip_header=
#默认允许所有跨域请求
allow_cross_domains=1
#允许访问http api和http文件索引的ip地址范围白名单,置空情况下不做限制
allow_ip_range=::1,127.0.0.1,172.16.0.0-172.31.255.255,192.168.0.0-192.168.255.255,10.0.0.0-10.255.255.255

[multicast]
#rtp组播截止组播ip地址
addrMax=239.255.255.255
#rtp组播起始组播ip地址
addrMin=239.0.0.0
#组播udp ttl
udpTTL=64

[record]
#mp4录制或mp4点播的应用名,通过限制应用名,可以防止随意点播
#点播的文件必须放置在此文件夹下
appName=record
#mp4录制写文件缓存,单位BYTE,调整参数可以提高文件io性能
fileBufSize=65536
#mp4点播每次流化数据量,单位毫秒,
#减少该值可以让点播数据发送量更平滑,增大该值则更节省cpu资源
sampleMS=500
#mp4录制完成后是否进行二次关键帧索引写入头部
fastStart=0
#MP4点播(rtsp/rtmp/http-flv/ws-flv)是否循环播放文件
fileRepeat=0
#MP4录制写文件格式是否采用fmp4,启用的话,断电未完成录制的文件也能正常打开
enableFmp4=0

[rtmp]
#rtmp必须在此时间内完成握手,否则服务器会断开链接,单位秒
handshakeSecond=15
#rtmp超时时间,如果该时间内未收到客户端的数据,
#或者tcp发送缓存超过这个时间,则会断开连接,单位秒
keepAliveSecond=15
#rtmp服务器监听端口
port=1935
#rtmps服务器监听地址
sslport=0
# rtmp是否直接代理模式
directProxy=1
#h265 rtmp打包采用增强型rtmp标准还是国内拓展标准
enhanced=0

[rtp]
#音频mtu大小,该参数限制rtp最大字节数,推荐不要超过1400
#加大该值会明显增加直播延时
audioMtuSize=600
#视频mtu大小,该参数限制rtp最大字节数,推荐不要超过1400
videoMtuSize=1400
#rtp包最大长度限制,单位KB,主要用于识别TCP上下文破坏时,获取到错误的rtp
rtpMaxSize=10
# rtp 打包时,低延迟开关,默认关闭(为0),h264存在一帧多个slice(NAL)的情况,在这种情况下,如果开启可能会导致画面花屏
lowLatency=0
# H264 rtp打包模式是否采用stap-a模式(为了在老版本浏览器上兼容webrtc)还是采用Single NAL unit packet per H.264 模式
# 有些老的rtsp设备不支持stap-a rtp,设置此配置为0可提高兼容性
h264_stap_a=1

[rtp_proxy]
#导出调试数据(包括rtp/ps/h264)至该目录,置空则关闭数据导出
dumpDir=
#udp和tcp代理服务器,支持rtp(必须是ts或ps类型)代理
port=10000
#rtp超时时间,单位秒
timeoutSec=15
#随机端口范围,最少确保36个端口
#该范围同时限制rtsp服务器udp端口范围
port_range=30000-30500
#rtp h264 负载的pt
h264_pt=98
#rtp h265 负载的pt
h265_pt=99
#rtp ps 负载的pt
ps_pt=96
#rtp opus 负载的pt
opus_pt=100
#startSendRtp、startRecord相关功能是否提前开启gop缓存优化级联秒开体验,默认开启, 并缓存1个GOP
#如果不调用startSendRtp、startRecord后相关接口,可以置0节省内存;如果缓存多个gop,可以加大该参数
gop_cache=1

#国标发送g711 rtp 打包时,每个包的语音时长是多少,默认是100 ms,范围为20~180ms (gb28181-2016,c.2.4规定),
#最好为20 的倍数,程序自动向20的倍数取整
rtp_g711_dur_ms = 100
#udp接收数据socket buffer大小配置
#4*1024*1024=4196304
udp_recv_socket_buffer=4194304
#ps/ts解析后是否等待下一帧以判断本帧是否完整,开启后提高兼容性,但是可能增加延时
merge_frame=1

[rtc]
#rtc播放推流、播放超时时间
timeoutSec=15
#本机对rtc客户端的可见ip,作为服务器时一般为公网ip,可有多个,用','分开,当置空时,会自动获取网卡ip
#同时支持环境变量,以$开头,如"$EXTERN_IP"; 请参考:https://github.com/ZLMediaKit/ZLMediaKit/pull/1786
externIP=
#rtc udp服务器监听端口号,所有rtc客户端将通过该端口传输stun/dtls/srtp/srtcp数据,
#该端口是多线程的,同时支持客户端网络切换导致的连接迁移
#需要注意的是,如果服务器在nat内,需要做端口映射时,必须确保外网映射端口跟该端口一致
port=8000
#rtc tcp服务器监听端口号,在udp 不通的情况下,会使用tcp传输数据
#该端口是多线程的,同时支持客户端网络切换导致的连接迁移
#需要注意的是,如果服务器在nat内,需要做端口映射时,必须确保外网映射端口跟该端口一致
tcpPort = 8000
#设置remb比特率,非0时关闭twcc并开启remb。该设置在rtc推流时有效,可以控制推流画质
#目前已经实现twcc自动调整码率,关闭remb根据真实网络状况调整码率
rembBitRate=0
#rtc支持的音频codec类型,在前面的优先级更高
#以下范例为所有支持的音频codec
preferredCodecA=PCMA,PCMU,opus,mpeg4-generic
#rtc支持的视频codec类型,在前面的优先级更高
#以下范例为所有支持的视频codec
preferredCodecV=H264,H265,AV1,VP9,VP8

#webrtc比特率设置
start_bitrate=0
max_bitrate=0
min_bitrate=0

#nack接收端, rtp发送端,zlm发送rtc流
#rtp重发缓存列队最大长度,单位毫秒
maxRtpCacheMS=5000
#rtp重发缓存列队最大长度,单位个数
maxRtpCacheSize=2048

#nack发送端,rtp接收端,zlm接收rtc推流
#最大保留的rtp丢包状态个数
nackMaxSize=2048
#rtp丢包状态最长保留时间
nackMaxMS=3000
#nack最多请求重传次数
nackMaxCount=15
#nack重传频率,rtt的倍数
nackIntervalRatio=1.0
#nack包中rtp个数,减小此值可以让nack包响应更灵敏
nackRtpSize=8
#是否尝试过滤 b帧
bfilter=0

[srt]
#srt播放推流、播放超时时间,单位秒
timeoutSec=5
#srt udp服务器监听端口号,所有srt客户端将通过该端口传输srt数据,
#该端口是多线程的,同时支持客户端网络切换导致的连接迁移
port=9000
#srt 协议中延迟缓存的估算参数,在握手阶段估算rtt ,然后latencyMul*rtt 为最大缓存时长,此参数越大,表示等待重传的时长就越大
latencyMul=4
#包缓存的大小
pktBufSize=8192
#srt udp服务器的密码,为空表示不加密
passPhrase=


[rtsp]
#rtsp专有鉴权方式是采用base64还是md5方式
authBasic=0
#rtsp拉流、推流代理是否是直接代理模式
#直接代理后支持任意编码格式,但是会导致GOP缓存无法定位到I帧,可能会导致开播花屏
#并且如果是tcp方式拉流,如果rtp大于mtu会导致无法使用udp方式代理
#假定您的拉流源地址不是264或265或AAC,那么你可以使用直接代理的方式来支持rtsp代理
#如果你是rtsp推拉流,但是webrtc播放,也建议关闭直接代理模式,
#因为直接代理时,rtp中可能没有sps pps,会导致webrtc无法播放; 另外webrtc也不支持Single NAL Unit Packets类型rtp
#默认开启rtsp直接代理,rtmp由于没有这些问题,是强制开启直接代理的
directProxy=1
#rtsp必须在此时间内完成握手,否则服务器会断开链接,单位秒
handshakeSecond=15
#rtsp超时时间,如果该时间内未收到客户端的数据,
#或者tcp发送缓存超过这个时间,则会断开连接,单位秒
keepAliveSecond=15
#rtsp服务器监听地址
port=554
#rtsps服务器监听地址
sslport=0
#rtsp 转发是否使用低延迟模式,当开启时,不会缓存rtp包,来提高并发,可以降低一帧的延迟
lowLatency=0
#强制协商rtp传输方式 (0:TCP,1:UDP,2:MULTICAST,-1:不限制)
#当客户端发起RTSP SETUP的时候如果传输类型和此配置不一致则返回461 Unsupported transport
#迫使客户端重新SETUP并切换到对应协议。目前支持FFMPEG和VLC
rtpTransportType=-1
[shell]
#调试telnet服务器接受最大buffer大小
maxReqSize=1024
#调试telnet服务器监听端口
port=0


3. 当首次连接口ZLMediaKit配置会进行自动同步修改

示例如下:

[api]
apiDebug=1
defaultSnap=./www/logo.png
downloadRoot=./www
secret=TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj
snapRoot=./www/snap/

[cluster]
origin_url=
retry_count=3
timeout_sec=15

[ffmpeg]
bin=/usr/bin/ffmpeg
cmd=%s -re -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s
log=./ffmpeg/ffmpeg.log
restart_sec=0
snap=%s -rtsp_transport tcp -i %s -y -f mjpeg -frames:v 1 %s

[general]
broadcast_player_count_changed=0
check_nvidia_dev=1
enableVhost=0
enable_ffmpeg_log=0
flowThreshold=1024
listen_ip=::
maxStreamWaitMS=15000
mediaServerId=yfs1024
mergeWriteMS=0
resetWhenRePlay=1
streamNoneReaderDelayMS=20000
unready_frame_cache=100
wait_add_track_ms=3000
wait_audio_track_data_ms=1000
wait_track_ready_ms=10000

[hls]
broadcastRecordTs=0
deleteDelaySec=10
fastRegister=0
fileBufSize=65536
segDelay=0
segDur=2
segKeep=0
segNum=3
segRetain=5

[hook]
alive_interval=10.0
enable=1
on_flow_report=
on_http_access=
on_play=http://127.0.0.1:18080/index/hook/on_play
on_publish=http://127.0.0.1:18080/index/hook/on_publish
on_record_mp4=http://127.0.0.1:18080/index/hook/on_record_mp4
on_record_ts=
on_rtp_server_timeout=http://127.0.0.1:18080/index/hook/on_rtp_server_timeout
on_rtsp_auth=
on_rtsp_realm=
on_send_rtp_stopped=http://127.0.0.1:18080/index/hook/on_send_rtp_stopped
on_server_exited=
on_server_keepalive=http://127.0.0.1:18080/index/hook/on_server_keepalive
on_server_started=http://127.0.0.1:18080/index/hook/on_server_started
on_shell_login=
on_stream_changed=http://127.0.0.1:18080/index/hook/on_stream_changed
on_stream_none_reader=http://127.0.0.1:18080/index/hook/on_stream_none_reader
on_stream_not_found=http://127.0.0.1:18080/index/hook/on_stream_not_found
retry=1
retry_delay=3.0
stream_changed_schemas=rtsp/rtmp/fmp4/ts/hls/hls.fmp4
timeoutSec=30

[http]
allow_cross_domains=1
allow_ip_range=::1,127.0.0.1,172.16.0.0-172.31.255.255,192.168.0.0-192.168.255.255,10.0.0.0-10.255.255.255
charSet=utf-8
dirMenu=1
forbidCacheSuffix=
forwarded_ip_header=
keepAliveSecond=30
maxReqSize=40960
notFound=<html><head><title>404 Not Found</title></head><body bgcolor="white"><center><h1>您访问的资源不存在!</h1></center><hr><center>ZLMediaKit(git hash:88b422d/2025-09-09T23:11:19+08:00,branch:master,build time:2025-09-10T16:32:41)</center></body></html>
port=8888
rootPath=./www
sendBufSize=65536
sslport=443
virtualPath=

[multicast]
addrMax=239.255.255.255
addrMin=239.0.0.0
udpTTL=64

[protocol]
add_mute_audio=1
auto_close=0
continue_push_ms=3000
enable_audio=1
enable_fmp4=1
enable_hls=1
enable_hls_fmp4=0
enable_mp4=0
enable_rtmp=1
enable_rtsp=1
enable_ts=1
fmp4_demand=0
hls_demand=0
hls_save_path=./www
modify_stamp=2
mp4_as_player=0
mp4_max_second=3600
mp4_save_path=./www
paced_sender_ms=0
rtmp_demand=0
rtsp_demand=0
ts_demand=0

[record]
appName=record
enableFmp4=0
fastStart=0
fileBufSize=65536
fileRepeat=0
sampleMS=500

[rtc]
bfilter=0
externIP=
maxRtpCacheMS=5000
maxRtpCacheSize=2048
max_bitrate=0
min_bitrate=0
nackIntervalRatio=1.0
nackMaxCount=15
nackMaxMS=3000
nackMaxSize=2048
nackRtpSize=8
port=8000
preferredCodecA=PCMA,PCMU,opus,mpeg4-generic
preferredCodecV=H264,H265,AV1,VP9,VP8
rembBitRate=0
start_bitrate=0
tcpPort=8000
timeoutSec=15

[rtmp]
directProxy=1
enhanced=0
handshakeSecond=15
keepAliveSecond=15
port=1935
sslport=0

[rtp]
audioMtuSize=600
h264_stap_a=1
lowLatency=0
rtpMaxSize=10
videoMtuSize=1400

[rtp_proxy]
dumpDir=
gop_cache=1
h264_pt=98
h265_pt=99
merge_frame=1
opus_pt=100
port=10000
port_range=30000-30500
ps_pt=96
rtp_g711_dur_ms=100
timeoutSec=15
udp_recv_socket_buffer=4194304

[rtsp]
authBasic=0
directProxy=1
handshakeSecond=15
keepAliveSecond=15
lowLatency=0
port=554
rtpTransportType=-1
sslport=0

[shell]
maxReqSize=1024
port=0

[srt]
latencyMul=4
passPhrase=
pktBufSize=8192
port=9000
timeoutSec=5

5. 其他

退出: ZLMediaKit

killall -2 MediaServer

killall:按进程名杀死进程。

-2:发送 信号 2 (SIGINT),相当于在前台运行时按 Ctrl+C

MediaServer:就是你进程的名字。

<think>我们正在处理一个关于在Windows平台编译安装WVP-GB28181-ProZLMediaKit以搭建国标流媒体服务器的问题。根据用户的问题,我们需要提供详细的步骤指导。同时,我们参考了站内提供的两篇文档,但要注意这些文档可能不是完全匹配,因此需要结合通用知识和参考文档中的关键信息。 目标:在Windows平台搭建国标流媒体服务器,包括两个主要组件:ZLMediaKit流媒体服务)和wvp-GB28181-pro(国标信令服务)。 步骤概述: 1. 准备环境(安装必要的软件和依赖) 2. 编译ZLMediaKit 3. 编译wvp-GB28181-pro 4. 配置两个组件 5. 运行并测试 下面将详细说明每个步骤。 ### 步骤1:准备环境 在Windows上编译这两个项目,需要安装以下软件: - Git:用于克隆代码仓库 - Java JDK(建议JDK 8或11):wvp-GB28181-pro是Java项目 - Maven:用于构建wvp-GB28181-pro - Visual Studio(建议2017或更高版本):用于编译ZLMediaKit(C++项目) - CMake:用于生成ZLMediaKit的Visual Studio工程 - MySQL:wvp-GB28181-pro需要数据库 此外,根据参考文档[^2],编译ZLMediaKit还需要编译libsrtp(用于WebRTC支持)。 具体操作: 1. 安装Git、Java JDK、Maven、Visual Studio(安装时选择C++桌面开发)、CMake,并配置环境变量。 2. 安装MySQL数据库,创建数据库并导入wvp-GB28181-pro的SQL脚本。 ### 步骤2:编译ZLMediaKit 参考引用[^1]和[^2]中关于ZLMediaKit编译的部分。 步骤: 1. 克隆ZLMediaKit代码: ```bash git clone --depth 1 https://github.com/ZLMediaKit/ZLMediaKit.git cd ZLMediaKit git submodule update --init ``` 2. 编译libsrtp(参考引用[^1]): 由于libsrtp是ZLMediaKit的依赖(用于WebRTC),需要先编译。 在ZLMediaKit的目录下,进入`third_party/libSDPRTP`,使用Visual Studio打开解决方案并编译,或者按照README中的说明编译。 但是,根据参考引用[^2],在Windows下编译ZLMediaKit的步骤中提到了编译libsrtp,我们可以这样操作: - 下载libsrtp源码:https://github.com/cisco/libsrtp - 使用CMake生成Visual Studio工程,然后编译。 或者,如果不需要WebRTC功能,可以在编译ZLMediaKit时通过CMake选项关闭(-DENABLE_WEBRTC=OFF),但国标服务器可能需要WebRTC,所以建议编译。 3. 使用CMake生成Visual Studio工程: 打开CMake GUI,设置源码路径为ZLMediaKit的路径,构建路径为ZLMediaKit下的build目录(或新建)。 点击Configure,选择Visual Studio版本和平台(x64),然后点击Generate。 注意:如果需要libsrtp,确保在CMake配置时指定libsrtp的路径。 4. 用Visual Studio打开生成的工程文件(ZLMediaKit.sln),选择Release或Debug配置,然后生成解决方案。 5. 编译完成后,在输出目录(如`ZLMediaKit/release/windows/Debug`)会生成MediaServer.exe等文件。 ### 步骤3:编译wvp-GB28181-pro wvp-GB28181-pro是一个Java项目,使用Maven构建。 步骤: 1. 克隆代码: ```bash git clone https://github.com/648540858/wvp-GB28181-pro.git cd wvp-GB28181-pro ``` 2. 使用Maven构建: ```bash mvn clean package ``` 构建完成后,在`target`目录下会生成wvp-pro-*.jar文件。 ### 步骤4:配置 1. ZLMediaKit配置: 在ZLMediaKit的release目录下,有config.ini配置文件。根据国标流媒体服务器的需求进行配置,特别是端口、流媒体存储路径等。同时,需要开启国标需要的端口(如5060用于SIP,10000-20000用于媒体流)。 2. wvp-GB28181-pro配置: 在wvp-GB28181-pro的`src/main/resources/application.yml`中配置数据库连接、SIP配置服务器ID、IP、端口等)以及媒体流配置(指向ZLMediaKit的IP和端口)。 注意:需要先创建MySQL数据库,并执行wvp-GB28181-pro项目中的SQL脚本(在`doc`目录下)来初始化表结构。 ### 步骤5:运行 1. 启动ZLMediaKit: 在命令行中进入ZLMediaKit的release目录,运行: ```bash MediaServer.exe -c config.ini ``` 2. 启动wvp-GB28181-pro: 在wvp-GB28181-pro项目目录下,运行: ```bash java -jar target/wvp-pro-*.jar ``` 3. 访问wvp的Web界面(默认端口18080)进行设备添加和管理。 ### 注意事项 - 确保防火墙开放相关端口(SIP端口5060,媒体端口范围,Web端口等)。 - 如果运行在公网,需要配置公网IP并设置正确的SIP域和网络配置- 参考文档中提到的libsrtp编译问题,如果遇到困难,可以考虑暂时关闭WebRTC功能(在ZLMediaKit的CMake配置中设置)。 以上步骤是搭建国标流媒体服务器的基本流程。由于环境差异,可能会遇到各种问题,需要根据具体情况进行调整。 §§相关问题§§ 1. 如何解决ZLMediaKit编译过程中遇到的依赖问题? 2. 如何配置wvp-GB28181-pro以支持国标设备的注册? 3. 在Windows平台部署GB28181服务器有哪些性能优化建议?</think>### Windows平台编译安装WVP-GB28181-ProZLMediaKit搭建国标流媒体服务器指南 #### 一、环境准备 1. **系统要求**:Windows 10/11 64位系统 2. **必要工具**: - Git:[下载地址](https://git-scm.com/) - JDK 11+:[下载地址](https://adoptium.net/) - Maven 3.6+:[下载地址](https://maven.apache.org/) - Visual Studio 2019+安装"C++桌面开发"组件) - MySQL 5.7+:[下载地址](https://dev.mysql.com/) - FFmpeg(用于流媒体处理):[下载地址](https://ffmpeg.org/) #### 二、编译ZLMediaKit 1. **获取源码**: ```bash git clone --depth 1 https://github.com/ZLMediaKit/ZLMediaKit.git cd ZLMediaKit git submodule update --init --recursive ``` 2. **编译依赖库**: - 编译libsrtp(WebRTC必需): ```bash cd third_party/libSRTP mkdir build && cd build cmake .. -G "Visual Studio 16 2019" -A x64 cmake --build . --config Release ``` 3. **编译主程序**: ```bash cd ZLMediaKit mkdir build && cd build cmake .. -G "Visual Studio 16 2019" -A x64 -DENABLE_WEBRTC=ON cmake --build . --config Release --target MediaServer ``` 编译成功后,在`ZLMediaKit\release\windows\Release`生成`MediaServer.exe`[^2] #### 三、编译WVP-GB28181-Pro 1. **获取源码**: ```bash git clone https://github.com/648540858/wvp-GB28181-pro.git cd wvp-GB28181-pro ``` 2. **数据库初始化**: - 创建MySQL数据库`wvp_db` - 执行`doc/数据库.sql`初始化表结构 3. **Maven编译**: ```bash mvn clean package -DskipTests ``` 生成`target/wvp-pro-*.jar` #### 四、配置与运行 1. **ZLMediaKit配置**: 修改`config.ini`: ```ini [sip] enabled=1 port=5060 [rtp] port_range=10000-20000 ``` 2. **WVP-PRO配置**: 修改`application.yml`: ```yaml server: port: 18080 sip: ip: 本机IP port: 5060 media: id: 34020000002000000001 ip: 本机IP stream: port: 30000-30500 zlm: ip: 127.0.0.1 port: 1945 ``` 3. **启动服务**: - 启动ZLMediaKit: ```bash .\MediaServer.exe -c .\config.ini ``` - 启动WVP-PRO: ```bash java -jar wvp-pro-*.jar ``` #### 五、设备接入 1. 访问`http://localhost:18080` 2. 在"国标设备管理"中添加摄像头: - 设备ID:摄像头厂商提供的20位ID - 通道ID:34020000002000000001 - SIP地址:摄像头IP - 端口:5060 #### 六、验证服务 1. **ZLMediaKit状态**: ```bash curl http://127.0.0.1:1945/index/api/getServerConfig ``` 2. **WVP-PRO接口**: ```bash curl http://localhost:18080/api/v1/devices ``` > **注意**:若需公网访问,需在防火墙开放端口:5060(SIP)、18080(Web)、1945(API)、10000-20000(RTP媒体流)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yfs1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值