Esempio n. 1
0
 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);
 }
Esempio n. 3
0
        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);
 }
Esempio n. 7
0
        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;
        }