视频SDK新协议签入
This commit is contained in:
@@ -1,87 +1,87 @@
|
||||
using MessagePack;
|
||||
using NetMQ;
|
||||
using SHH.Contracts;
|
||||
//using MessagePack;
|
||||
//using NetMQ;
|
||||
//using SHH.Contracts;
|
||||
|
||||
namespace SHH.CameraService
|
||||
{
|
||||
/// <summary>
|
||||
/// 负责将业务契约转换为 ZeroMQ 传输协议
|
||||
/// </summary>
|
||||
public static class NetMQProtocolExtensions
|
||||
{
|
||||
private const string PROTOCOL_HEADER = "SHH_V1";
|
||||
//namespace SHH.CameraService
|
||||
//{
|
||||
// /// <summary>
|
||||
// /// 负责将业务契约转换为 ZeroMQ 传输协议
|
||||
// /// </summary>
|
||||
// public static class NetMQProtocolExtensions
|
||||
// {
|
||||
// private const string PROTOCOL_HEADER = "SHH_V1";
|
||||
|
||||
/// <summary>
|
||||
/// 扩展方法:将 Payload 转为 NetMQMessage
|
||||
/// 使用方法:var msg = payload.ToNetMqMessage();
|
||||
/// </summary>
|
||||
public static NetMQMessage ToNetMqMessage(this VideoPayload payload)
|
||||
{
|
||||
var msg = new NetMQMessage();
|
||||
// /// <summary>
|
||||
// /// 扩展方法:将 Payload 转为 NetMQMessage
|
||||
// /// 使用方法:var msg = payload.ToNetMqMessage();
|
||||
// /// </summary>
|
||||
// public static NetMQMessage ToNetMqMessage(this VideoPayload payload)
|
||||
// {
|
||||
// var msg = new NetMQMessage();
|
||||
|
||||
// Frame 0: 协议魔数
|
||||
msg.Append(PROTOCOL_HEADER);
|
||||
// // Frame 0: 协议魔数
|
||||
// msg.Append(PROTOCOL_HEADER);
|
||||
|
||||
////// Frame 1: 元数据 JSON
|
||||
////msg.Append(payload.GetMetadataJson());
|
||||
// ////// Frame 1: 元数据 JSON
|
||||
// ////msg.Append(payload.GetMetadataJson());
|
||||
|
||||
// ★★★ 修复点:在序列化之前,手动更新 Payload 的标志位 ★★★
|
||||
payload.HasOriginalImage = (payload.OriginalImageBytes != null && payload.OriginalImageBytes.Length > 0);
|
||||
payload.HasTargetImage = (payload.TargetImageBytes != null && payload.TargetImageBytes.Length > 0);
|
||||
// // ★★★ 修复点:在序列化之前,手动更新 Payload 的标志位 ★★★
|
||||
// payload.HasOriginalImage = (payload.OriginalImageBytes != null && payload.OriginalImageBytes.Length > 0);
|
||||
// payload.HasTargetImage = (payload.TargetImageBytes != null && payload.TargetImageBytes.Length > 0);
|
||||
|
||||
// Frame 1: Metadata (MessagePack)
|
||||
byte[] metaBytes = MessagePackSerializer.Serialize(payload);
|
||||
msg.Append(metaBytes);
|
||||
// // Frame 1: Metadata (MessagePack)
|
||||
// byte[] metaBytes = MessagePackSerializer.Serialize(payload);
|
||||
// msg.Append(metaBytes);
|
||||
|
||||
// Frame 2: 原始图 (保持帧位对齐,无数据则发空帧)
|
||||
if (payload.HasOriginalImage && payload.OriginalImageBytes != null)
|
||||
msg.Append(payload.OriginalImageBytes);
|
||||
else
|
||||
msg.Append(Array.Empty<byte>());
|
||||
// // Frame 2: 原始图 (保持帧位对齐,无数据则发空帧)
|
||||
// if (payload.HasOriginalImage && payload.OriginalImageBytes != null)
|
||||
// msg.Append(payload.OriginalImageBytes);
|
||||
// else
|
||||
// msg.Append(Array.Empty<byte>());
|
||||
|
||||
// Frame 3: 处理图
|
||||
if (payload.HasTargetImage && payload.TargetImageBytes != null)
|
||||
msg.Append(payload.TargetImageBytes);
|
||||
else
|
||||
msg.Append(Array.Empty<byte>());
|
||||
// // Frame 3: 处理图
|
||||
// if (payload.HasTargetImage && payload.TargetImageBytes != null)
|
||||
// msg.Append(payload.TargetImageBytes);
|
||||
// else
|
||||
// msg.Append(Array.Empty<byte>());
|
||||
|
||||
return msg;
|
||||
}
|
||||
// return msg;
|
||||
// }
|
||||
|
||||
/// <summary>
|
||||
/// 扩展方法:从 NetMQMessage 还原 Payload
|
||||
/// </summary>
|
||||
public static VideoPayload ToVideoPayload(this NetMQMessage msg)
|
||||
{
|
||||
if (msg == null || msg.FrameCount < 2) return null;
|
||||
// /// <summary>
|
||||
// /// 扩展方法:从 NetMQMessage 还原 Payload
|
||||
// /// </summary>
|
||||
// public static VideoPayload ToVideoPayload(this NetMQMessage msg)
|
||||
// {
|
||||
// if (msg == null || msg.FrameCount < 2) return null;
|
||||
|
||||
// Frame 0 Check
|
||||
if (msg[0].ConvertToString() != PROTOCOL_HEADER) return null;
|
||||
// // Frame 0 Check
|
||||
// if (msg[0].ConvertToString() != PROTOCOL_HEADER) return null;
|
||||
|
||||
//// Frame 1: Metadata
|
||||
//string json = msg[1].ConvertToString();
|
||||
//var payload = VideoPayload.FromMetadataJson(json);
|
||||
// //// Frame 1: Metadata
|
||||
// //string json = msg[1].ConvertToString();
|
||||
// //var payload = VideoPayload.FromMetadataJson(json);
|
||||
|
||||
// [新代码] 直接从二进制还原
|
||||
// ToByteArray() 虽然会产生一次拷贝,但对于 Metadata 这种小数据影响微乎其微
|
||||
// 相比 JSON 解析 String 的开销,这已经非常快了
|
||||
var payload = MessagePackSerializer.Deserialize<VideoPayload>(msg[1].ToByteArray());
|
||||
if (payload == null) return null;
|
||||
// // [新代码] 直接从二进制还原
|
||||
// // ToByteArray() 虽然会产生一次拷贝,但对于 Metadata 这种小数据影响微乎其微
|
||||
// // 相比 JSON 解析 String 的开销,这已经非常快了
|
||||
// var payload = MessagePackSerializer.Deserialize<VideoPayload>(msg[1].ToByteArray());
|
||||
// if (payload == null) return null;
|
||||
|
||||
// Frame 2: Raw Image
|
||||
// 利用 BufferSize 避免不必要的内存拷贝,如果长度为0则跳过
|
||||
if (payload.HasOriginalImage && msg[2].BufferSize > 0)
|
||||
{
|
||||
payload.OriginalImageBytes = msg[2].ToByteArray();
|
||||
}
|
||||
// // Frame 2: Raw Image
|
||||
// // 利用 BufferSize 避免不必要的内存拷贝,如果长度为0则跳过
|
||||
// if (payload.HasOriginalImage && msg[2].BufferSize > 0)
|
||||
// {
|
||||
// payload.OriginalImageBytes = msg[2].ToByteArray();
|
||||
// }
|
||||
|
||||
// Frame 3: Processed Image
|
||||
if (payload.HasTargetImage && msg[3].BufferSize > 0)
|
||||
{
|
||||
payload.TargetImageBytes = msg[3].ToByteArray();
|
||||
}
|
||||
// // Frame 3: Processed Image
|
||||
// if (payload.HasTargetImage && msg[3].BufferSize > 0)
|
||||
// {
|
||||
// payload.TargetImageBytes = msg[3].ToByteArray();
|
||||
// }
|
||||
|
||||
return payload;
|
||||
}
|
||||
}
|
||||
}
|
||||
// return payload;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
Reference in New Issue
Block a user