修复在线导致的一个 Bug

This commit is contained in:
2025-12-26 16:58:12 +08:00
parent 93782bcdf1
commit 83ad6221a4
6 changed files with 190 additions and 10 deletions

View File

@@ -12,8 +12,26 @@
/// <para>✅ [Bug π] 管道安全Dispose 采用优雅关闭策略,确保剩余状态消息被消费</para>
/// <para>✅ [编译修复] 补全 CloneConfig 中 Transport/VendorArguments 的深拷贝逻辑</para>
/// </summary>
public abstract class BaseVideoSource : IVideoSource, IAsyncDisposable
public abstract class BaseVideoSource : IVideoSource, IAsyncDisposable, IDeviceConnectivity
{
// [新增] 物理在线状态(专门给 Ping 使用)
private volatile bool _isPhysicalOnline;
public bool IsPhysicalOnline => _isPhysicalOnline;
string IDeviceConnectivity.IpAddress => _config.IpAddress;
// 允许哨兵从外部更新 _isOnline 字段
void IDeviceConnectivity.SetNetworkStatus(bool isOnline)
{
if (_isPhysicalOnline != isOnline)
{
_isPhysicalOnline = isOnline;
// 触发状态变更是为了通知 UI 更新绿色小圆点,但不改变 Status
// 注意:这里传 _status 保持原样,只变消息
StatusChanged?.Invoke(this, new StatusChangedEventArgs(_status, isOnline ? "物理网络恢复" : "物理网络中断"));
}
}
#region --- 1. (Core Config & Locks) ---
/// <summary>
@@ -256,13 +274,17 @@ public abstract class BaseVideoSource : IVideoSource, IAsyncDisposable
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(15));
await OnStartAsync(cts.Token).ConfigureAwait(false);
// ============================================================
// 【核心修复位置】
// 赋予心跳 5 秒的宽限期 (Grace Period)
// 这样 Coordinator 在未来 5 秒内计算出来的无帧时间将是负数或极小值,不会触发复位
// ============================================================
Interlocked.Exchange(ref _lastFrameTick, Environment.TickCount64 + 5000);
// 标记运行状态
_isOnline = true;
IsRunning = true;
// 初始化心跳:给予 2 秒宽限期,防止刚启动被判定为僵死
Interlocked.Exchange(ref _lastFrameTick, Environment.TickCount64 + 2000);
// 更新状态为播放中,并刷新元数据
UpdateStatus(VideoSourceStatus.Playing, "流传输正常运行");
await RefreshMetadataAsync().ConfigureAwait(false);