Exemplo n.º 1
0
 public static void RemoveChannelPusher(ChannelPusher channelPusher)
 {
     lock (_lockObj)
     {
         ChannelPushers.Remove(channelPusher);
     }
 }
Exemplo n.º 2
0
        public void StopPush(CommandDto commandDto)
        {
            ChannelPusher channelPusher = ChannelPusherService.GetChannelPusherById(commandDto);

            if (channelPusher != null)
            {
                channelPusher.CTS.Cancel();
                PushAMsgIn(commandDto.ChanneId, commandDto.Id, $"推流日志:发送停止命令完毕.", LiveStateType.Stoped);

                ChannelPusherService.RemoveChannelPusher(channelPusher);
                //重新序列化命令组
                SerializationCommangs();
            }
        }
Exemplo n.º 3
0
 /// 将一个频道压入工作列表
 /// </summary>
 /// <param name="liveChannel"></param>
 /// <returns></returns>
 public static ChannelPusher PushChannelIntoWorkingList(CommandDto commandDto)
 {
     lock (_lockObj)
     {
         if (!IsChannelExistingInWorkingList(commandDto))
         {
             var channelPusher = new ChannelPusher
             {
                 CommandDto = commandDto
             };
             //所有压入到工作表的状态都会修改为开始
             channelPusher.CommandDto.CommandType = CommandTypeEnum.Start;
             ChannelPushers.Add(channelPusher);
             return(channelPusher);
         }
         else
         {
             return(null);
         }
     }
 }
Exemplo n.º 4
0
        public void StartPush(CommandDto commandDto)
        {
            //压入推送对象进入推送列表
            ChannelPusher channelPusher = ChannelPusherService.PushChannelIntoWorkingList(commandDto);

            if (channelPusher != null)
            {
                Task.Factory.StartNew((objStat) =>
                {
                    try
                    {
                        PushAMsgIn(channelPusher.CommandDto.ChanneId, channelPusher.CommandDto.Id, $"推流日志: 开始推送成功.", LiveStateType.Started);
                        //执行推送
                        using (var ffPublisher = new FFmpegPublisher(channelPusher.CommandDto))
                        {
                            int countTimes = 0;
                            ffPublisher.OnFinishedWritePktEvent += (retId, command) =>
                            {
                                AppendLog(retId.ToString());
                                ////推流速度太快, 采取30条提取一条.
                                //++countTimes;
                                //if (countTimes >= 30)
                                //{
                                //    if (retId == 0)
                                //    {
                                //        PushAMsgIn(command.ChanneId, command.Id, $"推流日志: 推送Pack成功.", LiveStateType.Pushing);
                                //    }
                                //    else
                                //    {
                                //        PushAMsgIn(command.ChanneId, command.Id, $"推流日志: 推送Pack失败, 返回值:{FFmpegHelper.GetStrError(retId)}.", LiveStateType.Error);
                                //    }
                                //    countTimes = 0;
                                //}
                            };
                            ffPublisher.OnErrorEvent += (errorId, command, errorMsg) =>
                            {
                                PushAMsgIn(command.ChanneId, command.Id, $"推流日志:推流异常, 异常ID:{errorId} 异常信息: {errorMsg }", LiveStateType.Error);
                            };
                            ffPublisher.OnPushStopedEvent += command =>
                            {
                                PushAMsgIn(command.ChanneId, command.Id, $"推流日志:停止推流.", LiveStateType.Stoped);
                            };
                            ffPublisher.OnStartCompletedEvent += command =>
                            {
                                PushAMsgIn(command.ChanneId, command.Id, $"推流日志:拉流/推流初始化成功,即将开始发送数据包.", LiveStateType.Started);
                            };
                            //启动推送
                            ffPublisher.Start(channelPusher.CTS.Token);
                        }
                    }
                    catch (Exception ex)
                    {
                        LogHelper.SetLogError($"推流日志:{ex.ToString()}");
                    }
                }, channelPusher.CTS.Token, TaskCreationOptions.LongRunning);

                if (channelPusher.CommandDto.CommandType == CommandTypeEnum.Start)
                {
                    //Write commands to local file.
                    SerializationCommangs();
                }
            }
            else
            {
                PushAMsgIn(commandDto.ChanneId, commandDto.Id, $"推流日志: 频道正在推送中,未执行此命令.", LiveStateType.Error);
            }
        }