using System.Threading.Channels;
namespace SHH.CameraService;
///
/// 视频数据高速通道
/// 作用:解耦 采集线程(Producer) 和 发送线程(Consumer)
/// 特性:使用 BoundedChannel,当网络发送慢时,自动丢弃旧帧(DropOldest),防止内存溢出。
///
public class VideoDataChannel
{
// 创建一个有限容量的通道 (容量 5)
// 如果发送端太慢,这就满了,DropOldest 会丢弃最旧的帧,保证实时性
private readonly Channel _channel = Channel.CreateBounded(
new BoundedChannelOptions(5)
{
FullMode = BoundedChannelFullMode.DropOldest, // 核心策略:丢弃旧帧
SingleReader = true, // 只有一个 ZeroMQWorker 在读
SingleWriter = false //可能有多个相机线程在写
});
// ★★★ 新增:公开 Reader 属性,让外部可以直接调用 ReadAsync ★★★
public ChannelReader Reader => _channel.Reader;
///
/// 写入数据 (生产者调用)
///
public ValueTask WriteAsync(VideoPayload payload)
{
return _channel.Writer.WriteAsync(payload);
}
///
/// 读取数据流 (消费者调用)
///
public IAsyncEnumerable ReadAllAsync(CancellationToken ct)
{
return _channel.Reader.ReadAllAsync(ct);
}
}
// 附带:如果您的项目中还没有定义 VideoPayload,这里是一个最小实现
// 如果 SHH.Contracts 中已有,请忽略此类
public class VideoPayload
{
/// 相机唯一标识
public string CameraId { get; set; } = string.Empty;
/// 采集时间
public DateTime CaptureTime { get; set; }
/// 发送时间
public DateTime DispatchTime { get; set; }
/// 原始宽
public int OriginalWidth { get; set; }
/// 原始高
public int OriginalHeight { get; set; }
/// 已编码的图片数据 (JPG)
public byte[] OriginalImageBytes { get; set; } = Array.Empty();
}