修复 Bug
This commit is contained in:
@@ -29,7 +29,8 @@ public class CameraCoordinator
|
||||
private readonly SemaphoreSlim _concurrencyLimiter = new(8);
|
||||
|
||||
/// <summary> 相机流存活判定阈值(秒):超过该时间无帧则判定为流中断 </summary>
|
||||
private const int StreamAliveThresholdSeconds = 5;
|
||||
/// 海康 SDK 建立连接+首帧到达通常需 4-8 秒。阈值低了会导致刚连上就被误判为僵死而强制断开。
|
||||
private const int StreamAliveThresholdSeconds = 15;
|
||||
|
||||
/// <summary> Ping 探测超时时间(毫秒) </summary>
|
||||
private const int PingTimeoutMs = 800;
|
||||
@@ -162,7 +163,7 @@ public class CameraCoordinator
|
||||
|
||||
double secondsSinceLastFrame = (nowTick - cam.LastFrameTick) / 1000.0;
|
||||
|
||||
// 2. 判定流是否正常:设备在线 + 5秒内有帧
|
||||
// 2. 判定流是否正常:设备在线 + 15秒内有帧
|
||||
bool isFlowing = cam.IsActived && secondsSinceLastFrame < StreamAliveThresholdSeconds;
|
||||
|
||||
// 3. 判定物理连接是否正常:流正常则直接判定在线;否则执行 Ping+TCP 探测
|
||||
@@ -185,6 +186,7 @@ public class CameraCoordinator
|
||||
// 双重校验:防止等待锁期间状态已变更
|
||||
if (!cam.IsActived)
|
||||
{
|
||||
// 记录启动时刻,elapsed 将重新计时
|
||||
cam.MarkStartAttempt();
|
||||
|
||||
try
|
||||
@@ -224,8 +226,20 @@ public class CameraCoordinator
|
||||
// 【关键修复】:增加了 && cam.IsRunning 判定,防止待机状态下被误复位
|
||||
else if (isPhysicalOk && cam.IsActived && !isFlowing && cam.IsRunning) // [cite: 504]
|
||||
{
|
||||
_sysLog.Warning($"[Coordinator] [自愈] 设备 {cam.Id} 僵死({secondsSinceLastFrame:F1}秒无帧),复位中...");
|
||||
await cam.StopAsync().ConfigureAwait(false);
|
||||
// Optimized: [修复无限重启] 增加“启动保护期”检查。
|
||||
// 原问题:相机刚 StartAsync 还在握手(例如第3秒),isFlowing 为 false,会导致立即被 Stop。
|
||||
// 新逻辑:只有当“启动已超过 15秒”且“依然没流”时,才判定为真正的僵死。
|
||||
|
||||
// elapsed 是毫秒,StreamAliveThresholdSeconds 是秒,需要换算
|
||||
if (elapsed > StreamAliveThresholdSeconds * 1000)
|
||||
{
|
||||
_sysLog.Warning($"[Coordinator] [自愈] 设备 {cam.Id} 僵死({secondsSinceLastFrame:F1}秒无帧),复位中...");
|
||||
await cam.StopAsync().ConfigureAwait(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
_sysLog.Debug($"[Coordinator] 设备 {cam.Id} 启动握手中 ({elapsed}ms),等待出流...");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user