Files
Ayay/SHH.MjpegPlayer/GrpcImpls/ImageProcs/ImagePayloadConverter.cs

78 lines
3.2 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Core.WcfProtocol;
using SHH.Contracts;
namespace SHH.MjpegPlayer
{
/// <summary>
/// 图像载荷转换器 (原 PayloadConverter)
/// 职责:抹平传输契约与业务契约之间的差异。
/// </summary>
public static class ImagePayloadConverter
{
/// <summary>
/// 将视频负载转换为 XWcf 协议并分发至会话池
/// </summary>
/// <param name="payload">VideoPayload 纯净版契约对象</param>
public static void ToXWcfMsg(VideoPayload payload)
{
if (payload == null) return;
try
{
// 1. 自动选择图像源逻辑
// Optimized: 优先使用 TargetImage若为空则退而求其次使用 OriginalImage
bool isOriginal = false;
byte[]? activeBytes;
activeBytes = payload.TargetImageBytes;
if (payload.TargetImageBytes == null || payload.TargetImageBytes.Length == 0)
{
isOriginal = true;
activeBytes = payload.OriginalImageBytes;
}
// 如果两者都为空,则不进行分发
if (activeBytes == null || activeBytes.Length == 0) return;
// 同理处理宽高Target 为 0 则使用 Original
int activeWidth = !isOriginal ? payload.TargetWidth : payload.OriginalWidth;
int activeHeight = !isOriginal ? payload.TargetHeight : payload.OriginalHeight;
// 2. 构造分发所需的 UploadImageRequest
// Modified: [原因] 适配最新的 VideoPayload 契约字段
var req = new UploadImageRequest
{
// 解析 CameraId。由于旧 req 是 Int64 Id若 CameraId 是数字字符串则解析,否则处理 Hash
Id = long.TryParse(payload.CameraId, out long id) ? id : 0,
Name = payload.CameraId, // 将原始 CameraId 存入 Name 字段保留引用
// 默认类型处理 (可根据 Diagnostics 中的信息动态调整)
Type = "0",
Order = (ulong)payload.CaptureTimestamp, // 使用采集时间戳作为序号
Time = UnixMillisecondsToDateTime(payload.CaptureTimestamp),
ImageBytes = activeBytes, // 零拷贝引用
ImageWidth = activeWidth,
ImageHeight = activeHeight
};
// 3. 执行核心分发逻辑
// 此处调用你之前提供的 O(1) 检索分发方法,确保画面最终流向 DoImageProc
MjpegStatics.Sessions.ProcUploadImageRequest(req);
}
catch (Exception ex)
{
// 统一使用项目规范的 _sysLog
//_sysLog.Error(ex, "VideoPayload 转换分发失败. CameraId: {CameraId}", payload.CameraId);
}
}
/// <summary>
/// 辅助方法Unix 毫秒时间戳转 DateTime
/// </summary>
private static DateTime UnixMillisecondsToDateTime(long timestamp)
{
return DateTimeOffset.FromUnixTimeMilliseconds(timestamp).LocalDateTime;
}
}
}