public Task StartAsync(CancellationToken cancellationToken) { process.Start(); Task.Run(() => { while (true) { try { Console.WriteLine("IsConnected>>>" + pipeServerOut.IsConnected); if (pipeServerOut.IsConnected) { if (pipeServerOut.CanRead) { Span <byte> v1 = new byte[2048]; var length = pipeServerOut.Read(v1); var realValue = v1.Slice(0, length).ToArray(); if (realValue.Length <= 0) { continue; } if (flvFirstPackage == null) { flvFirstPackage = realValue; } if (jT1078HttpSessionManager.GetAll().Count() > 0) { foreach (var session in jT1078HttpSessionManager.GetAll()) { if (!exists.ContainsKey(session.Channel.Id.AsShortText())) { session.SendHttpFirstChunkAsync(flvFirstPackage); exists.TryAdd(session.Channel.Id.AsShortText(), 0); } session.SendHttpOtherChunkAsync(realValue); } } //Console.WriteLine(JsonConvert.SerializeObject(realValue)+"-"+ length.ToString()); } } else { if (!pipeServerOut.IsConnected) { Console.WriteLine("WaitForConnection Star..."); pipeServerOut.WaitForConnectionAsync().Wait(300); Console.WriteLine("WaitForConnection End..."); } } } catch (Exception ex) { Console.WriteLine(ex); } } }); return(Task.CompletedTask); }
public Task StartAsync(CancellationToken cancellationToken) { Task.Run(() => { try { Stopwatch stopwatch = new Stopwatch(); foreach (var item in jT1078WSFlvDataService.JT1078Packages.GetConsumingEnumerable()) { stopwatch.Start(); var flv3 = FlvEncoder.CreateFlvFrame(item); stopwatch.Stop(); if (flvEncodingLogger.IsEnabled(LogLevel.Debug)) { long times = stopwatch.ElapsedMilliseconds; flvEncodingLogger.LogDebug($"flv encoding {times.ToString()}ms"); } stopwatch.Reset(); if (flv3 == null) { continue; } if (jT1078HttpSessionManager.GetAll().Count() > 0) { foreach (var session in jT1078HttpSessionManager.GetAll()) { if (!exists.ContainsKey(session.Channel.Id.AsShortText())) { exists.TryAdd(session.Channel.Id.AsShortText(), 0); string key = item.GetKey(); //ws-flv //session.SendBinaryWebSocketAsync(FlvEncoder.GetFirstFlvFrame(key, flv3)); //http-flv var buffer = FlvEncoder.GetFirstFlvFrame(key, flv3); if (buffer != null) { flvEncodingLogger.LogDebug(JsonConvert.SerializeObject(buffer)); session.SendHttpFirstChunkAsync(buffer); } continue; } //ws-flv //session.SendBinaryWebSocketAsync(flv3); //http-flv session.SendHttpOtherChunkAsync(flv3); } } } } catch (Exception ex) { Console.WriteLine(ex); } }); return(Task.CompletedTask); }
public HLSRequestManager( IMemoryCache memoryCache, IOptions <JT1078Configuration> jT1078ConfigurationAccessor, JT1078HttpSessionManager httpSessionManager, JT1078SessionManager sessionManager, FileSystemWatcher fileSystemWatcher, ILoggerFactory loggerFactory) { this.memoryCache = memoryCache; this.fileSystemWatcher = fileSystemWatcher; HttpSessionManager = httpSessionManager; SessionManager = sessionManager; Configuration = jT1078ConfigurationAccessor.Value; Logger = loggerFactory.CreateLogger <HLSRequestManager>(); Task.Run(() => { while (true) { var expireds = HttpSessionManager.GetAll().Where(m => DateTime.Now.Subtract(m.StartTime).TotalSeconds > 20).ToList(); foreach (var item in expireds) { //移除httpsession HttpSessionManager.TryRemoveBySim(item.Sim); //移除tcpsession SessionManager.RemoveByTerminalPhoneNo(item.Sim); } Thread.Sleep(TimeSpan.FromSeconds(10)); } }); }
protected async override Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { var data = await messageDispatchDataService.FlvChannel.Reader.ReadAsync(); try { if (Logger.IsEnabled(LogLevel.Debug)) { Logger.LogDebug(JsonSerializer.Serialize(HttpSessionManager.GetAll())); Logger.LogDebug($"{data.SIM},{data.SN},{data.LogicChannelNumber},{data.Label3.DataType.ToString()},{data.Label3.SubpackageType.ToString()},{data.Bodies.ToHexString()}"); } string key = $"{data.GetKey()}_{ikey}"; if (data.Label3.DataType == Protocol.Enums.JT1078DataType.视频I帧) { memoryCache.Set(key, data); } var httpSessions = HttpSessionManager.GetAllBySimAndChannelNo(data.SIM.TrimStart('0'), data.LogicChannelNumber); var firstHttpSessions = httpSessions.Where(w => !w.FirstSend).ToList(); if (firstHttpSessions.Count > 0) { if (memoryCache.TryGetValue(key, out JT1078Package idata)) { try { } catch (Exception ex) { Logger.LogError(ex, $"{data.SIM},{true},{data.SN},{data.LogicChannelNumber},{data.Label3.DataType.ToString()},{data.Label3.SubpackageType.ToString()},{data.Bodies.ToHexString()}"); } } } var otherHttpSessions = httpSessions.Where(w => w.FirstSend).ToList(); if (otherHttpSessions.Count > 0) { try { } catch (Exception ex) { Logger.LogError(ex, $"{data.SIM},{false},{data.SN},{data.LogicChannelNumber},{data.Label3.DataType.ToString()},{data.Label3.SubpackageType.ToString()},{data.Bodies.ToHexString()}"); } } } catch (Exception ex) { Logger.LogError(ex, $"{data.SIM},{data.SN},{data.LogicChannelNumber},{data.Label3.DataType.ToString()},{data.Label3.SubpackageType.ToString()},{data.Bodies.ToHexString()}"); } } await Task.CompletedTask; }
protected override async Task ExecuteAsync(CancellationToken stoppingToken) { await Task.Run(() => { while (true) { try { var hasSessions = HttpSessionManager.GetAll().Where(m => DateTime.Now.Subtract(m.StartTime).TotalSeconds > 60 && m.RTPVideoType == Metadata.RTPVideoType.Http_Hls).ToList();//所有http 的 hls短链接 foreach (var item in hasSessions) { var key = $"{item.Sim}_{item.ChannelNo}"; HttpSessionManager.TryRemove(item.SessionId);//超过120s未访问。 //清楚所有hls文件 string filepath = Path.Combine(Configuration.HlsRootDirectory, key); if (Directory.Exists(filepath)) { Directory.Delete(filepath, true); } hLSPathStorage.RemoveAllPath(key);//移除所有缓存 if (logger.IsEnabled(LogLevel.Debug)) { logger.LogDebug($"{System.Text.Json.JsonSerializer.Serialize(item)},清楚session"); } var hasTcpSession = HttpSessionManager.GetAllBySimAndChannelNo(item.Sim.TrimStart('0'), item.ChannelNo).Any(m => m.IsWebSocket); //是否存在tcp的 socket链接 var httpFlvSession = HttpSessionManager.GetAllBySimAndChannelNo(item.Sim.TrimStart('0'), item.ChannelNo).Any(m => m.RTPVideoType == Metadata.RTPVideoType.Http_Flv); //是否存在http的 flv长链接 if (!hasTcpSession && !httpFlvSession) { //不存在websocket链接和http-flv链接时,主动断开设备链接以节省流量 //移除tcpsession,断开设备链接 if (SessionManager != null) { SessionManager.RemoveByTerminalPhoneNo(item.Sim.TrimStart('0')); } } } } catch (Exception ex) { logger.LogError(ex, ex.Message); } Thread.Sleep(TimeSpan.FromSeconds(30));//30s 执行一次 } }, stoppingToken); }
protected override Task ExecuteAsync(CancellationToken stoppingToken) { JT1078MsgConsumer.OnMessage((Message) => { JT1078Package package = JT1078Serializer.Deserialize(Message.Data); if (Logger.IsEnabled(LogLevel.Debug)) { Logger.LogDebug(JsonSerializer.Serialize(HttpSessionManager.GetAll())); Logger.LogDebug($"{package.SIM},{package.SN},{package.LogicChannelNumber},{package.Label3.DataType.ToString()},{package.Label3.SubpackageType.ToString()},{package.Bodies.ToHexString()}"); } try { var merge = JT1078Serializer.Merge(package); if (merge == null) { return; } string key = $"{package.GetKey()}_{ikey}"; if (merge.Label3.DataType == Protocol.Enums.JT1078DataType.视频I帧) { memoryCache.Set(key, merge); } var httpSessions = HttpSessionManager.GetAllBySimAndChannelNo(package.SIM.TrimStart('0'), package.LogicChannelNumber); var firstHttpSessions = httpSessions.Where(w => !w.FirstSend).ToList(); if (firstHttpSessions.Count > 0) { if (memoryCache.TryGetValue(key, out JT1078Package idata)) { try { var flvVideoBuffer = FlvEncoder.EncoderVideoTag(idata, true); foreach (var session in firstHttpSessions) { HttpSessionManager.SendAVData(session, flvVideoBuffer, true); } } catch (Exception ex) { Logger.LogError(ex, $"{package.SIM},{true},{package.SN},{package.LogicChannelNumber},{package.Label3.DataType.ToString()},{package.Label3.SubpackageType.ToString()},{package.Bodies.ToHexString()}"); } } } var otherHttpSessions = httpSessions.Where(w => w.FirstSend).ToList(); if (otherHttpSessions.Count > 0) { try { var flvVideoBuffer = FlvEncoder.EncoderVideoTag(merge, false); foreach (var session in otherHttpSessions) { HttpSessionManager.SendAVData(session, flvVideoBuffer, false); } } catch (Exception ex) { Logger.LogError(ex, $"{package.SIM},{false},{package.SN},{package.LogicChannelNumber},{package.Label3.DataType.ToString()},{package.Label3.SubpackageType.ToString()},{package.Bodies.ToHexString()}"); } } } catch (Exception ex) { Logger.LogError(ex, $"{package.SIM},{package.SN},{package.LogicChannelNumber},{package.Label3.DataType.ToString()},{package.Label3.SubpackageType.ToString()},{package.Bodies.ToHexString()}"); } }); return(Task.CompletedTask); }
protected async override Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { var data = await messageDispatchDataService.FlvChannel.Reader.ReadAsync(); try { var nalus = H264Decoder.ParseNALU(data); if (Logger.IsEnabled(LogLevel.Debug)) { Logger.LogDebug(JsonSerializer.Serialize(HttpSessionManager.GetAll())); Logger.LogDebug($"{data.SIM},{data.SN},{data.LogicChannelNumber},{data.Label3.DataType.ToString()},{data.Label3.SubpackageType.ToString()},{data.Bodies.ToHexString()}"); } string key = $"{data.GetKey()}_{ikey}"; if (data.Label3.DataType == Protocol.Enums.JT1078DataType.视频I帧) { var moov = FM4Encoder.EncoderMoovBox(nalus.FirstOrDefault(f => f.NALUHeader.NalUnitType == NalUnitType.SPS), nalus.FirstOrDefault(f => f.NALUHeader.NalUnitType == NalUnitType.PPS)); memoryCache.Set(key, moov); } var httpSessions = HttpSessionManager.GetAllBySimAndChannelNo(data.SIM.TrimStart('0'), data.LogicChannelNumber); var firstHttpSessions = httpSessions.Where(w => !w.FirstSend).ToList(); if (firstHttpSessions.Count > 0) { try { var flvVideoBuffer = FM4Encoder.EncoderFtypBox(); memoryCache.TryGetValue(key, out byte[] moovBuffer); foreach (var session in firstHttpSessions) { HttpSessionManager.SendAVData(session, flvVideoBuffer, true); if (moovBuffer != null) { HttpSessionManager.SendAVData(session, moovBuffer, false); } } } catch (Exception ex) { Logger.LogError(ex, $"{data.SIM},{true},{data.SN},{data.LogicChannelNumber},{data.Label3.DataType.ToString()},{data.Label3.SubpackageType.ToString()},{data.Bodies.ToHexString()}"); } } var otherHttpSessions = httpSessions.Where(w => w.FirstSend).ToList(); if (otherHttpSessions.Count > 0) { try { if (!avFrameDict.TryGetValue(key, out List <H264NALU> frames)) { frames = new List <H264NALU>(); avFrameDict.TryAdd(key, frames); } foreach (var nalu in nalus) { if (nalu.Slice) { //H264 NALU slice first_mb_in_slice frames.Add(nalu); } else { if (nalus.Count > 0) { var otherBuffer = FM4Encoder.EncoderOtherVideoBox(frames); foreach (var session in otherHttpSessions) { if (otherBuffer != null) { HttpSessionManager.SendAVData(session, otherBuffer, false); } } frames.Clear(); } frames.Add(nalu); } } } catch (Exception ex) { Logger.LogError(ex, $"{data.SIM},{false},{data.SN},{data.LogicChannelNumber},{data.Label3.DataType.ToString()},{data.Label3.SubpackageType.ToString()},{data.Bodies.ToHexString()}"); } } } catch (Exception ex) { Logger.LogError(ex, $"{data.SIM},{data.SN},{data.LogicChannelNumber},{data.Label3.DataType.ToString()},{data.Label3.SubpackageType.ToString()},{data.Bodies.ToHexString()}"); } } await Task.CompletedTask; }