1、解决使用 Cv2.ImShow 播放画面,闪烁一下窗口不见的问题

2、之前注册播放、分析帧,回调时必须判定是否当前注册源,现增加新方法可以不用判定
3、将之前程序一运行就播放,调整为手动指定 IsRunning 值来控制
This commit is contained in:
2025-12-26 06:14:55 +08:00
parent 6281f4248e
commit e9f5975a79
5 changed files with 226 additions and 137 deletions

View File

@@ -89,11 +89,11 @@ public class CameraManager : IDisposable, IAsyncDisposable
// 1. 全局驱动环境预初始化:初始化厂商 SDK 运行环境
HikSdkManager.Initialize();
// 2. 激活现有设备池中所有设备的“运行意图”,触发设备连接流程
foreach (var source in _cameraPool.Values)
{
source.IsRunning = true;
}
//// 2. 激活现有设备池中所有设备的“运行意图”,触发设备连接流程
//foreach (var source in _cameraPool.Values)
//{
// source.IsRunning = true;
//}
// 标记引擎启动状态,后续新增设备自动激活
_isEngineStarted = true;

View File

@@ -66,6 +66,29 @@ public static class GlobalStreamDispatcher
);
}
/// <summary>
/// [新增] 精准订阅:仅监听指定设备的特定 AppId 帧
/// 优势:内部自动过滤 DeviceId回调函数无需再写 if 判断
/// </summary>
/// <param name="appId">需求标识</param>
/// <param name="specificDeviceId">只接收此设备的帧</param>
/// <param name="handler">处理回调(注意:此处签名不含 deviceId因为已隐式确定</param>
public static void Subscribe(string appId, long specificDeviceId, Action<SmartFrame> handler)
{
// 创建一个“过滤器”闭包
Action<long, SmartFrame> wrapper = (id, frame) =>
{
// 只有当来源 ID 与订阅 ID 一致时,才触发用户的业务回调
if (id == specificDeviceId)
{
handler(frame);
}
};
// 将过滤器注册到基础路由表中
Subscribe(appId, wrapper);
}
/// <summary>
/// 取消订阅:移除指定 AppId 的帧处理回调
/// 线程安全:支持多线程并发调用,无订阅时静默处理