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;
}