增加云台移动、缩放、聚集、光圈、校时、重启对 AiVideo 项目的支持

This commit is contained in:
2026-03-02 13:57:10 +08:00
parent c8f25aeba5
commit 0399871467
11 changed files with 343 additions and 28 deletions

View File

@@ -1,4 +1,6 @@
namespace SHH.CameraSdk.HikFeatures;
using Serilog;
namespace SHH.CameraSdk.HikFeatures;
public class HikPtzProvider : IPtzFeature
{
@@ -9,6 +11,15 @@ public class HikPtzProvider : IPtzFeature
_context = context;
}
/// <summary>
/// 判断该动作是否支持速度参数
/// </summary>
private static bool IsSpeedSupported(PtzAction action)
{
// Optimized: 方向和缩放支持速度,其余(雨刷/聚焦/光圈)为开关量或标准调节
return action <= PtzAction.ZoomOut;
}
public async Task PtzControlAsync(PtzAction action, bool stop, int speed)
{
int userId = _context.GetUserId();
@@ -17,10 +28,18 @@ public class HikPtzProvider : IPtzFeature
// 1. 映射指令
uint hikCommand = action switch
{
PtzAction.Up => HikNativeMethods.TILT_UP,
PtzAction.Down => HikNativeMethods.TILT_DOWN,
PtzAction.Left => HikNativeMethods.PAN_LEFT,
PtzAction.Up => HikNativeMethods.TILT_UP,
PtzAction.Right => HikNativeMethods.PAN_RIGHT,
PtzAction.Down => HikNativeMethods.TILT_DOWN,
PtzAction.LeftUp => HikNativeMethods.UP_LEFT, // 海康 SDK: 左上
PtzAction.LeftDown => HikNativeMethods.DOWN_LEFT, // 海康 SDK: 左下
PtzAction.RightUp => HikNativeMethods.UP_RIGHT, // 海康 SDK: 右上
PtzAction.RightDown => HikNativeMethods.DOWN_RIGHT, // 海康 SDK: 右下
PtzAction.Auto => HikNativeMethods.PAN_AUTO,
PtzAction.ZoomIn => HikNativeMethods.ZOOM_IN,
PtzAction.ZoomOut => HikNativeMethods.ZOOM_OUT,
PtzAction.FocusNear => HikNativeMethods.FOCUS_NEAR,
@@ -36,19 +55,28 @@ public class HikPtzProvider : IPtzFeature
// 2. 转换停止标志 (海康: 0=开始, 1=停止)
uint dwStop = stop ? 1u : 0u;
// 3. 限制速度范围 (1-7)
uint dwSpeed = (uint)Math.Clamp(speed, 1, 7);
// 4. 调用 SDK
// 3. 调用 SDK
await Task.Run(() =>
{
// Channel 默认为 1
bool result = HikNativeMethods.NET_DVR_PTZControlWithSpeed_Other(userId, 1, hikCommand, dwStop, dwSpeed);
bool result;
// Optimized: 接口分流逻辑,确保不同类型的动作调用正确的 SDK 接口
if (IsSpeedSupported(action))
{
uint dwSpeed = (uint)Math.Clamp(speed, 1, 7);
result = HikNativeMethods.NET_DVR_PTZControlWithSpeed_Other(userId, 1, hikCommand, dwStop, dwSpeed);
}
else
{
// 对于雨刷、聚焦、光圈,使用不带速度的接口
result = HikNativeMethods.NET_DVR_PTZControl_Other(userId, 1, hikCommand, dwStop);
}
if (!result)
{
// 这里通常不抛异常,因为云台繁忙或到头是常态,记录日志即可
// Console.WriteLine($"PTZ Error: {HikNativeMethods.NET_DVR_GetLastError()}");
// Modified: 统一记录到 D:\Logs
uint errorCode = HikNativeMethods.NET_DVR_GetLastError();
Log.Warning("Ayay.AiVideo: PTZ {Action} failed. Stop: {Stop}, ErrorCode: {ErrorCode}",
action, stop, errorCode);
}
});
}