diff --git a/SHH.CameraSdk/Abstractions/Enums/DeviceBrand.cs b/SHH.CameraSdk/Abstractions/Enums/DeviceBrand.cs
new file mode 100644
index 0000000..4349a21
--- /dev/null
+++ b/SHH.CameraSdk/Abstractions/Enums/DeviceBrand.cs
@@ -0,0 +1,62 @@
+namespace SHH.CameraSdk;
+
+///
+/// 视频源物理/逻辑品牌类型
+/// 职责:用于工厂模式匹配具体的 IVideoSource 实现类,并定义基础通信协议栈
+///
+public enum DeviceBrand
+{
+ ///
+ /// 未知
+ ///
+ Unknown = 0,
+
+ ///
+ /// 海康威视 (HikVision)
+ /// 技术路径:基于海康私有 SDK (HCNetSDK.dll / PlayCtrl.dll)。
+ /// 特性:支持全功能控制(PTZ、对讲、配置、报警回传)。
+ ///
+ HikVision,
+
+ ///
+ /// 大华 (Dahua)
+ /// 技术路径:基于大华私有 SDK (dhnetsdk.dll / dhplay.dll)。
+ /// 特性:支持全功能控制,与海康私有协议不兼容。
+ ///
+ Dahua,
+
+ ///
+ /// USB 摄像头 / 虚拟摄像头
+ /// 技术路径:基于 DirectShow 或 Windows Media Foundation。
+ /// 特性:通常通过 OpenCV (VideoCapture) 或 DirectShowLib 直接读取本地硬件引用。
+ ///
+ Usb,
+
+ ///
+ /// 标准 RTSP 流媒体
+ /// 技术路径:基于标准 RTSP/RTP 协议 (RFC 2326)。
+ /// 特性:跨品牌兼容,通常使用 FFmpeg 或 GStreamer 库取流,仅支持音视频,不支持云台控制。
+ ///
+ RtspGeneral,
+
+ ///
+ /// 三恒自研 WebSocket 流
+ /// 技术路径:基于 WebSocket 传输的自定义二进制或 Base64 帧。
+ /// 特性:专用于 Web 或云端推送场景的私有流媒体格式。
+ ///
+ WebSocketShine,
+
+ ///
+ /// 本地视频文件
+ /// 技术路径:基于文件 IO 的离线解码。
+ /// 特性:常用于算法演示、回放模拟,支持 Mp4, Avi, Mkv 等容器格式。
+ ///
+ File,
+
+ ///
+ /// 未知/通用标准 (ONVIF)
+ /// 技术路径:基于标准 ONVIF WebService。
+ /// 特性:用于接入非主流厂商但符合 ONVIF 标准的设备,支持基础 PTZ。
+ ///
+ OnvifGeneral
+}
\ No newline at end of file
diff --git a/SHH.CameraSdk/Abstractions/Enums/TransportProtocol.cs b/SHH.CameraSdk/Abstractions/Enums/TransportProtocol.cs
new file mode 100644
index 0000000..b8ecbe8
--- /dev/null
+++ b/SHH.CameraSdk/Abstractions/Enums/TransportProtocol.cs
@@ -0,0 +1,16 @@
+namespace SHH.CameraSdk;
+
+///
+/// 网络传输协议类型
+///
+public enum TransportProtocol
+{
+ /// 可靠传输 (默认)
+ Tcp = 0,
+
+ /// 快速传输 (可能丢包/花屏)
+ Udp = 1,
+
+ /// 组播 (节省带宽)
+ Multicast = 2
+}
\ No newline at end of file
diff --git a/SHH.CameraSdk/Abstractions/Enums/VideoSourceStatus.cs b/SHH.CameraSdk/Abstractions/Enums/VideoSourceStatus.cs
new file mode 100644
index 0000000..b50e653
--- /dev/null
+++ b/SHH.CameraSdk/Abstractions/Enums/VideoSourceStatus.cs
@@ -0,0 +1,57 @@
+namespace SHH.CameraSdk;
+
+///
+/// 视频源逻辑状态枚举
+/// 描述了从配置加载到视频流稳定输出的完整生命周期
+///
+public enum VideoSourceStatus
+{
+ ///
+ /// 已断开/初始状态。
+ /// 此时资源已释放,尚未执行 Login 或 Start 操作。
+ ///
+ Disconnected,
+
+ ///
+ /// 正在尝试建立网络连接。
+ /// 此时正在进行 Socket 握手或探测设备 IP 是否可达。
+ ///
+ Connecting,
+
+ ///
+ /// 正在进行身份验证。
+ /// 连接已建立,正在提交 UserName/Password 调用 SDK 的 Login 接口。
+ ///
+ Authorizing,
+
+ ///
+ /// 已登录/待机。
+ /// 登录成功并获取到了设备元数据(Metadata),但尚未启动预览(RealPlay)。
+ /// 适用于“仅管理,不看画面”的场景。
+ ///
+ Connected,
+
+ ///
+ /// 正常取流播放中
+ ///
+ Playing,
+
+ ///
+ /// 正在取流/正常运行中。
+ /// 预览句柄已开启,取流回调函数正在持续接收数据帧并进行解码。
+ ///
+ Streaming,
+
+ ///
+ /// 自动重连中。
+ /// 检测到网络抖动或心跳丢失,SDK 正在尝试内部恢复,此时视频流可能处于停滞状态。
+ ///
+ Reconnecting,
+
+ ///
+ /// 故障/异常状态。
+ /// 发生了不可恢复的错误(如密码错误、最大连接数限制、设备强制离线)。
+ /// 进入此状态通常需要人工干预或调用 Stop 后重新 Start。
+ ///
+ Faulted
+}
\ No newline at end of file
diff --git a/SHH.CameraSdk/Abstractions/Errors/CameraErrorCode.cs b/SHH.CameraSdk/Abstractions/Errors/CameraErrorCode.cs
new file mode 100644
index 0000000..05de2a9
--- /dev/null
+++ b/SHH.CameraSdk/Abstractions/Errors/CameraErrorCode.cs
@@ -0,0 +1,226 @@
+using System.ComponentModel;
+
+namespace SHH.CameraSdk;
+
+///
+/// 工业级相机归一化错误码 (修正全量版)
+/// 职责:跨厂家建立统一故障语义,支撑 HikErrorMapper 等驱动层的精准映射。
+///
+public enum CameraErrorCode
+{
+ [Description("操作成功")]
+ Success = 0,
+
+ #region --- 1000-1499 运行环境与 SDK 基础故障 ---
+
+ [Description("SDK 未初始化")]
+ SdkNotInitialized = 1000,
+
+ [Description("SDK 资源分配错误或本地内存不足")]
+ LocalResourceError = 1001,
+
+ [Description("加载插件/组件失败:缺少 DLL 或依赖库")]
+ ComponentLoadFailed = 1002,
+
+ [Description("组件版本不匹配")]
+ ComponentVersionMismatch = 1003,
+
+ [Description("加载加密库失败(Ope nSSL/LibEay32)")]
+ EncryptionLibError = 1004, // 已补齐 (海康 156)
+
+ [Description("函数调用顺序错误")]
+ FunctionOrderError = 1005,
+
+ [Description("操作系统不支持该功能")]
+ OsNotSupported = 1006,
+
+ #endregion
+
+ #region --- 1500-1999 网络通信与协议故障 ---
+
+ [Description("连接设备失败:设备离线")]
+ NetworkUnreachable = 1500,
+
+ [Description("交互超时:网络拥塞或设备响应慢")]
+ Timeout = 1501,
+
+ [Description("数据发送失败")]
+ NetworkSendError = 1502,
+
+ [Description("数据接收失败")]
+ NetworkRecvError = 1503,
+
+ [Description("网络套接字(Socket)异常")]
+ SocketError = 1504,
+
+ [Description("IP 地址冲突")]
+ IpConflict = 1505,
+
+ [Description("端口池耗尽或端口复用失败")]
+ PortPoolExhausted = 1506,
+
+ [Description("连接已失效或未建立")]
+ InvalidLink = 1507, // 已补齐 (海康 188)
+
+ #endregion
+
+ #region --- 2000-2499 身份认证与权限管理 ---
+
+ [Description("用户名或密码错误")]
+ InvalidCredentials = 2000,
+
+ [Description("用户权限不足")]
+ AccessDenied = 2001,
+
+ [Description("用户不存在")]
+ UserNotExist = 2002,
+
+ [Description("账号已被锁定(多次尝试失败)")]
+ AccountLocked = 2003,
+
+ [Description("登录人数已达上限")]
+ MaxUserExceeded = 2004,
+
+ [Description("会话已过期或已被强行踢出")]
+ SessionExpired = 2005,
+
+ [Description("用户正在使用中(如正在对讲/升级)")]
+ UserInUse = 2006, // 已补齐 (海康 74)
+
+ [Description("登录版本过低(不支持该协议)")]
+ LoginVersionLow = 2007, // 已补齐 (海康 155)
+
+ #endregion
+
+ #region --- 2500-2999 设备资源与负载限制 ---
+
+ [Description("设备连接数已达上限")]
+ MaxConnectionsReached = 2500,
+
+ [Description("设备资源不足或内部忙")]
+ DeviceResourceBusy = 2501,
+
+ [Description("通道接入数达到上限")]
+ MaxQuantityExceeded = 2502,
+
+ [Description("主/子码流路数超限")]
+ MaxStreamExceeded = 2503,
+
+ [Description("设备缓冲区不足/溢出")]
+ DeviceBufferOverflow = 2504,
+
+ #endregion
+
+ #region --- 3000-3499 视频预览、回放与解码 ---
+
+ [Description("预览失败或通道未编码")]
+ PreviewFailed = 3000,
+
+ [Description("码流封装格式不支持")]
+ StreamTypeNotSupport = 3001,
+
+ [Description("码流数据中断(丢包/心跳丢失)")]
+ StreamInterrupted = 3002,
+
+ [Description("码流已加密(需二次认证)")]
+ StreamEncrypted = 3003,
+
+ [Description("外接 IP 通道离线")]
+ IpChannelOffline = 3004,
+
+ [Description("设备通道异常")]
+ ChannelException = 3005, // 已补齐 (海康 18)
+
+ [Description("播放库(Player SDK)调用失败")]
+ PlayerSdkFailed = 3006, // 已补齐 (海康 51)
+
+ [Description("音频设备忙(声卡被独占)")]
+ AudioDeviceBusy = 3007, // 已补齐 (海康 69)
+
+ #endregion
+
+ #region --- 3500-3999 存储管理故障 ---
+
+ [Description("存储设备通用错误")]
+ StorageError = 3500,
+
+ [Description("设备无硬盘")]
+ NoDisk = 3501,
+
+ [Description("硬盘已满")]
+ DiskFull = 3502,
+
+ [Description("硬盘状态异常(格式化中或读写错)")]
+ DiskStatusError = 3503,
+
+ [Description("尝试格式化只读硬盘")]
+ DiskReadOnly = 3504,
+
+ [Description("存储池/NAS 目录无效")]
+ StoragePoolError = 3505,
+
+ [Description("写入存储(Flash/文件)失败")]
+ WriteStorageFailed = 3506, // 已补齐 (海康 48, 77)
+
+ #endregion
+
+ #region --- 4000-4499 硬件、参数与系统故障 ---
+
+ [Description("硬件内部故障")]
+ HardwareFault = 4000,
+
+ [Description("通道号错误或不存在")]
+ InvalidChannel = 4001,
+
+ [Description("参数错误(空指针或无效值)")]
+ InvalidParameter = 4002,
+
+ [Description("视频信号丢失(黑屏/丢信号)")]
+ VideoSignalLoss = 4003,
+
+ [Description("设备正在重启中")]
+ DeviceRebooting = 4004,
+
+ [Description("需重启生效")]
+ RebootRequired = 4005,
+
+ [Description("时间输入错误")]
+ InvalidTimeInput = 4006, // 已补齐 (海康 32)
+
+ [Description("设备型号或版本不匹配")]
+ DeviceMismatch = 4007, // 已补齐 (海康 80)
+
+ #endregion
+
+ #region --- 4500-4999 操作限制与通用状态 ---
+
+ [Description("设备不支持该功能")]
+ NotSupported = 4500, // 已补齐 (海康 23)
+
+ [Description("修改或设置失败")]
+ ModifyFailed = 4501,
+
+ [Description("不支持无阻塞抓图")]
+ CaptureNotSupport = 4502,
+
+ [Description("设备忙")]
+ DeviceBusy = 4503,
+
+ [Description("上次操作未完成")]
+ OperationNotFinished = 4504,
+
+ #endregion
+
+ #region --- 9000-9999 系统级故障 ---
+
+ [Description("驱动未实现该功能")]
+ NotImplemented = 9001,
+
+ [Description("程序异常")]
+ ProgramException = 9998,
+
+ [Description("未知错误")]
+ Unknown = 9999
+
+ #endregion
+}
\ No newline at end of file
diff --git a/SHH.CameraSdk/Abstractions/Errors/CameraException.cs b/SHH.CameraSdk/Abstractions/Errors/CameraException.cs
new file mode 100644
index 0000000..318aa17
--- /dev/null
+++ b/SHH.CameraSdk/Abstractions/Errors/CameraException.cs
@@ -0,0 +1,107 @@
+using System;
+using System.Collections.Generic;
+
+namespace SHH.CameraSdk;
+
+///
+/// 视频 SDK 统一异常类 (V3.3.1 修复版)
+/// 核心职责:
+/// 1. 封装标准化错误码、厂商原始错误码、设备品牌信息
+/// 2. 记录异常上下文快照,辅助故障定位与复盘
+/// 协作关系:
+/// 1. 与 配合:实现厂商错误码→标准错误码的转换
+/// 2. 与 配合:提供错误码输入,驱动故障自愈决策
+///
+public class CameraException : Exception
+{
+ #region --- 核心异常属性 (Core Exception Properties) ---
+
+ ///
+ /// 归一化后的标准错误码
+ /// 业务用途:作为 RecoveryPolicy 的决策输入,屏蔽厂商差异
+ ///
+ public CameraErrorCode ErrorCode { get; }
+
+ ///
+ /// 厂商原始错误码(如海康 NET_DVR_GetLastError、大华 SDK 原生错误码)
+ /// 业务用途:厂商文档对照、深度问题排查
+ ///
+ public int RawErrorCode { get; }
+
+ ///
+ /// 发生异常的设备品牌
+ /// 业务用途:区分不同厂商的错误码规则,辅助错误映射
+ ///
+ public DeviceBrand Brand { get; }
+
+ ///
+ /// 异常发生时的上下文快照(只读集合,防止外部篡改)
+ /// 存储内容:设备IP、通道号、操作参数、SDK句柄、时间戳等案发现场信息
+ /// 业务用途:故障复盘时还原现场,快速定位根因
+ ///
+ public IReadOnlyDictionary Context { get; init; } = new Dictionary();
+
+ #endregion
+
+ #region --- 构造函数 (Constructors) ---
+
+ ///
+ /// 初始化 CameraException 实例
+ ///
+ /// 归一化标准错误码
+ /// 异常描述信息
+ /// 设备品牌
+ /// 厂商原始错误码(默认 0)
+ /// 内部异常(默认 null)
+ public CameraException(
+ CameraErrorCode errorCode,
+ string message,
+ DeviceBrand brand,
+ int rawErrorCode = 0,
+ Exception? innerException = null)
+ : base(message, innerException)
+ {
+ ErrorCode = errorCode;
+ Brand = brand;
+ RawErrorCode = rawErrorCode;
+ // 初始化上下文字典为可写的 Dictionary,兼容 WithContext 方法
+ Context = new Dictionary();
+ }
+
+ #endregion
+
+ #region --- 工具方法 (Utility Methods) ---
+
+ ///
+ /// 链式添加上下文信息(Builder 模式)
+ /// 业务用途:在抛出异常前,逐步追加案发现场信息
+ ///
+ /// 上下文键(如 "DeviceIp", "ChannelIndex")
+ /// 上下文值
+ /// 当前异常实例(支持链式调用)
+ public CameraException WithContext(string key, object value)
+ {
+ // 强制转换为可写的 Dictionary,保证上下文可追加
+ if (Context is Dictionary contextDict)
+ {
+ contextDict[key] = value;
+ }
+ return this;
+ }
+
+ ///
+ /// 重写 ToString 方法,输出标准化异常日志
+ /// 格式:[CameraError] Brand: {品牌} | Code: {标准码}({原始码}) | Message: {描述} | Context: {上下文}
+ ///
+ /// 格式化的异常字符串
+ public override string ToString()
+ {
+ var contextStr = Context.Count > 0
+ ? $" | Context: {string.Join(", ", Context.Select(kvp => $"{kvp.Key}={kvp.Value}"))}"
+ : string.Empty;
+
+ return $"[CameraError] Brand: {Brand} | Code: {ErrorCode}({RawErrorCode}) | Message: {Message}{contextStr}";
+ }
+
+ #endregion
+}
\ No newline at end of file
diff --git a/SHH.CameraSdk/Abstractions/Errors/RecoveryAction.cs b/SHH.CameraSdk/Abstractions/Errors/RecoveryAction.cs
new file mode 100644
index 0000000..94159aa
--- /dev/null
+++ b/SHH.CameraSdk/Abstractions/Errors/RecoveryAction.cs
@@ -0,0 +1,55 @@
+namespace SHH.CameraSdk;
+
+///
+/// 故障恢复决策建议枚举
+/// 核心职责:定义标准化的故障自愈动作指令,指导 与 执行差异化恢复逻辑
+/// 设计原则:按“无动作→自动恢复→降级→致命停止→人工介入”的优先级划分,覆盖全场景故障处理
+///
+public enum RecoveryAction
+{
+ #region --- 0. 基础状态 ---
+
+ ///
+ /// 正常状态,无需执行任何恢复动作
+ /// 适用场景:错误码为 Success、设备运行正常
+ ///
+ None,
+
+ #endregion
+
+ #region --- 1. 自动恢复动作 ---
+
+ ///
+ /// 自动指数退避重试
+ /// 适用场景:网络抖动、超时、设备资源繁忙等**暂时性故障**
+ /// 执行标准:采用 2^n * 1000ms 算法计算延迟,上限 2 分钟,避免频繁重试加剧系统负载
+ ///
+ RetryWithBackoff,
+
+ ///
+ /// 降级运行
+ /// 适用场景:主码流超限、高清分辨率不支持等**非致命功能降级场景**
+ /// 执行标准:自动切换到备用方案(如主码流→子码流、4K→1080P),保证基础功能可用
+ ///
+ Degrade,
+
+ #endregion
+
+ #region --- 2. 终止与人工动作 ---
+
+ ///
+ /// 致命停止,禁止继续重试
+ /// 适用场景:密码错误、账号锁定、IP 拉黑等**不可自愈的认证/权限类故障**
+ /// 执行标准:立即停止自愈引擎,推送告警信息到运维平台,记录详细错误日志
+ ///
+ FatalStop,
+
+ ///
+ /// 需要人工介入处理
+ /// 适用场景:硬件故障、磁盘满、SDK 组件缺失等**软件无法修复的底层故障**
+ /// 执行标准:触发告警通知,标记设备状态为 Faulted,等待运维人员排查
+ ///
+ ManualIntervention
+
+ #endregion
+}
\ No newline at end of file
diff --git a/SHH.CameraSdk/Abstractions/Errors/RecoveryPolicy.cs b/SHH.CameraSdk/Abstractions/Errors/RecoveryPolicy.cs
new file mode 100644
index 0000000..5b2f573
--- /dev/null
+++ b/SHH.CameraSdk/Abstractions/Errors/RecoveryPolicy.cs
@@ -0,0 +1,100 @@
+namespace SHH.CameraSdk;
+
+///
+/// [决策引擎] 故障自愈策略 (V3.3.1 修复版)
+/// 核心职责:根据设备错误码特征,智能裁决系统应采取的恢复动作,实现故障自动化处理
+/// 关键修复(Bug R):
+/// 1. 致命错误防护:对 InvalidCredentials/AccountLocked 等错误禁止重试,防止账号被锁、IP 拉黑
+/// 2. 未知错误保守策略:对 Unknown 错误采用 ManualIntervention,避免未知风险扩散
+/// 设计原则:最小化风险、最大化自愈率,区分可重试/不可重试/需人工干预的错误类型
+///
+public static class RecoveryPolicy
+{
+ #region --- 1. 核心决策逻辑:错误码→自愈动作映射 ---
+
+ ///
+ /// 根据相机错误码判定对应的故障自愈动作
+ ///
+ /// 设备上报的错误码
+ /// 标准化的自愈动作指令
+ public static RecoveryAction GetAction(CameraErrorCode code)
+ {
+ return code switch
+ {
+ // ========== 场景 A: 网络类故障 (可自愈) ==========
+ // 策略:指数退避重试
+ // 理由:网络波动、超时、闪断为暂时性故障,延迟重试大概率恢复
+ CameraErrorCode.NetworkUnreachable or
+ CameraErrorCode.NetworkSendError or
+ CameraErrorCode.NetworkRecvError or
+ CameraErrorCode.Timeout or
+ CameraErrorCode.SocketError or
+ CameraErrorCode.StreamInterrupted or
+ CameraErrorCode.DeviceRebooting => RecoveryAction.RetryWithBackoff,
+
+ // ========== 场景 B: 资源繁忙类故障 (可自愈) ==========
+ // 策略:指数退避重试
+ // 理由:设备连接数满、缓冲区溢出,等待资源释放后可恢复
+ CameraErrorCode.DeviceResourceBusy or
+ CameraErrorCode.DeviceBufferOverflow or
+ CameraErrorCode.DeviceBusy or
+ CameraErrorCode.OperationNotFinished or
+ CameraErrorCode.PortPoolExhausted or
+ CameraErrorCode.MaxConnectionsReached or
+ CameraErrorCode.MaxStreamExceeded => RecoveryAction.RetryWithBackoff,
+
+ // ========== 场景 C: 致命错误 (不可自愈,禁止重试) ==========
+ // 策略:立即停止
+ // 理由:密码错误、账号锁定、组件缺失等故障,重试无意义且会加剧风险(账号锁死、日志爆炸)
+ CameraErrorCode.InvalidCredentials or
+ CameraErrorCode.AccessDenied or
+ CameraErrorCode.UserNotExist or
+ CameraErrorCode.AccountLocked or
+ CameraErrorCode.SessionExpired or
+ CameraErrorCode.InvalidChannel or
+ CameraErrorCode.IpConflict or
+ CameraErrorCode.SdkNotInitialized or
+ CameraErrorCode.ComponentLoadFailed or
+ CameraErrorCode.EncryptionLibError => RecoveryAction.FatalStop,
+
+ // ========== 场景 D: 硬件故障 (需人工干预) ==========
+ // 策略:人工介入
+ // 理由:硬盘损坏、存储满等故障属于硬件层面,软件无法修复
+ CameraErrorCode.HardwareFault or
+ CameraErrorCode.StorageError or
+ CameraErrorCode.DiskFull or
+ CameraErrorCode.DiskReadOnly => RecoveryAction.ManualIntervention,
+
+ // ========== 场景 E: 正常状态 ==========
+ CameraErrorCode.Success => RecoveryAction.None,
+
+ // ========== 场景 F: 未知错误 (关键修复 Bug R) ==========
+ // 旧策略:盲目重试 → 新策略:人工干预
+ // 理由:未知错误可能包含 IP 拉黑、协议不兼容等严重问题,重试会扩大风险
+ _ => RecoveryAction.ManualIntervention
+ };
+ }
+
+ #endregion
+
+ #region --- 2. 辅助算法:指数退避延迟计算 ---
+
+ ///
+ /// 获取建议的指数退避延迟时间(毫秒)
+ /// 算法公式:delay = min(2^n * 1000, 120000),n = 当前重试次数
+ /// 限流规则:第一次 2s → 第二次 4s → ... → 第六次 64s → 上限 120s(2分钟)
+ ///
+ /// 当前重试次数(从 1 开始计数)
+ /// 延迟毫秒数
+ public static int GetRetryDelay(int retryCount)
+ {
+ // 限制重试次数最大为 7,防止指数爆炸导致数值溢出
+ int exponent = Math.Min(retryCount, 7);
+ // 计算指数退避秒数
+ int delaySeconds = (int)Math.Pow(2, exponent);
+ // 转换为毫秒并限制上限为 2 分钟(120000ms)
+ return Math.Min(delaySeconds * 1000, 120000);
+ }
+
+ #endregion
+}
\ No newline at end of file
diff --git a/SHH.CameraSdk/Abstractions/IVideoSource.cs b/SHH.CameraSdk/Abstractions/IVideoSource.cs
new file mode 100644
index 0000000..39b26c8
--- /dev/null
+++ b/SHH.CameraSdk/Abstractions/IVideoSource.cs
@@ -0,0 +1,91 @@
+namespace SHH.CameraSdk;
+
+///
+/// [核心契约] 工业级视频源接口 (V3.3.1 终极定稿)
+/// 核心职责:定义所有视频源设备的标准化生命周期、状态观测与数据分发能力
+/// 关键修复:
+/// 1. [Fix Bug δ] 新增 UpdateConfig 接口,支持运行时配置热更新
+/// 2. 强化资源管理契约:继承 IDisposable/IAsyncDisposable,规范非托管资源释放
+/// 适用场景:海康/大华/宇视等不同品牌相机的驱动适配、统一管理
+///
+public interface IVideoSource : IDisposable, IAsyncDisposable
+{
+ #region --- 1. 只读属性 (设备标识与状态观测) ---
+
+ /// 设备唯一业务标识(全局唯一,如数据库自增ID)
+ long Id { get; }
+
+ /// 设备详细逻辑状态(如 Idle/Connecting/Playing/Faulted)
+ VideoSourceStatus Status { get; }
+
+ /// 用户意图标识:是否需要保持设备运行状态
+ bool IsRunning { get; set; }
+
+ /// 设备物理在线状态(基于心跳/探测的实时感知结果)
+ bool IsOnline { get; }
+
+ /// 设备能力元数据(只读,如分辨率、码流类型、支持的功能集)
+ DeviceMetadata Metadata { get; }
+
+ #endregion
+
+ #region --- 2. 事件契约 (数据分发与状态通知) ---
+
+ ///
+ /// 视频帧接收事件(热路径,高频触发)
+ ///
+ ///
+ /// 1. 载荷类型:通常为 或 对象
+ /// 2. 内存管理:订阅者必须负责载荷对象的 Dispose 操作,否则会导致内存泄漏
+ /// 3. 性能约束:事件处理逻辑需控制在 10ms 内,避免阻塞取流线程
+ ///
+ event Action