在 AiVideo 中能看到图像
增加了在线状态同步逻辑
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
namespace SHH.CameraDashboard
|
||||
{
|
||||
// 简单的上下文定义
|
||||
public class ProtocolContext
|
||||
{
|
||||
public string Protocol { get; set; }
|
||||
public byte[] Data { get; set; }
|
||||
public bool IsBlocked { get; set; } = false;
|
||||
public ProtocolContext(string p, byte[] d) { Protocol = p; Data = d; }
|
||||
}
|
||||
|
||||
public interface IProtocolInterceptor
|
||||
{
|
||||
Task OnSendingAsync(ProtocolContext context);
|
||||
Task OnReceivedAsync(ProtocolContext context);
|
||||
}
|
||||
|
||||
public class InterceptorPipeline
|
||||
{
|
||||
// 因为 Dashboard 可能没有复杂的 DI,这里支持手动添加列表
|
||||
private readonly List<IProtocolInterceptor> _interceptors = new List<IProtocolInterceptor>();
|
||||
|
||||
public void Add(IProtocolInterceptor interceptor) => _interceptors.Add(interceptor);
|
||||
|
||||
public async Task<ProtocolContext?> ExecuteSendAsync(string protocol, byte[] data)
|
||||
{
|
||||
var ctx = new ProtocolContext(protocol, data);
|
||||
foreach (var i in _interceptors)
|
||||
{
|
||||
await i.OnSendingAsync(ctx);
|
||||
if (ctx.IsBlocked) return null;
|
||||
}
|
||||
return ctx;
|
||||
}
|
||||
|
||||
public async Task<ProtocolContext?> ExecuteReceiveAsync(string protocol, byte[] data)
|
||||
{
|
||||
var ctx = new ProtocolContext(protocol, data);
|
||||
foreach (var i in _interceptors)
|
||||
{
|
||||
await i.OnReceivedAsync(ctx);
|
||||
if (ctx.IsBlocked) return null;
|
||||
}
|
||||
return ctx;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using NetMQ;
|
||||
using MessagePack;
|
||||
using NetMQ;
|
||||
using NetMQ.Sockets;
|
||||
using Newtonsoft.Json;
|
||||
using SHH.Contracts; // ★★★ 必须引用契约库 ★★★
|
||||
@@ -77,9 +78,16 @@ public class StreamReceiverService : IDisposable
|
||||
// 3. 协议头校验 (Frame 0)
|
||||
if (msg[0].ConvertToString() != "SHH_V1") continue;
|
||||
|
||||
//// 4. 反序列化元数据 (Frame 1)
|
||||
//string json = msg[1].ConvertToString();
|
||||
//var payload = JsonConvert.DeserializeObject<VideoPayload>(json);
|
||||
|
||||
// 4. 反序列化元数据 (Frame 1)
|
||||
string json = msg[1].ConvertToString();
|
||||
var payload = JsonConvert.DeserializeObject<VideoPayload>(json);
|
||||
// 直接获取二进制数据,不需要转 String (省去了 UTF8 解码开销)
|
||||
byte[] metaBytes = msg[1].ToByteArray();
|
||||
|
||||
// 极速反序列化
|
||||
var payload = MessagePackSerializer.Deserialize<VideoPayload>(metaBytes);
|
||||
|
||||
if (payload == null) continue;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user