using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using Unity.VisualScripting; using UnityEngine; using static InterfaceManager; /// /// 本地视频 /// [AddComponentMenu("LocalVideo/本地视频")] public class LocalVideo : MonoBehaviour { public static LocalVideo Inst; public WebSocketT socketT = new WebSocketT(); public List clickEventLens; public List baseConfs; /// /// 上次点击的本地视频弹窗 /// public LocalVideoAlarmUI current_UI = null; public string webSite { get; set; } private void Awake() { Inst = this; clickEventLens = GameObject.FindObjectsOfType().ToList(); baseConfs = clickEventLens.Select(x => x.baseConf).ToList(); } // Start is called before the first frame update void Start() { ///获取配置信息 StartCoroutine(GetRequest(Path.Combine(Application.streamingAssetsPath, "ws.txt"), null, null, (_error, _json) => { if (_error != null) { Debug.Log("请求websocket【配置信息】错误:" + _error); return; } JObject _j = JObject.Parse(_json); webSite = _j["webSite"].ToString(); socketT.Init(webSite, WebSocketT.WstypesOf.视频); })); } [ContextMenu("测试时间戳")] public void ConvertUnixTimestampToDateTime(/*long unixTimestamp*/) { //GetTime(1700227312, false); Debug.Log(GetTime(1698723542)); } /// /// 指定时间戳转为时间。 /// /// 需要被反转的时间戳 /// 是否精确到毫秒 /// 返回时间戳对应的DateTime public static DateTime GetTime(long timeStamp, bool accurateToMilliseconds = false) { if (accurateToMilliseconds) { return DateTimeOffset.FromUnixTimeMilliseconds(timeStamp).LocalDateTime; } else { return DateTimeOffset.FromUnixTimeSeconds(timeStamp).LocalDateTime; } } // Update is called once per frame void Update() { } public void Dispose(string message) { // 清除信息 for (int j = 0; j < baseConfs.Count; j++) { baseConfs[j].conf1.alarmEntities.Clear(); } try { //Root root = JsonConvert.DeserializeObject(message); //for (int i = 0; i < baseConfs.Count; i++) //{ //if (baseConfs[i].conf1.isPicture && root.sourceName == baseConfs[i].conf1.LensName) //{ // baseConfs[i].conf1.base64 = root.alarmPicture; //} //} ReadAllocationInformation(message); AlarmFlashing(); RecoveryUI(); AssignDataToUI(); if (clickEventLens != null) { var localVideoAlarm_list = GameObject.FindObjectsOfType(true).ToList(); for (int i = 0; i < localVideoAlarm_list.Count; i++) { localVideoAlarm_list[i].EnterTheCameraModule(); } } } catch (Exception e) { Debug.Log("解析本地视频错误:" + e.Message + " " + e.StackTrace); } } /// /// 读取分配信息 /// /// public void ReadAllocationInformation(string message) { List alarmList = JsonConvert.DeserializeObject>(message); for (int i = 0; i < alarmList.Count; i++) { string cameraName = string.Empty; if (alarmList[i].cameraName.Contains("摄像头")) { string s1 = alarmList[i].cameraName.Replace("摄像头", "").PadLeft(2, '0'); cameraName = "摄像头" + s1; } else continue; for (int j = 0; j < baseConfs.Count; j++) { if (cameraName.Contains(baseConfs[j].conf1.LensName)) { baseConfs[j].conf1.alarmEntities.Add(alarmList[i]); break; } } } } /// /// 告警闪烁 /// public void AlarmFlashing() { for (int j = 0; j < baseConfs.Count; j++) { Debug.Log($"摄像头{baseConfs[j].conf1.LensName}:{baseConfs[j].conf1.alarmEntities.Count}个报警"); if (baseConfs[j].conf1.alarmEntities.Count > 0 && clickEventLens[j].coroutine == null) { clickEventLens[j].coroutine = StartCoroutine(clickEventLens[j].AlwaysFlashing(0.25f)); } else if (clickEventLens[j].coroutine != null && baseConfs[j].conf1.alarmEntities.Count == 0) { StopCoroutine(clickEventLens[j].coroutine); clickEventLens[j].coroutine = null; } } } /// /// 回收 /// public void RecoveryUI() { for (int i = 0; i < clickEventLens.Count; i++) { LocalVideoAlarm localVideoAlarm = clickEventLens[i].GetComponentInChildren(true); if (!localVideoAlarm) continue; LocalVideoAlarmUI localVideoAlarmUI = localVideoAlarm.localVideoAlarmUI; var localVideoAlarmItem = localVideoAlarmUI.Content.GetComponentsInChildren(true).ToList(); for (int j = 0; j < localVideoAlarmItem.Count; j++) { AlarmObjectPool.instance.PushItemToPool(localVideoAlarmItem[j]); } } } /// /// 赋值数据到UI /// public void AssignDataToUI() { for (int i = 0; i < clickEventLens.Count; i++) { LocalVideoAlarm localVideoAlarm = clickEventLens[i].GetComponentInChildren(true); if (!localVideoAlarm) continue; LocalVideoAlarmUI localVideoAlarmUI = localVideoAlarm.localVideoAlarmUI; localVideoAlarmUI.textMeshPro.text = baseConfs[i].conf1.alarmEntities.Count.ToString(); var list_Confs = baseConfs[i].conf1.alarmEntities; for (int j = 0; j < list_Confs.Count; j++) { var _item = AlarmObjectPool.instance.GetItemFromPool(localVideoAlarmUI.preform); _item.gameObject.SetActive(true); _item.transform.SetParent(localVideoAlarmUI.Content.transform); _item.textMeshPro_object.text = list_Confs[j].sourceName + "监测异常"; _item.textMeshPro_time.text = GetTime(long.Parse(list_Confs[j].timeStamp)).ToString(); var t = CombineJSON.Base64StringToTexture(list_Confs[j].alarmPicture); var u = Sprite.Create(t, new Rect(0, 0, t.width, t.height), Vector2.zero); _item.sprites.Add(u); } } } [Serializable] public class AlarmEntity { public int id; /// /// //1-安全帽;2-安全服;3-抽烟 /// public string type; public string reference; public string alarmType; public object deviceId; /// /// 时间戳 /// public string timeStamp; public object sourceId; public string seq; public object relatedId; /// /// //告警源名称 /// public string sourceName; /// /// 告警图片 /// public string alarmPicture; public string alarmPictureType; /// /// 摄像头名字 /// public string cameraName; } [Serializable] public class Root { public List alarms; } }