90 lines
2.8 KiB
C#
90 lines
2.8 KiB
C#
|
|
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();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|