新增 Mjpegplayer 用来播放 Web 流

This commit is contained in:
2026-01-21 19:03:59 +08:00
parent f79cb6e74d
commit c438edfa0d
71 changed files with 4538 additions and 452 deletions

View File

@@ -0,0 +1,72 @@
using Core.WcfProtocol;
using System.Collections.Concurrent;
namespace SHH.MjpegPlayer
{
/// <summary>图片通道集合</summary>
public class ImageChannels
{
#region Channels
/// <summary>
/// 通道信息 (线程安全版本)
/// </summary>
// [修复] 使用 ConcurrentDictionary 替代 Dictionary防止多线程读写如推流和接收图片同时进行时崩溃
public ConcurrentDictionary<string, ImageChannel> Channels { get; set; }
= new ConcurrentDictionary<string, ImageChannel>();
#endregion
#region Do
/// <summary>
/// 处置图片
/// </summary>
/// <param name="req"></param>
/// <param name="key"></param>
public ImageChannel? Do(UploadImageRequest req, string key)
{
// [修复] 使用 GetOrAdd 原子操作,无需 lock彻底解决并发冲突
// 如果 key 不存在,则创建新通道;如果存在,则返回现有通道
var chn = Channels.GetOrAdd(key, k => new ImageChannel
{
DeviceId = req.Id,
Name = req.Name,
Type = req.Type,
});
// 更新指定信息 (直接属性赋值是原子性的,无需锁)
chn.IpAddress = req.IpAddress;
chn.ProcId = req.ProcId;
chn.ImageWidth = req.ImageWidth;
chn.ImageHeight = req.ImageHeight;
chn.UpdateTime = req.Time;
return chn;
}
#endregion
#region Get
/// <summary>
/// 获取通道信息
/// </summary>
/// <param name="deviceId"></param>
/// <param name="aiTypeCode"></param>
/// <returns></returns>
public ImageChannel? Get(string deviceId, string aiTypeCode)
{
string key = $"{deviceId}#{aiTypeCode}";
// [修复] ConcurrentDictionary 读取原本就是线程安全的
if (Channels.TryGetValue(key, out var val))
{
return val;
}
return null;
}
#endregion
}
}