添加契约和网络传输类库

This commit is contained in:
2025-12-29 08:09:14 +08:00
parent 231247c80f
commit 8cd36f44ac
14 changed files with 748 additions and 0 deletions

View File

@@ -0,0 +1,90 @@
using SHH.Contracts; // 引用契约
namespace SHH.CameraService
{
/// <summary>
/// 摄像头工作者
/// 职责管理海康SDK生命周期产出 VideoPayload 数据流
/// </summary>
public class HikCameraWorker : IDisposable
{
// 定义一个事件:当产生新图片时触发
// 参数是我们的标准快递盒 VideoPayload
public event Action<VideoPayload> OnNewFrame;
private bool _isRunning = false;
private string _ip;
public HikCameraWorker(string ip)
{
_ip = ip;
}
/// <summary>
/// 启动取流
/// </summary>
public void Start()
{
if (_isRunning) return;
// TODO: 【在此处填入海康 SDK 初始化代码】
// CHCNetSDK.NET_DVR_Init();
// CHCNetSDK.NET_DVR_Login_V40(...);
// CHCNetSDK.NET_DVR_RealPlay_V40(...);
Console.WriteLine($"[HikWorker] 摄像头 {_ip} 已启动,开始取流...");
_isRunning = true;
// 模拟一个后台线程不断产出视频帧 (仅用于演示架构)
// 实际中,这里应该是海康的 RealDataCallBack 函数
Task.Run(() => MockCaptureLoop());
}
/// <summary>
/// 停止取流
/// </summary>
public void Stop()
{
_isRunning = false;
// TODO: 【在此处填入海康 SDK 释放代码】
// CHCNetSDK.NET_DVR_StopRealPlay(...);
// CHCNetSDK.NET_DVR_Logout(...);
Console.WriteLine($"[HikWorker] 摄像头 {_ip} 已停止。");
}
/// <summary>
/// 模拟抓图循环 (实际开发中请替换为 SDK 回调函数)
/// </summary>
private void MockCaptureLoop()
{
while (_isRunning)
{
// 1. 模拟拿到了一张 JPG 图片 (假设 100KB)
byte[] mockJpg = new byte[1024 * 100];
// 2. 立即封装成标准包
var payload = new VideoPayload
{
CameraId = _ip, // 使用 IP 或 ID 作为标记
CaptureTime = DateTime.Now,
OriginalWidth = 1920,
OriginalHeight = 1080,
OriginalImageBytes = mockJpg, // 填入原始数据
TargetImageBytes = null // SDK 只产出原图,还没有处理图
};
// 3. 【核心】触发事件,把包扔给上层 (主程序)
// ?.Invoke 确保如果没有人订阅,不会报错
OnNewFrame?.Invoke(payload);
// 模拟 25fps (每40ms一帧)
Thread.Sleep(40);
}
}
public void Dispose()
{
Stop();
}
}
}