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(); }