2026-01-21 19:03:59 +08:00
|
|
|
|
using Newtonsoft.Json;
|
2026-01-07 10:59:03 +08:00
|
|
|
|
// 注意:如果不想依赖 Newtonsoft,也可以用 System.Text.Json,但 Newtonsoft 在 Std 2.0 中兼容性更好
|
2025-12-29 08:09:14 +08:00
|
|
|
|
|
|
|
|
|
|
namespace SHH.Contracts
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
2026-01-07 10:59:03 +08:00
|
|
|
|
/// 视频数据传输契约(纯净版 POCO)
|
2025-12-29 08:09:14 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class VideoPayload
|
|
|
|
|
|
{
|
2026-01-21 19:03:59 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 构造函数
|
|
|
|
|
|
/// </summary>
|
2026-01-03 00:16:28 +08:00
|
|
|
|
public VideoPayload()
|
|
|
|
|
|
{
|
|
|
|
|
|
SubscriberIds = new List<string>(16);
|
2026-01-07 10:59:03 +08:00
|
|
|
|
Diagnostics = new Dictionary<string, object>(4);
|
2026-01-03 00:16:28 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-07 10:59:03 +08:00
|
|
|
|
#region --- 1. 元数据 (Metadata) ---
|
2026-01-03 00:16:28 +08:00
|
|
|
|
|
2026-01-21 19:03:59 +08:00
|
|
|
|
public string CameraId { get; set; } = string.Empty;
|
2026-01-03 00:16:28 +08:00
|
|
|
|
|
2026-01-21 19:03:59 +08:00
|
|
|
|
/// <summary>采集时间戳 (Unix 毫秒)</summary>
|
2026-01-07 10:59:03 +08:00
|
|
|
|
public long CaptureTimestamp { get; set; }
|
2025-12-31 20:43:54 +08:00
|
|
|
|
|
2026-01-21 19:03:59 +08:00
|
|
|
|
/// <summary>分发时间戳 (Unix 毫秒)</summary>
|
2026-01-07 10:59:03 +08:00
|
|
|
|
public long DispatchTimestamp { get; set; }
|
2025-12-29 08:09:14 +08:00
|
|
|
|
|
2026-01-21 19:03:59 +08:00
|
|
|
|
/// <summary>原始图像宽度</summary>
|
2026-01-03 00:16:28 +08:00
|
|
|
|
public int OriginalWidth { get; set; }
|
2026-01-09 12:30:36 +08:00
|
|
|
|
|
2026-01-21 19:03:59 +08:00
|
|
|
|
/// <summary>原始图像高度</summary>
|
2026-01-03 00:16:28 +08:00
|
|
|
|
public int OriginalHeight { get; set; }
|
2026-01-09 12:30:36 +08:00
|
|
|
|
|
2026-01-21 19:03:59 +08:00
|
|
|
|
/// <summary>目标图像宽度</summary>
|
2026-01-07 10:59:03 +08:00
|
|
|
|
public int TargetWidth { get; set; }
|
2026-01-09 12:30:36 +08:00
|
|
|
|
|
2026-01-21 19:03:59 +08:00
|
|
|
|
/// <summary>目标图像高度</summary>
|
2026-01-07 10:59:03 +08:00
|
|
|
|
public int TargetHeight { get; set; }
|
|
|
|
|
|
|
2026-01-21 19:03:59 +08:00
|
|
|
|
/// <summary>订阅Ids</summary>
|
2026-01-09 12:30:36 +08:00
|
|
|
|
public List<string> SubscriberIds { get; set; }
|
2026-01-07 10:59:03 +08:00
|
|
|
|
|
2026-01-21 19:03:59 +08:00
|
|
|
|
/// <summary>诊断信息</summary>
|
2026-01-09 12:30:36 +08:00
|
|
|
|
public Dictionary<string, object> Diagnostics { get; set; }
|
2025-12-29 08:09:14 +08:00
|
|
|
|
|
2026-01-03 00:16:28 +08:00
|
|
|
|
/// <summary>
|
2026-01-07 10:59:03 +08:00
|
|
|
|
/// 指示标志:是否存在原始图
|
2026-01-03 00:16:28 +08:00
|
|
|
|
/// </summary>
|
2026-01-07 10:59:03 +08:00
|
|
|
|
public bool HasOriginalImage { get; set; }
|
2025-12-29 08:09:14 +08:00
|
|
|
|
|
2026-01-03 00:16:28 +08:00
|
|
|
|
/// <summary>
|
2026-01-07 10:59:03 +08:00
|
|
|
|
/// 指示标志:是否存在处理图
|
2026-01-03 00:16:28 +08:00
|
|
|
|
/// </summary>
|
2026-01-07 10:59:03 +08:00
|
|
|
|
public bool HasTargetImage { get; set; }
|
2025-12-29 08:09:14 +08:00
|
|
|
|
|
2026-01-03 00:16:28 +08:00
|
|
|
|
#endregion
|
2025-12-29 08:09:14 +08:00
|
|
|
|
|
2026-01-07 10:59:03 +08:00
|
|
|
|
#region --- 2. 二进制数据 (Binary) ---
|
2025-12-29 08:09:14 +08:00
|
|
|
|
|
2026-01-07 10:59:03 +08:00
|
|
|
|
// 标记 JsonIgnore,防止被错误序列化
|
2025-12-29 08:09:14 +08:00
|
|
|
|
[JsonIgnore]
|
2026-01-21 19:03:59 +08:00
|
|
|
|
public byte[]? OriginalImageBytes { get; set; }
|
2025-12-29 08:09:14 +08:00
|
|
|
|
|
|
|
|
|
|
[JsonIgnore]
|
2026-01-21 19:03:59 +08:00
|
|
|
|
public byte[]? TargetImageBytes { get; set; }
|
2025-12-29 08:09:14 +08:00
|
|
|
|
|
2026-01-03 00:16:28 +08:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
2026-01-07 10:59:03 +08:00
|
|
|
|
#region --- 3. 辅助方法 (仅保留 JSON 逻辑) ---
|
2025-12-29 08:09:14 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2026-01-07 10:59:03 +08:00
|
|
|
|
/// 获取纯元数据的 JSON 字符串
|
2025-12-29 08:09:14 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
public string GetMetadataJson()
|
|
|
|
|
|
{
|
2026-01-07 10:59:03 +08:00
|
|
|
|
// 在序列化前自动更新标志位,防止逻辑不同步
|
2026-01-21 19:03:59 +08:00
|
|
|
|
HasOriginalImage = (OriginalImageBytes != null && OriginalImageBytes.Length > 0);
|
|
|
|
|
|
HasTargetImage = (TargetImageBytes != null && TargetImageBytes.Length > 0);
|
2026-01-07 10:59:03 +08:00
|
|
|
|
|
|
|
|
|
|
return JsonConvert.SerializeObject(this);
|
2025-12-29 08:09:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-21 19:03:59 +08:00
|
|
|
|
public static VideoPayload? FromMetadataJson(string json)
|
2025-12-29 08:09:14 +08:00
|
|
|
|
{
|
|
|
|
|
|
return JsonConvert.DeserializeObject<VideoPayload>(json);
|
|
|
|
|
|
}
|
2026-01-03 00:16:28 +08:00
|
|
|
|
|
|
|
|
|
|
#endregion
|
2025-12-29 08:09:14 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|