新增 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,378 @@
using System.Runtime.Serialization;
namespace Core.Protocol
{
/// <summary>
/// 基础响应分页
/// </summary>
public class BaseReplyPagination
{
/// <summary>
/// 当前页
/// </summary>
[DataMember]
public int Current_Page { get; set; }
= 1;
/// <summary>
/// 每页数量
/// </summary>
[DataMember]
public int Page_Size { get; set; }
= 1000;
/// <summary>
/// 总记录数
/// </summary>
[DataMember]
public int Total { get; set; }
= 0;
}
#region BaseReply
/// <summary>
/// 基础响应
/// </summary>
[DataContract]
public class BaseReply
{
/// <summary>
/// 是否成功
/// </summary>
[DataMember]
public Guid ExecGuid { get; set; }
/// <summary>
/// 执行码
/// </summary>
[DataMember]
public int Code { get; set; }
/// <summary>
/// 是否成功
/// </summary>
[DataMember]
public bool Success { get; set; }
/// <summary>
/// 执行消息
/// </summary>
[DataMember]
public string Msg { get; set; }
= string.Empty;
/// <summary>
/// 数据API
/// </summary>
[DataMember]
public string? DataApi { get; set; }
/// <summary>
/// 数据主体
/// </summary>
[DataMember]
public object? DataTable { get; set; }
/// <summary>
/// 数据对象
/// </summary>
[DataMember]
public object? DataObject { get; set; }
/// <summary>
/// 列信息
/// </summary>
[DataMember]
public List<ReplyColumn>? Columns { get; set; }
= new List<ReplyColumn>();
/// <summary>
/// 分页信息
/// </summary>
[DataMember]
public BaseReplyPagination Pagination { get; set; }
= new BaseReplyPagination();
#region Create
/// <summary>
/// 创建基础响应对象
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public static BaseReply Create(string msg)
{
var reply = new BaseReply();
reply.Msg = msg;
reply.ReplySuccess();
return reply;
}
#endregion
#region Create
/// <summary>
/// 创建基础响应对象
/// </summary>
/// <returns></returns>
public static BaseReply Create(List<object> data, List<ReplyColumn>? columns = null)
{
var reply = new BaseReply();
reply.DataTable = data;
reply.Columns = columns;
if (data != null)
reply.Pagination.Total = data.Count;
reply.ReplySuccess();
return reply;
}
#endregion
#region Create
/// <summary>
/// 创建基础响应对象
/// </summary>
/// <returns></returns>
public static BaseReply Create<T>(List<T> data, List<ReplyColumn>? columns = null)
{
var reply = new BaseReply();
reply.DataTable = data;
reply.Columns = columns;
if (data != null)
reply.Pagination.Total = data.Count;
reply.ReplySuccess();
return reply;
}
#endregion
#region CreateFalt
/// <summary>
/// 创建基础响应对象
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public static BaseReply CreateFalt(string msg = "失败")
{
var reply = new BaseReply();
reply.Success = false;
reply.Code = -1;
reply.Msg = msg;
return reply;
}
#endregion
#region ReplySuccess
/// <summary>
/// 成功
/// </summary>
public void ReplySuccess()
{
Success = true;
Code = 200;
if (string.IsNullOrEmpty(Msg))
Msg = "成功";
}
#endregion
#region ReplyFalt
/// <summary>
/// 失败
/// </summary>
public void ReplyFalt(string msg = "失败", int code = -1)
{
Success = false;
Code = code;
Msg = msg;
}
#endregion
}
#endregion
/// <summary>
/// 基础响应
/// </summary>
[DataContract]
public class Base2Reply
{
/// <summary>
/// 是否成功
/// </summary>
[DataMember]
public bool Success { get; set; }
/// <summary>
/// 执行码
/// </summary>
[DataMember]
public int Code { get; set; }
/// <summary>
/// 执行消息
/// </summary>
[DataMember]
public string Msg { get; set; }
= string.Empty;
/// <summary>
/// 数据类型
/// </summary>
[DataMember]
public ReplyDataType DataType { get; set; }
= ReplyDataType.Object;
/// <summary>
/// 数据主体
/// </summary>
[DataMember]
public object? Data { get; set; }
/// <summary>
/// 成功
/// </summary>
/// <param name="data"></param>
public void ReplySuccess(string data)
{
Success = true;
Code = 0;
Msg = "成功";
Data = data;
}
/// <summary>
/// 成功
/// </summary>
public void ReplySuccess()
{
Success = true;
Code = 0;
Msg = "成功";
}
/// <summary>
/// 失败
/// </summary>
public void ReplyFalt()
{
Success = false;
Code = -1;
Msg = "失败";
}
/// <summary>
/// 失败
/// </summary>
/// <param name="msg"></param>
/// <param name="data"></param>
public void ReplyFalt(string msg, string? data = null)
{
Success = false;
Code = -1;
Msg = msg;
Data = data;
}
}
/// <summary>
/// 响应数据类型
/// </summary>
public enum ReplyDataType
{
/// <summary>
/// 空类型
/// </summary>
Empty,
/// <summary>
/// 字符串类型
/// </summary>
String,
/// <summary>
/// 对象类型
/// </summary>
Object,
/// <summary>
/// 列表类型
/// </summary>
ObjectList,
/// <summary>
/// 动态对象类型
/// </summary>
ExpandoObject,
/// <summary>
/// 动态对象类型
/// </summary>
ExpandoObjectList,
}
/// <summary>
/// 响应列
/// </summary>
public class ReplyColumn
{
public ReplyColumn()
{
}
public ReplyColumn(string name, string caption)
{
Name = name;
Caption = caption;
}
/// <summary>
/// 列名
/// </summary>
[DataMember]
public string Name { get; set; }
= string.Empty;
/// <summary>
/// 列标题
/// </summary>
[DataMember]
public string Caption { get; set; }
= string.Empty;
/// <summary>
/// 列宽度
/// </summary>
[DataMember]
public double Width { get; set; }
/// <summary>
/// 是否可见
/// </summary>
[DataMember]
public bool IsVisible { get; set; }
= true;
/// <summary>
/// 格式化字符串
/// </summary>
[DataMember]
public string Format { get; set; }
= string.Empty;
}
}

View File

@@ -0,0 +1,129 @@
using Core.Protocol;
using System.Runtime.Serialization;
namespace Core.WcfProtocol
{
[DataContract]
public class RegisterModelRequest
{
/// <summary>
/// 进程Id
/// </summary>
[DataMember]
public Int32 ProcId { get; set; }
/// <summary>
/// 进程类型
/// </summary>
[DataMember]
public Int32 ProcType { get; set; }
/// <summary>
/// 进程通信号
/// </summary>
[DataMember]
public Int32 ProcChannel { get; set; }
/// <summary>
/// 进程启动时间
/// </summary>
[DataMember]
public Int64 ProcStartTime { get; set; }
/// <summary>
/// 接收消息端口
/// </summary>
[DataMember]
public Int32 AcceptPort { get; set; }
}
/// <summary>
/// 注册结果
/// </summary>
[DataContract]
public class RegisterModelReply : Base2Reply
{
}
[DataContract]
public class UploadImageRequest
{
/// <summary>
/// 唯一标识
/// </summary>
[DataMember]
public Int64 Id { get; set; }
/// <summary>
/// 设备 IP
/// </summary>
[DataMember]
public string IpAddress { get; set; }
= string.Empty;
/// <summary>
/// 进程 ID
/// </summary>
[DataMember]
public Int32 ProcId { get; set; }
/// <summary>
/// 图片序号
/// </summary>
[DataMember]
public UInt64 Order { get; set; }
/// <summary>
/// 名称
/// </summary>
[DataMember]
public string Name { get; set; }
= string.Empty;
/// <summary>
/// 类型
/// </summary>
[DataMember]
public string Type { get; set; }
= string.Empty;
/// <summary>
/// 时间
/// </summary>
[DataMember]
public DateTime Time { get; set; }
/// <summary>
/// 图片数据
/// </summary>
[DataMember]
public byte[]? ImageBytes { get; set; }
/// <summary>
/// 图像宽度
/// </summary>
[DataMember]
public int ImageWidth { get; set; }
/// <summary>
/// 图像高度
/// </summary>
[DataMember]
public int ImageHeight { get; set; }
/// <summary>
/// 图片数据
/// </summary>
[DataMember]
public string ImageData { get; set; }
= string.Empty;
}
/// <summary>
/// 图片上传回复
/// </summary>
[DataContract]
public class UploadImageReply : Base2Reply
{
}
}

View File

@@ -0,0 +1,26 @@
using CoreWCF;
namespace Core.WcfProtocol
{
/// <summary>
/// CoreImagesService 接口
/// </summary>
[ServiceContract]
public interface ICoreImagesService
{
/// <summary>
/// 上传图片
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
[OperationContract]
UploadImageReply UploadImage(UploadImageRequest req);
/// <summary>
/// 上传图片无返回结果
/// </summary>
/// <param name="req"></param>
[OperationContract(IsOneWay = true)]
void UploadImageOneWay(UploadImageRequest req);
}
}

View File

@@ -0,0 +1,21 @@
using Core.WcfProtocol;
using CoreWCF;
using SHH.MjpegPlayer;
namespace Player.MJPEG
{
/// <summary>
/// IMjpegImagesService 接口
/// </summary>
[ServiceContract]
public interface IMjpegImagesService : ICoreImagesService
{
/// <summary>
/// 注册模型
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
[OperationContract]
MjpegPlayInfoReply GetRtspRtcPlayInfo();
}
}

View File

@@ -0,0 +1,61 @@
using Core.Protocol;
using System.Runtime.Serialization;
namespace SHH.MjpegPlayer
{
/// <summary>
/// Mjpeg播放信息回复
/// </summary>
[DataContract]
public class MjpegPlayInfoReply : BaseReply
{
/// <summary>
/// 返回的信息集合
/// </summary>
[DataMember]
public List<MjpegPlayInfo> Infos { get; set; }
= new List<MjpegPlayInfo>();
}
public class MjpegPlayInfo
{
/// <summary>
/// 摄像头 ID
/// </summary>
[DataMember]
public Int32 CameraId { get; set; }
/// <summary>
/// 分析类型代码
/// </summary>
[DataMember]
public int AITypeCode { get; set; }
/// <summary>
/// 分析类型
/// </summary>
[DataMember]
public string AIType { get; set; }
= string.Empty;
/// <summary>
/// Rtsp 端口
/// </summary>
[DataMember]
public Int32 RtspPort { get; set; }
/// <summary>
/// 用户名
/// </summary>
[DataMember]
public string Account { get; set; }
= string.Empty;
/// <summary>
/// 密码
/// </summary>
[DataMember]
public string Password { get; set; }
= string.Empty;
}
}