Cgw.Channel.MonitorChannelRelationManager.SwitchChannelVideo C# (CSharp) Method

SwitchChannelVideo() private method

切换视频码流 内部接口
private SwitchChannelVideo ( string channelLabel, string cameraNo ) : SmcErr
channelLabel string
cameraNo string 摄像头编号
return Cgw.SmcError.SmcErr
        private SmcErr SwitchChannelVideo(string channelLabel, string cameraNo)
        {
            SmcErr err = new CgwError();
            NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log);
            logEx.Trace("SwitchChannelVideo Start. input localCameraNo:{0} cameraNo:{1}", channelLabel, cameraNo);

            string oldCameraNo = null;
            if (this.monitorChannelRelationDicLocker.TryEnterReadLock(CgwConst.ENTER_LOCK_WAIT_TIME))
            {
                try
                {
                    // 判断监控通道是否存在
                    if (!this.monitorChannelRelationDic.ContainsKey(channelLabel))
                    {
                        // 日志
                        err.SetErrorNo(CgwError.ERR_CGW_BUSINESS_CHANNELNO_NULL);
                        logEx.Trace("SwitchChannelVideo can't find channelLabel:{0}", channelLabel);
                        return err;
                    }
                    oldCameraNo = this.monitorChannelRelationDic[channelLabel].CameraNo;
                }
                finally
                {
                    this.monitorChannelRelationDicLocker.ExitReadLock();
                }
            }
            else
            {
                err.SetErrorNo(CgwError.ERR_CGW_CHANNEL_GET_LOCK_FAIL);
                logEx.Error("SwitchChannelVideo: Enter Read Lock Failed.WaitingReadCount:{0};WaitingWriteCount:{1}.", this.monitorChannelRelationDicLocker.WaitingReadCount, this.monitorChannelRelationDicLocker.WaitingWriteCount);
                return err;
            }

            logEx.Trace("SwitchChannelVideo oldCameraNo:{0}",oldCameraNo);

            //2015/2/9 重起的摄像头,重新开始播放视频
            if (offLineCameras.Contains(cameraNo))
            {
                logEx.Trace("SwitchChannelVideo offLineCameras cameraNo:{0}",cameraNo);
                offLineCameras.Remove(cameraNo);

                //停止摄像头码流
                if (!string.IsNullOrEmpty(oldCameraNo))
                {
                    // 停止码流
                    err = this.TryStopSendRtpData(oldCameraNo, channelLabel);
                    if (!err.IsSuccess())//停止失败
                    {
                        //this.monitorChannelRelationDic[channelLabel].CameraNo = null;
                        logEx.Trace("SwitchChannelVideo offLineCameras stop cameraNo:{0} failed,errNo={1}", oldCameraNo, err.ErrNo);
                        //return err;
                    }
                }

                // 启动摄像头码流
                err = this.TryStartSendRtpData(cameraNo, channelLabel);
                if (!err.IsSuccess())
                {
                    //this.monitorChannelRelationDic[channelLabel].CameraNo = null;
                    logEx.Trace("SwitchChannelVideo offLineCameras start (oldCameraNo:{0},cameraNo:{1}) startRtp failed,errNo={2}.", oldCameraNo, cameraNo, err.ErrNo);
                    //return err;
                }
                //this.monitorChannelRelationDic[channelLabel].CameraNo = cameraNo;
            }
            else
            {
                if (string.IsNullOrEmpty(oldCameraNo))
                {
                    if (!string.IsNullOrEmpty(cameraNo))
                    {
                        // 启动摄像头码流
                        err = this.TryStartSendRtpData(cameraNo, channelLabel);
                        if (!err.IsSuccess())
                        {
                            logEx.Trace("SwitchChannelVideo (oldCameraNo:{0},cameraNo:{1}) startRtp failed,errNo={2}.", oldCameraNo, cameraNo, err.ErrNo);
                            return err;
                        }
                        //this.monitorChannelRelationDic[channelLabel].CameraNo = cameraNo;
                    }
                }
                else
                {
                    if (!string.IsNullOrEmpty(cameraNo))
                    {
                        if (cameraNo == oldCameraNo)
                        {
                            logEx.Trace("SwitchChannelVideo oldCameraNo equal CameraNo:{0}.", cameraNo);
                            return err;
                        }

                        // 停止码流
                        err = this.TryStopSendRtpData(oldCameraNo, channelLabel);
                        if (!err.IsSuccess())
                        {
                            logEx.Trace("SwitchChannelVideo (oldCameraNo:{0},cameraNo:{1}) stoprtp failed,errNo={2}.", oldCameraNo, cameraNo, err.ErrNo);
                            return err;
                        }

                        // 启动新摄像头码流
                        err = this.TryStartSendRtpData(cameraNo, channelLabel);
                        if (!err.IsSuccess())
                        {
                            // 原有摄像头编号要置为空,因为旧摄像头已经关闭,避免再次预览旧摄像头,以为还在开启
                            //this.monitorChannelRelationDic[channelLabel].CameraNo = null;
                            logEx.Trace("SwitchChannelVideo (oldCameraNo:{0},cameraNo:{1}) StartRtp failed,errNo={2}.", oldCameraNo, cameraNo, err.ErrNo);
                            //return err;
                        }
                        else
                        {
                            // 关闭音频码流
                            err = this.SetCameraAudio(channelLabel, oldCameraNo, false);
                            if (!err.IsSuccess())
                            {
                                logEx.Trace("SwitchChannelVideo (channelLabel:{0},oldCameraNo:{1},cameraNo:{2}) StartAudio failed,errNo={2}.", channelLabel, oldCameraNo, cameraNo, err.ErrNo);
                                return err;
                            }
                        }
                    }
                    else
                    {
                        // 停止码流
                        err = this.TryStopSendRtpData(oldCameraNo, channelLabel);
                        if (!err.IsSuccess())
                        {
                            logEx.Trace("SwitchChannelVideo (oldCameraNo:{0},cameraNo:{1}) StopRtp failed,errNo={2}.", oldCameraNo, cameraNo, err.ErrNo);
                            return err;
                        }

                        // 关闭音频码流
                        err = this.SetCameraAudio(channelLabel, oldCameraNo, false);
                        if (!err.IsSuccess())
                        {
                            logEx.Trace("SwitchChannelVideo (channelLabel:{0},oldCameraNo:{1},cameraNo:{2}) StartAudio failed,errNo={2}.", channelLabel, oldCameraNo, cameraNo, err.ErrNo);
                            return err;
                        }
                    }

                    //this.monitorChannelRelationDic[channelLabel].CameraNo = cameraNo;
                }
            }
            if (this.monitorChannelRelationDicLocker.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME))
            {
                try
                {
                    if (err.IsSuccess())
                    {
                        this.monitorChannelRelationDic[channelLabel].CameraNo = cameraNo;
                    }
                    else
                    {
                        this.monitorChannelRelationDic[channelLabel].CameraNo = null;
                        return err;
                    }
                }
                finally
                {
                    this.monitorChannelRelationDicLocker.ExitWriteLock();
                }
            }
            else
            {
                err.SetErrorNo(CgwError.ERR_CGW_CHANNEL_GET_LOCK_FAIL);
                logEx.Error("SwitchChannelVideo: Enter Write Lock Failed.WaitingReadCount:{0};WaitingWriteCount:{1}.", this.monitorChannelRelationDicLocker.WaitingReadCount, this.monitorChannelRelationDicLocker.WaitingWriteCount);
                return err;
            }
            logEx.Trace("SwitchChannelVideo localCameraNo:{0} cameraNo:{1} successfully.", channelLabel, cameraNo);
            return err;
        }