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.85k stars 1.44k forks source link

设备一段时间后自动离线,停止视频流的时候发现事务已丢失 #469

Closed moyidaren closed 2 years ago

moyidaren commented 2 years ago

一、描述错误 设备一段时间后自动离线,停止视频流的时候发现事务已丢失 二、如何复现 一段时间后使用[http://192.168.0.118:18080/api/play/stop/34020000113000000001/43010120001320000018 直接返回success 但未执行实际的视频流关闭sip信令,查看日志发现提示“停止视频流的时候发现事务已丢失” 三、预期行为 1、需要能够保证设备稳定在线,能否将事务和发起实际的停止视频流解绑,这样事务被删除了也可以发指令 2、或者能否说明一下,什么情况下设备会自动离线,keeplive超时设置成3600s依然一段时间后就自己离线了,提示sip订阅消息定期清理,然后接着就开始离线,删事务,前面的版本好像没有这个问题 四、环境信息 1、部署方式 (1)编译wvp-pro(https://github.com/648540858/wvp-GB28181-pro/commit/c286ecb455444af7b4d27683853cb1295ffc3c49) (2)编译zlm-server(5e08e43e9a1fb7dcdcb5b94231f61d9e86d108ba) (3)application-dev.yml spring:

[可选]上传文件大小限制

servlet: multipart: max-file-size: 10MB max-request-size: 100MB

REDIS数据库配置

redis:

[必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1

host: 127.0.0.1

[必须修改] 端口号

port: 6379

[可选] 数据库 DB

database: 6

[可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接

password: 123456

[可选] 超时时间

timeout: 10000

[可选] jdbc数据库配置, 项目使用sqlite作为数据库,一般不需要配置

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?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false username: root password: 123456 druid: initialSize: 10 # 连接池初始化连接数 maxActive: 200 # 连接池最大连接数 minIdle: 5 # 连接池最小空闲连接数 maxWait: 60000 # 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 keepAlive: true # 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。 validationQuery: select 1 # 检测连接是否有效sql,要求是查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 testWhileIdle: true # 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 testOnBorrow: false # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 testOnReturn: false # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 poolPreparedStatements: false # 是否開啟PSCache,並且指定每個連線上PSCache的大小 timeBetweenEvictionRunsMillis: 60000 # 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一個連線在池中最小生存的時間,單位是毫秒 filters: stat,wall,slf4j # 配置监控统计拦截的filters,监控统计用的filter:sta, 日志用的filter:log4j, 防御sql注入的filter:wall useGlobalDataSourceStat: true # 合并多个DruidDataSource的监控数据

通过connectProperties属性来打开mergeSql功能;慢SQL记录

connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=1000

stat-view-servlet.url-pattern: /admin/druid/*

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

server: port: 18080

作为28181服务器的配置

sip:

[必须修改] 本机的IP

ip: 192.168.0.118

[可选] 28181服务监听的端口

port: 15060

根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007)

后两位为行业编码,定义参照附录D.3

3701020049标识山东济南历下区 信息行业接入

[可选]

domain: 3402000000

[可选]

id: 34020000002000000001

[可选] 默认设备认证密码,后续扩展使用设备单独密码, 移除密码将不进行校验

password: 12345678

[可选] 心跳超时时间, 建议设置为心跳周期的三倍

keepalive-timeout: 255

[可选] 国标级联注册失败,再次发起注册的时间间隔。 默认60秒

register-time-interval: 60

[可选] 云台控制速度

ptz-speed: 50

TODO [可选] 收到心跳后自动上线, 重启服务后会将所有设备置为离线,默认false,等待注册后上线。设置为true则收到心跳设置为上线。

keepalliveToOnline: false

是否存储alarm信息

alarm: false

zlm 默认服务器配置

media:

[必须修改] zlm服务器唯一id,用于触发hook时区别是哪台服务器,general.mediaServerId

id: FQ3TF8yT83wh5Wvz

[必须修改] zlm服务器的内网IP

ip: 192.168.0.118

[可选] 返回流地址时的ip,置空使用 media.ip

stream-ip:

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

sdp-ip:

[可选] zlm服务器的hook所使用的IP, 默认使用sip.ip

hook-ip:

[必须修改] zlm服务器的http.port

http-port: 8080

[可选] zlm服务器的http.sslport, 置空使用zlm配置文件配置

http-ssl-port:

[可选] zlm服务器的rtmp.port, 置空使用zlm配置文件配置

rtmp-port:

[可选] zlm服务器的rtmp.sslport, 置空使用zlm配置文件配置

rtmp-ssl-port:

[可选] zlm服务器的 rtp_proxy.port, 置空使用zlm配置文件配置

rtp-proxy-port:

[可选] zlm服务器的 rtsp.port, 置空使用zlm配置文件配置

rtsp-port:

[可选] zlm服务器的 rtsp.sslport, 置空使用zlm配置文件配置

rtsp-ssl-port:

[可选] 是否自动配置ZLM, 如果希望手动配置ZLM, 可以设为false, 不建议新接触的用户修改

auto-config: true

[可选] zlm服务器的hook.admin_params=secret

secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc

[可选] zlm服务器的general.streamNoneReaderDelayMS

stream-none-reader-delay-ms: -1 # 无人观看多久自动关闭流, -1表示永不自动关闭,即 关闭按需拉流

启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试

rtp:

[可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输

enable: true

[可选] 在此范围内选择端口用于媒体流传输, 必须提前在zlm上配置该属性,不然自动配置此属性可能不成功

port-range: 30000,30500 # 端口范围

[可选] 国标级联在此范围内选择端口发送媒体流,

send-port-range: 30000,30500 # 端口范围

录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用

record-assist-port: 0

[可选] 日志配置, 一般不需要改

logging: config: classpath:logback-spring-local.xml

[根据业务需求配置]

user-settings:

推流直播是否录制

record-push-live: false

国标是否录制

record-sip: false

版本信息, 不需修改

version: version: "@project.version@" description: "@project.description@" artifact-id: "@project.artifactId@"

(4)config.ini ; auto-generated by mINI class {

[api] apiDebug=1 defaultSnap=./www/logo.png secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc snapRoot=./www/snap/

[cluster] origin_url= timeout_sec=15

[ffmpeg] bin=./ffmpeg.exe cmd=%s -fflags nobuffer -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s log=./ffmpeg_log/ffmpeg.log restart_sec=0 snap=%s -i %s -y -f mjpeg -t 0.001 %s

[general] addMuteAudio=0 continue_push_ms=3000 enableVhost=0 enable_audio=1 flowThreshold=1024 fmp4_demand=0 hls_demand=0 maxStreamWaitMS=15000 mediaServerId=FQ3TF8yT83wh5Wvz mergeWriteMS=0 modifyStamp=0 publishToHls=0 publishToMP4=0 resetWhenRePlay=1 rtmp_demand=0 rtsp_demand=0 streamNoneReaderDelayMS=3600000 ts_demand=0 unready_frame_cache=100 wait_add_track_ms=3000 wait_track_ready_ms=3000

[hls] broadcastRecordTs=0 deleteDelaySec=0 fileBufSize=65536 filePath=./www segDur=2 segNum=3 segRetain=5

[hook] admin_params=secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc alive_interval=10.0 enable=1 on_flow_report= on_http_access= on_play=http://192.168.0.118:18080/index/hook/on_play on_publish=http://192.168.0.118:18080/index/hook/on_publish on_record_mp4= on_record_ts= on_rtsp_auth= on_rtsp_realm= on_server_keepalive=http://192.168.0.118:18080/index/hook/on_server_keepalive on_server_started=http://192.168.0.118:18080/index/hook/on_server_started on_shell_login=http://192.168.0.118:18080/index/hook/on_shell_login on_stream_changed=http://192.168.0.118:18080/index/hook/on_stream_changed on_stream_none_reader=http://192.168.0.118:18080/index/hook/on_stream_none_reader on_stream_not_found=http://192.168.0.118:18080/index/hook/on_stream_not_found timeoutSec=20

[http] charSet=utf-8 dirMenu=1 forbidCacheSuffix= keepAliveSecond=30 maxReqSize=40960 notFound= port=8080 rootPath=./www sendBufSize=65536 sslport=8090 virtualPath=

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

[record] appName=record fastStart=0 fileBufSize=65536 filePath=./www fileRepeat=0 fileSecond=3600 sampleMS=500

[rtc] externIP= port=8000 preferredCodecA=PCMA,PCMU,opus,mpeg4-generic preferredCodecV=H264,H265,AV1X,VP9,VP8 rembBitRate=0 timeoutSec=15

[rtmp] handshakeSecond=15 keepAliveSecond=15 modifyStamp=0 port=1935 sslport=0

[rtp] audioMtuSize=600 rtpMaxSize=10 videoMtuSize=1400

[rtp_proxy] dumpDir= port=10000 port_range=30000-30500 timeoutSec=15

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

[shell] maxReqSize=1024 port=0

; } ---

2、部署环境 windows 环境 3、端口开放情况 全通 4、是否是公网部署 否,本地局域网部署 5、是否使用https 否,http 6、方便的话提供下使用的设备品牌或平台 海康IPC 7、你做过哪些尝试 使用其他型号28181设备

ycq323 commented 2 years ago

我也遇到这个问题了,新版有这个问题,以前的旧版没有。

648540858 commented 2 years ago
  1. 配置文件不要直接复制上来,没法看,你可以用``` 包裹下,
  2. 设备离线你要首先排查设备是否连接正常,看下页面的设备心跳消息是什么时间发送。
  3. 确认你的ipc的国标配置的注册有效期大于心跳间隔
  4. 可以直接抓包发出来
648540858 commented 2 years ago

我不会去对比前后版本的差异,只在当前版本解决问题。如果你遇到新版本有问题,旧版本没问题的情况:

  1. 你可以继续使用旧版,以便快速恢复使用,等待新版本修复此问题
  2. 积极配合作者再新版本解决该问题,我需要的不是配置文件,需要详尽的日志,细致的描述以及抓包,当然也需要你有足够的耐心。
moyidaren commented 2 years ago

@648540858 谢谢潘工回复 以后我会注意提issue的规范 详细的日志、流程、抓包 这个问题我已经差不多定位了 现在心跳正常的情况下 设备不会掉线了 你等我一下 我看看代码 再做一个定位前定位后的完整抓包分析实验

weideng365 commented 2 years ago

@648540858 谢谢潘工回复 以后我会注意提issue的规范 详细的日志、流程、抓包 这个问题我已经差不多定位了 现在心跳正常的情况下 设备不会掉线了 你等我一下 我看看代码 再做一个定位前定位后的完整抓包分析实验

我也遇到类似问题,播放一会直接后台报日志设备离线,其实设备好好的,感觉和你一样就是心跳问题导致的。

weideng365 commented 2 years ago

@648540858 谢谢潘工回复 以后我会注意提issue的规范 详细的日志、流程、抓包 这个问题我已经差不多定位了 现在心跳正常的情况下 设备不会掉线了 你等我一下 我看看代码 再做一个定位前定位后的完整抓包分析实验

我也遇到类似问题,播放一会直接后台报日志设备离线,其实设备好好的,感觉和你一样就是心跳问题导致的。

目前版本测试还是依旧有这个问题,我在本地测试没问题,发布到云上就会播放一会主动断开,过一会重新点播的时候 获取ZLM服务获取接收流的端口时,是IP:0,没有获取接收流的端口。

weideng365 commented 2 years ago

@648540858 谢谢潘工回复 以后我会注意提issue的规范 详细的日志、流程、抓包 这个问题我已经差不多定位了 现在心跳正常的情况下 设备不会掉线了 你等我一下 我看看代码 再做一个定位前定位后的完整抓包分析实验

我也遇到类似问题,播放一会直接后台报日志设备离线,其实设备好好的,感觉和你一样就是心跳问题导致的。

目前版本测试还是依旧有这个问题,我在本地测试没问题,发布到云上就会播放一会主动断开,过一会重新点播的时候 获取ZLM服务获取接收流的端口时,是IP:0,没有获取接收流的端口。

image image

648540858 commented 2 years ago

可以测试了,优化在线的流程。

648540858 commented 2 years ago

我先关闭了,仍有问题再打开

weideng365 commented 2 years ago

可以测试了,优化在线的流程。

经过测试确实修复了,但是这个版本和zlm webrtc后,一开始有掉线现象,启动的时候zlm在线列表也都有,但是过一会就说这无可用zlm服务,然后反复重启几次过后立马播放后就变正常了。

answer666 commented 5 months ago

可以测试了,优化在线的流程。

经过测试确实修复了,但是这个版本和zlm webrtc后,一开始有掉线现象,启动的时候zlm在线列表也都有,但是过一会就说这无可用zlm服务,然后反复重启几次过后立马播放后就变正常了。

请问你是设备在线了,然后又离线了吗? 我安装的设备最近一次心跳是3号, 不知道从哪看起,很多设备都离线了。。