648540858 / wvp-GB28181-pro

WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的网络视频平台,支持NAT穿透,支持海康、大华、宇视等品牌的IPC、NVR、DVR接入。支持国标级联,支持rtsp/rtmp等视频流转发到国标平台,支持rtsp/rtmp等推流转发到国标平台。
https://doc.wvp-pro.cn
MIT License
4.82k stars 1.43k forks source link

技术咨询 新增拉流代理超时 #1226

Closed SugaraguS closed 6 months ago

SugaraguS commented 8 months ago

环境信息:

内容描述: 在本地服务器测试没有问题后,发布至服务器后,仅修改了相关IP,创建拉流代理时失败,提示超时,再次点击代理列表中的启用时提示流已经存在,删除代理时提示删除代理失败; 但是通过postman直接调用zlm拉流代理接口可以正常创建,正常删除 截图

抓包文件

日志

2023-12-22 14:49:44.273 [main]  WARN --- GB28181_SIP: 451 Using default truststore type pkcs12
2023-12-22 14:49:44.273 [main]  WARN --- GB28181_SIP: 451 TLS trust settings will be inactive - TLS trust store will use JVM defaults. trustStoreType=pkcs12 javax.net.ssl.trustStore=null javax.net.ssl.trustStorePassword=null
2023-12-22 14:49:44.391 [main]  INFO --- com.genersoft.iot.vmp.gb28181.SipLayer: 80 [SIP SERVER] tcp://0.0.0.0:5060 启动成功
2023-12-22 14:49:44.397 [main]  INFO --- com.genersoft.iot.vmp.gb28181.SipLayer: 97 [SIP SERVER] udp://0.0.0.0:5060 启动成功
2023-12-22 14:49:44.440 [main]  INFO --- com.zaxxer.hikari.HikariDataSource: 110 wvp - Starting...
2023-12-22 14:49:44.644 [main]  INFO --- com.zaxxer.hikari.HikariDataSource: 123 wvp - Start completed.
2023-12-22 14:49:44.733 [main]  INFO --- com.genersoft.iot.vmp.media.zlm.ZLMRunner: 82 [zlm] 等待默认zlm中...
2023-12-22 14:49:44.736 [main]  INFO --- c.g.iot.vmp.service.impl.MediaServerServiceImpl: 125 [zlm] 缓存初始化 
2023-12-22 14:49:45.161 [main]  INFO --- c.g.iot.vmp.service.impl.MediaServerServiceImpl: 383 [ZLM] 正在连接 : 5151 -> 10.75.213.241:3001
2023-12-22 14:49:45.202 [main]  INFO --- c.g.iot.vmp.service.impl.MediaServerServiceImpl: 566 [ZLM] 正在设置 :5151 -> 10.75.213.241:3001
2023-12-22 14:49:45.206 [main]  INFO --- c.g.iot.vmp.service.impl.MediaServerServiceImpl: 625 [ZLM] 设置成功 5151 -> 10.75.213.241:3001
2023-12-22 14:49:45.212 [main]  INFO --- c.g.iot.vmp.service.impl.MediaServerServiceImpl: 442 [ZLM] 连接成功 5151 - 10.75.213.241:3001 
2023-12-22 14:49:45.216 [wvp-1]  INFO --- c.g.iot.vmp.media.zlm.event.ZLMStatusEventListener: 42 [ZLM] 上线 ID:5151
2023-12-22 14:49:45.255 [main]  INFO --- com.genersoft.iot.vmp.conf.CivilCodeFileConf: 79 [行政区划] 加载成功,共加载数据3219条
2023-12-22 14:49:45.257 [main]  INFO --- com.genersoft.iot.vmp.VManageBootstrap: 37 构建版本: 2.6.9
2023-12-22 14:49:45.257 [main]  INFO --- com.genersoft.iot.vmp.VManageBootstrap: 38 构建时间: 20231222
2023-12-22 14:49:45.257 [main]  INFO --- com.genersoft.iot.vmp.VManageBootstrap: 39 GIT最后提交时间: 20231218
2023-12-22 14:49:47.478 [http-nio-3000-exec-1]  INFO --- o.a.c.core.ContainerBase.[Tomcat].[localhost].[/]: 173 Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-12-22 14:49:47.479 [http-nio-3000-exec-1]  INFO --- org.springframework.web.servlet.DispatcherServlet: 525 Initializing Servlet 'dispatcherServlet'
2023-12-22 14:49:47.480 [http-nio-3000-exec-1]  INFO --- org.springframework.web.servlet.DispatcherServlet: 547 Completed initialization in 1 ms
2023-12-22 14:50:00.000 [scheduled-task-pool-2]  INFO --- com.genersoft.iot.vmp.gb28181.event.SipSubscribe: 41 [定时任务] 清理过期的SIP订阅信息
2023-12-22 15:02:30.938 [http-nio-3000-exec-9]  INFO --- c.g.i.v.vmanager.streamProxy.StreamProxyController: 86 添加代理: {"app":"live","enable":true,"enableAudio":true,"enableDisableNoneReader":false,"enableMp4":false,"enableRemoveNoneReader":false,"ffmpegCmdKey":"ffmpeg.cmd","gbStreamId":0,"latitude":0.0,"longitude":0.0,"mediaServerId":"5151","name":"test","status":false,"stream":"kjg","timeoutMs":0,"type":"default","url":"rtsp://admin:sjzn2018@10.75.213.235:30554/Streaming/Channels/101"}
2023-12-22 15:02:30.941 [http-nio-3000-exec-9]  INFO --- c.g.iot.vmp.service.impl.StreamProxyServiceImpl: 160 [拉流代理] 输出地址为:rtsp://127.0.0.1:554/live/kjg
2023-12-22 15:02:37.950 [ThreadPoolTaskScheduler-108]  INFO --- c.g.i.v.vmanager.streamProxy.StreamProxyController: 121 [拉流代理] 失败: 超时
2023-12-22 15:02:40.952 [http-nio-3000-exec-9] ERROR --- com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils: 112 [ http://10.75.213.241:3001/index/api/addStreamProxy ]请求失败: timeout
2023-12-22 15:02:40.975 [http-nio-3000-exec-9] ERROR --- com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils: 116 读取ZLM数据失败: http://10.75.213.241:3001/index/api/addStreamProxy, timeout
addStreamProxyToZlm====
code=-2 msg=流媒体调用失败
2023-12-22 15:02:40.980 [http-nio-3000-exec-9]  INFO --- c.g.i.v.vmanager.streamProxy.StreamProxyController: 121 [拉流代理] 失败: 流媒体调用失败
2023-12-22 15:03:26.601 [http-nio-3000-exec-2]  INFO --- c.g.i.v.vmanager.streamProxy.StreamProxyController: 166 启用代理: live/kjg
addStreamProxyToZlm====
code=-1 msg=This stream already exists
2023-12-22 15:03:26.611 [http-nio-3000-exec-2]  INFO --- c.g.iot.vmp.service.impl.StreamProxyServiceImpl: 407 启用代理失败: live/kjg->This stream already exists(rtsp://admin:sjzn2018@10.75.213.235:30554/Streaming/Channels/101)
2023-12-22 15:05:00.000 [scheduled-task-pool-8]  INFO --- com.genersoft.iot.vmp.gb28181.event.SipSubscribe: 41 [定时任务] 清理过期的SIP订阅信息
2023-12-22 15:06:24.000 [http-nio-3000-exec-7]  INFO --- c.g.i.v.vmanager.streamProxy.StreamProxyController: 152 移除代理: live/kjg
2023-12-22 15:06:24.015 [http-nio-3000-exec-7]  INFO --- c.g.iot.vmp.service.impl.StreamProxyServiceImpl: 388 [移除代理]: 代理: live/kjg, 从zlm移除失败

wvp的配置文件

spring:
    # 上传文件大小限制
    servlet:
        multipart:
            max-file-size: 10MB
            max-request-size: 100MB
    # REDIS数据库配置
    redis:
        # [必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1
        host: ${REDIS_HOST:0.0.0.0}
        # [必须修改] 端口号
        port: ${REDIS_PORT:6379}
        # [可选] 数据库 DB
        database: ${REDIS_DB:6}
        # [可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接
        password: ${REDIS_PWD:root}
        # [可选] 超时时间
        timeout: 10000
    # [必选] jdbc数据库配置
    datasource:
        # 使用mysql 打开23-28行注释, 删除29-36行
         name: wvp
         url: jdbc:mysql://${WVP_DB_PATH}?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&allowMultiQueries=true&useSSL=false&allowMultiQueries=true
         username: ${MYSQL_USERNAME}
         password: ${MYSQL_PASSWORD}
         type: com.zaxxer.hikari.HikariDataSource
         driver-class-name: com.mysql.cj.jdbc.Driver

# [可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口
server:
    port: 3000

# 作为28181服务器的配置
sip:
    # [必须修改] 本机的IP,对应你的网卡,监听什么ip就是使用什么网卡,
    # 如果要监听多张网卡,可以使用逗号分隔多个IP, 例如: 192.168.1.4,10.0.0.4
    # 如果不明白,就使用0.0.0.0,大部分情况都是可以的
    # 请不要使用127.0.0.1,任何包括localhost在内的域名都是不可以的。
    ip: ${SIP_HOST:0.0.0.0}
    # [可选] 28181服务监听的端口
    port: ${SIP_PORT:5060}
    # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007)
    # 后两位为行业编码,定义参照附录D.3
    # 3701020049标识山东济南历下区 信息行业接入
    # [可选]
    domain: ${SIP_DOMAIN:4103050000}
    # [可选]
    id: ${SIP_ID:41030500002000000001}
    # [可选] 默认设备认证密码,后续扩展使用设备单独密码, 移除密码将不进行校验
    password: ${SIP_PASSWORD:sjzn2018}

#zlm 默认服务器配置
media:
    # [必须修改] zlm服务器唯一id,用于触发hook时区别是哪台服务器,general.mediaServerId
    id: 5151
    # [必须修改] zlm服务器的内网IP
    ip: ${ZLM_HOST:10.75.213.241}
    # [必须修改] zlm服务器的http.port
    http-port: ${ZLM_PORT:3001}
    # [可选] zlm服务器的hook.admin_params=secret
    secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cd
    # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试
    rtp:
        # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输
        enable: true
        # [可选] 在此范围内选择端口用于媒体流传输,
        port-range: 30000,30500 # 端口范围
        # [可选] 国标级联在此范围内选择端口发送媒体流,
        send-port-range: 30000,30500 # 端口范围
    # 录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用
    record-assist-port: ${ASSIST_PORT:0}
    sdp-ip: ${SDP_IP:10.75.213.241}
    stream-ip: ${STREAM_HOST:10.75.213.241}
    # [可选] zlm服务器的hook所使用的IP, 默认使用sip.ip
    hook-ip: ${HOOK_IP:10.75.213.241}

# [根据业务需求配置]
user-settings:
    # 推流直播是否录制
    record-push-live: true
    auto-apply-play: true

zlm的配置:

; auto-generated by mINI class {

[api]
apiDebug=1
defaultSnap=./www/logo.png
downloadRoot=./www
secret=035c73f7-bb6b-4889-a715-d9eb2d1925cd
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]
check_nvidia_dev=1
enableVhost=0
enable_ffmpeg_log=0
flowThreshold=1024
maxStreamWaitMS=15000
mediaServerId=5151
mergeWriteMS=0
resetWhenRePlay=1
streamNoneReaderDelayMS=20000
unready_frame_cache=100
wait_add_track_ms=3000
wait_track_ready_ms=10000

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

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

[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:9933398/2023-12-13T17:41:57+08:00,branch:master,build time:2023-12-13T09:43:42)</center></body></html>
port=80
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
fastStart=0
fileBufSize=65536
fileRepeat=0
sampleMS=500

[rtc]
externIP=10.75.213.241
max_bitrate=0
min_bitrate=0
port=8000
preferredCodecA=PCMU,PCMA,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
opus_pt=100
port=10000
port_range=30000-30500
ps_pt=96
timeoutSec=15

[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
pktBufSize=8192
port=9000
timeoutSec=5

; } ---

环境变量:

# 设置容器默认时区为中国时区
TZ=Asia/Shanghai
# 数据保存基础路径, 默认当前文件夹
BASE_PATH=.

# redis设置
REDIS_HOST=redis
REDIS_PASSWORD=sjzn2018
REDIS_DATA=${BASE_PATH}/redis/data
REDIS_LOG=${BASE_PATH}/redis/log
REDIS_PORT=6379

# mysql设置
MYSQL_HOST=mysql
MYSQL_USERNAME=root
MYSQL_PASSWORD=sjzn2018
MYSQL_PORT=3306
WVP_DB=wvp

# !!!重要,这是sql管理必须属性!!!
DATABASE_URL=mysql://${MYSQL_USERNAME}:${MYSQL_PASSWORD}@${MYSQL_HOST}:${MYSQL_PORT}/${WVP_DB}

#  需要与config.ini 中 [rtp_proxy].port保持一致, 部署时需要放通该端口
STREAM_PORT=30000-30500

# 编码查询地址 http://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=C9C488FD717AFDCD52157F41C3302C6D
SIP_DOMAIN=4103050000
# 录像机将200替换为118,最后一位从1开始编号

# 摄像头编号将200替换为132,最后一位从1开始编号
SIP_ID=${SIP_DOMAIN}2000000001

# wvp生成播放连接用的地址, 可以是域名可以是宿主机或者zlm公网IP
STREAM_HOST=10.75.213.241

# 信令IP,填宿主机IP, 需要摄像头能访问到
SIP_HOST=0.0.0.0

SHOW_IP=10.75.213.241

# [可选] wvp在国标信令中使用的ip,此ip为摄像机可以访问到的ip, 置空使用 media.ip
SDP_IP=10.75.213.241
HOOK_IP=10.75.213.241

# SIP连接密码,强烈建议覆写!!!
SIP_PASSWORD=sjzn2018

# ZLM 的IP
ZLM_IP=zlm

# wvp服务ip,用于ZLM触发HOOK
WVP_IP=wvp

# wvp用Mysql连接
WVP_DB_PATH=${MYSQL_HOST}:${MYSQL_PORT}/${WVP_DB}

# 该变量需要与wvp/config/config.ini中[http].port保持一致, 不在配置, 默认80
# ZLM_PORT=80

# wvp的Http/web服务端口, 不在配置, 默认80
# WVP_PORT=8080

# 录像端口, 默认不启用
ASSIST_PORT=0
# 录像保存地址
RECORD_PATH=${BASE_PATH}/media/record

# druid 配置
DRUID_USER=rjAdmin
DRUID_PASS=rj@2022

JT1078_PORT=21078
JT1078_PASS=admin123
648540858 commented 8 months ago

拉流代理是由服务器拉起你的视频流的,也就是说的服务器必须得能访问到你的视频流。

SugaraguS commented 8 months ago

拉流代理是由服务器拉起你的视频流的,也就是说的服务器必须得能访问到你的视频流。

通过postman直接调用zlm接口是可以创建成功的,但是通过wvp调用zlm的时候貌似是提示超时了

2023-12-22 15:02:30.938 [http-nio-3000-exec-9]  INFO --- c.g.i.v.vmanager.streamProxy.StreamProxyController: 86 添加代理: {"app":"live","enable":true,"enableAudio":true,"enableDisableNoneReader":false,"enableMp4":false,"enableRemoveNoneReader":false,"ffmpegCmdKey":"ffmpeg.cmd","gbStreamId":0,"latitude":0.0,"longitude":0.0,"mediaServerId":"5151","name":"test","status":false,"stream":"kjg","timeoutMs":0,"type":"default","url":"rtsp://admin:sjzn2018@10.75.213.235:30554/Streaming/Channels/101"}
2023-12-22 15:02:30.941 [http-nio-3000-exec-9]  INFO --- c.g.iot.vmp.service.impl.StreamProxyServiceImpl: 160 [拉流代理] 输出地址为:rtsp://127.0.0.1:554/live/kjg
2023-12-22 15:02:37.950 [ThreadPoolTaskScheduler-108]  INFO --- c.g.i.v.vmanager.streamProxy.StreamProxyController: 121 [拉流代理] 失败: 超时
2023-12-22 15:02:40.952 [http-nio-3000-exec-9] ERROR --- com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils: 112 [ http://10.75.213.241:3001/index/api/addStreamProxy ]请求失败: timeout
2023-12-22 15:02:40.975 [http-nio-3000-exec-9] ERROR --- com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils: 116 读取ZLM数据失败: http://10.75.213.241:3001/index/api/addStreamProxy, timeout
648540858 commented 8 months ago

那就需要比对下wvp调用和你手动调用的时候参数的区别了

ytlibin commented 8 months ago

解决了吗 我也有同样的问题

ahhyong commented 7 months ago

遇到同样问题,通过PotPlayer可以打开rtsp地址,能正常播放,但是启动拉流报一样的错误。 观察到是10秒超时,我把配置中所有涉及到10秒超时的地方都改了, 还是不行

648540858 commented 7 months ago

关注下hook是否正常,wvp调用zlm接口后会根据hook结果判断是否成功的