40 lines
1.5 KiB
C#
40 lines
1.5 KiB
C#
|
|
using System.Threading.Channels;
|
|||
|
|
using SHH.Contracts;
|
|||
|
|
|
|||
|
|
namespace SHH.CameraService
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 视频数据内部总线 (线程安全的生产者-消费者通道)
|
|||
|
|
/// <para>作用:解耦 [采集编码线程] 与 [网络发送线程]</para>
|
|||
|
|
/// </summary>
|
|||
|
|
public class VideoDataChannel
|
|||
|
|
{
|
|||
|
|
// 限制容量为 100 帧。如果积压超过 100 帧,说明发送端彻底堵死了,必须丢帧。
|
|||
|
|
private readonly Channel<VideoPayload> _channel;
|
|||
|
|
|
|||
|
|
public VideoDataChannel(int capacity = 10)
|
|||
|
|
{
|
|||
|
|
var options = new BoundedChannelOptions(capacity)
|
|||
|
|
{
|
|||
|
|
FullMode = BoundedChannelFullMode.DropOldest, // 核心策略:满了就丢弃最旧的帧
|
|||
|
|
SingleReader = false, // 允许多个发送 Worker (如 CloudWorker, ScreenWorker) 同时读取
|
|||
|
|
SingleWriter = true // 只有一个采集线程在写
|
|||
|
|
};
|
|||
|
|
_channel = Channel.CreateBounded<VideoPayload>(options);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// [生产者] 写入一个封装好的数据包 (非阻塞)
|
|||
|
|
/// </summary>
|
|||
|
|
public void WriteLog(VideoPayload payload)
|
|||
|
|
{
|
|||
|
|
// TryWrite 永远不会等待,满了就丢旧的写入新的,返回 true
|
|||
|
|
_channel.Writer.TryWrite(payload);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// [消费者] 读取器
|
|||
|
|
/// </summary>
|
|||
|
|
public ChannelReader<VideoPayload> Reader => _channel.Reader;
|
|||
|
|
}
|
|||
|
|
}
|