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.59k stars 1.38k forks source link

[技术咨询] 通过ZLM hook 发起的点播请求在收流超时的情况下会进入异常状态 #1511

Open gzncland opened 1 week ago

gzncland commented 1 week ago

环境信息:

内容描述:

直接通过ZLM HOOK拉起的请求,在触发收流超时后,会进入一个再也无法分配ZLM的状态,直到去前端手动点播直到超时触发c.g.iot.vmp.vmanager.gb28181.play.PlayController: 100 [点播等待超时]这行log,下次再从HOOK拉起才可以正常播放。下方几段连续日志我做了分段,大概的流程为:

  1. (已经进入异常状态之后)ZLM HOOK发起自动点播,无反应
  2. 前端页面手动点播,无法观看画面,直到提示点播等待超时
  3. ZLM HOOK发起自动点播,此时可以正常分配收流端口及ZLM
  4. 前端页面再次点播,此时可以观看,关闭页面,ZLM HOOK返回无人观看并发送BYE
  5. 好了一段时间
  6. ZLM HOOK发起自动点播,但是这回收流超时。期间通过ZLM HOOK再次发起过一次自动点播
  7. ZLM发起自动点播,无反应(再次进入异常状态)

日志

  1. (已经进入异常状态之后)ZLM HOOK发起自动点播,无反应
2024-06-27 21:22:25.083 [http-nio-18080-exec-39]  INFO --- c.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener: 268 [ZLM HOOK] 流未找到:local-mediakit-server->rtmp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:22:25.106 [wvp-5]  INFO --- com.genersoft.iot.vmp.service.impl.PlayServiceImpl: 235 [ZLM HOOK] 预览流未找到, 发起自动点播:local-mediakit-server->rtmp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:22:25.203 [wvp-5]  INFO --- com.genersoft.iot.vmp.service.impl.PlayServiceImpl: 282 [点播开始] 已经请求中,等待结果, deviceId: 45010300071310002500, channelId: 45010300071310002502
  1. 前端页面手动点播,无法观看画面,直到提示点播等待超时
2024-06-27 21:22:56.118 [http-nio-18080-exec-11]  INFO --- c.g.iot.vmp.vmanager.gb28181.play.PlayController: 87 [开始点播] deviceId:45010300071310002500, channelId:45010300071310002502, 
2024-06-27 21:22:56.129 [http-nio-18080-exec-11]  INFO --- com.genersoft.iot.vmp.service.impl.PlayServiceImpl: 282 [点播开始] 已经请求中,等待结果, deviceId: 45010300071310002500, channelId: 45010300071310002502
2024-06-27 21:23:11.754 [http-nio-18080-exec-50]  INFO --- c.g.iot.vmp.vmanager.gb28181.play.PlayController: 100 [点播等待超时] deviceId:45010300071310002500, channelId:45010300071310002502, 
  1. ZLM HOOK发起自动点播,此时可以正常分配收流端口及ZLM
2024-06-27 21:24:25.110 [http-nio-18080-exec-14]  INFO --- c.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener: 268 [ZLM HOOK] 流未找到:local-mediakit-server->rtmp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:24:25.209 [wvp-10]  INFO --- com.genersoft.iot.vmp.service.impl.PlayServiceImpl: 235 [ZLM HOOK] 预览流未找到, 发起自动点播:local-mediakit-server->rtmp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:24:25.319 [wvp-10]  INFO --- com.genersoft.iot.vmp.service.impl.PlayServiceImpl: 467 [点播开始] deviceId: 45010300071310002500, channelId: 45010300071310002502,码流类型:null, 收流端口: 33246, 码流:45010300071310002500_45010300071310002502, 收流模式:UDP, SSRC: 0103007004, SSRC校验:true
2024-06-27 21:24:25.321 [wvp-10]  INFO --- c.g.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander: 276 45010300071310002500_45010300071310002502 分配的ZLM为: local-mediakit-server [10.33.0.88:33246]
2024-06-27 21:24:29.716 [http-nio-18080-exec-20]  INFO --- c.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener: 220 [ZLM HOOK] 流注册, local-mediakit-server->rtsp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:24:29.717 [wvp-13]  INFO --- c.g.i.v.media.service.impl.MediaServerServiceImpl: 97 流变化:注册 app->rtp, stream->45010300071310002500_45010300071310002502

4.前端页面再次点播,此时可以观看,关闭页面,ZLM HOOK返回无人观看并发送BYE

2024-06-27 21:24:46.015 [http-nio-18080-exec-11]  INFO --- c.g.iot.vmp.vmanager.gb28181.play.PlayController: 87 [开始点播] deviceId:45010300071310002500, channelId:45010300071310002502, 
2024-06-27 21:24:46.052 [http-nio-18080-exec-11]  INFO --- com.genersoft.iot.vmp.service.impl.PlayServiceImpl: 304 [点播已存在] 直接返回, deviceId: 45010300071310002500, channelId: 45010300071310002502
2024-06-27 21:27:07.096 [http-nio-18080-exec-37]  INFO --- c.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener: 240 [ZLM HOOK]流无人观看:local-mediakit-server->rtmp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:27:07.107 [http-nio-18080-exec-37]  INFO --- c.g.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander: 674 [发送BYE] 设备: device: 45010300071310002500, channel: 45010300071310002502, callId: 526e9709dd7b8a93fab86ade540123a7@0.0.0.0
2024-06-27 21:27:07.124 [http-nio-18080-exec-46]  INFO --- c.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener: 224 [ZLM HOOK] 流注销, local-mediakit-server->rtsp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:27:07.126 [wvp-5]  INFO --- c.g.i.v.media.service.impl.MediaServerServiceImpl: 111 流变化:注销, app->rtp, stream->45010300071310002500_45010300071310002502
2024-06-27 21:27:07.207 [wvp-3]  INFO --- c.g.iot.vmp.storager.impl.RedisCatchStorageImpl: 330 [redis 流变化事件] 发送 WVP_MSG_STREAM_CHANGE_RTP: {"serverId":"000000","app":"rtp","stream":"45010300071310002500_45010300071310002502","register":false,"mediaServerId":"local-mediakit-server"}
2024-06-27 21:27:07.209 [http-nio-18080-exec-37]  INFO --- c.g.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander: 674 [发送BYE] 设备: device: 45010300071310002500, channel: 45010300071310002502, callId: 5ddce5e0607c6d54521e78f3aa00b5dd@0.0.0.0
  1. 正常了一段时间
2024-06-27 21:30:25.085 [http-nio-18080-exec-48]  INFO --- c.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener: 268 [ZLM HOOK] 流未找到:local-mediakit-server->rtmp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:30:25.112 [wvp-2]  INFO --- com.genersoft.iot.vmp.service.impl.PlayServiceImpl: 235 [ZLM HOOK] 预览流未找到, 发起自动点播:local-mediakit-server->rtmp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:30:25.321 [wvp-2]  INFO --- com.genersoft.iot.vmp.service.impl.PlayServiceImpl: 467 [点播开始] deviceId: 45010300071310002500, channelId: 45010300071310002502,码流类型:null, 收流端口: 33220, 码流:45010300071310002500_45010300071310002502, 收流模式:UDP, SSRC: 0103006527, SSRC校验:true
2024-06-27 21:30:25.322 [wvp-2]  INFO --- c.g.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander: 276 45010300071310002500_45010300071310002502 分配的ZLM为: local-mediakit-server [10.33.0.88:33220]
2024-06-27 21:30:25.702 [http-nio-18080-exec-9]  INFO --- c.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener: 220 [ZLM HOOK] 流注册, local-mediakit-server->rtsp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:30:25.704 [wvp-26]  INFO --- c.g.i.v.media.service.impl.MediaServerServiceImpl: 97 流变化:注册 app->rtp, stream->45010300071310002500_45010300071310002502
2024-06-27 21:30:55.669 [http-nio-18080-exec-8]  INFO --- c.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener: 240 [ZLM HOOK]流无人观看:local-mediakit-server->rtmp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:30:55.677 [http-nio-18080-exec-8]  INFO --- c.g.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander: 674 [发送BYE] 设备: device: 45010300071310002500, channel: 45010300071310002502, callId: 368a2c4a086fd6b8308672efb84c7eb0@0.0.0.0
2024-06-27 21:30:55.689 [http-nio-18080-exec-20]  INFO --- c.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener: 224 [ZLM HOOK] 流注销, local-mediakit-server->rtsp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:30:55.691 [wvp-17]  INFO --- c.g.i.v.media.service.impl.MediaServerServiceImpl: 111 流变化:注销, app->rtp, stream->45010300071310002500_45010300071310002502
2024-06-27 21:30:55.705 [wvp-21]  INFO --- c.g.iot.vmp.storager.impl.RedisCatchStorageImpl: 330 [redis 流变化事件] 发送 WVP_MSG_STREAM_CHANGE_RTP: {"serverId":"000000","app":"rtp","stream":"45010300071310002500_45010300071310002502","register":false,"mediaServerId":"local-mediakit-server"}
  1. ZLM HOOK发起自动点播,但是这回收流超时。期间通过ZLM HOOK再次发起过一次自动点播
2024-06-27 21:32:25.091 [http-nio-18080-exec-46]  INFO --- c.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener: 268 [ZLM HOOK] 流未找到:local-mediakit-server->rtmp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:32:25.112 [wvp-13]  INFO --- com.genersoft.iot.vmp.service.impl.PlayServiceImpl: 235 [ZLM HOOK] 预览流未找到, 发起自动点播:local-mediakit-server->rtmp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:32:25.320 [wvp-13]  INFO --- com.genersoft.iot.vmp.service.impl.PlayServiceImpl: 467 [点播开始] deviceId: 45010300071310002500, channelId: 45010300071310002502,码流类型:null, 收流端口: 33244, 码流:45010300071310002500_45010300071310002502, 收流模式:UDP, SSRC: 0103003087, SSRC校验:true
2024-06-27 21:32:25.403 [wvp-13]  INFO --- c.g.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander: 276 45010300071310002500_45010300071310002502 分配的ZLM为: local-mediakit-server [10.33.0.88:33244]
2024-06-27 21:32:40.100 [http-nio-18080-exec-4]  INFO --- c.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener: 268 [ZLM HOOK] 流未找到:local-mediakit-server->rtmp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:32:40.112 [wvp-6]  INFO --- com.genersoft.iot.vmp.service.impl.PlayServiceImpl: 235 [ZLM HOOK] 预览流未找到, 发起自动点播:local-mediakit-server->rtmp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:32:40.207 [wvp-6]  INFO --- com.genersoft.iot.vmp.service.impl.PlayServiceImpl: 282 [点播开始] 已经请求中,等待结果, deviceId: 45010300071310002500, channelId: 45010300071310002502
2024-06-27 21:32:40.322 [http-nio-18080-exec-53]  INFO --- c.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener: 339 [ZLM HOOK] rtpServer收流超时:local-mediakit-server->45010300071310002500_45010300071310002502(103003087)
2024-06-27 21:32:40.405 [ThreadPoolTaskScheduler-206]  INFO --- com.genersoft.iot.vmp.service.impl.PlayServiceImpl: 494 [点播超时] 收流超时 deviceId: 45010300071310002500, channelId: 45010300071310002502,码流:null,端口:33244, SSRC: 0103003087
  1. ZLM发起自动点播,无反应(再次进入异常状态)
2024-06-27 21:34:25.120 [http-nio-18080-exec-46]  INFO --- c.genersoft.iot.vmp.media.zlm.ZLMHttpHookListener: 268 [ZLM HOOK] 流未找到:local-mediakit-server->rtmp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:34:25.125 [wvp-2]  INFO --- com.genersoft.iot.vmp.service.impl.PlayServiceImpl: 235 [ZLM HOOK] 预览流未找到, 发起自动点播:local-mediakit-server->rtmp->rtp/45010300071310002500_45010300071310002502
2024-06-27 21:34:25.310 [wvp-2]  INFO --- com.genersoft.iot.vmp.service.impl.PlayServiceImpl: 282 [点播开始] 已经请求中,等待结果, deviceId: 45010300071310002500, channelId: 45010300071310002502
gzncland commented 1 week ago

我看了一下代码好像是因为自动点播的callback是空导致的 PlayServiceImpl.java : 236

play(event.getMediaServer(), deviceId, channelId, null, null);

后面收流超时会调用

callback.run(InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getCode(), InviteErrorCode.ERROR_FOR_STREAM_TIMEOUT.getMsg(), null);

这句如果爆了空指针后面的释放流程就不执行了

Lichu520 commented 3 days ago

我也有这个问题,已经排查了3天了,求解。