/// <summary> /// 发起视频回传成功后,在状态变化事件中处理视频接收、P2Pvideocall_IND_STATUS_ANSWERED时开始接收视频数据 /// </summary> /// <param name="structResStaIndi"></param> private void P2pStatusDelegateFun(ref strP2pvideocallStatusIndicator structP2pvideocallStaIndi) { NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log); logEx.Info("Enter: P2pStatusDelegateFun.strP2pvideocallStatusIndicator.Status = {0},Callee = {1}", Enum.GetName(typeof(P2pvideocall_Status_t), structP2pvideocallStaIndi.Status), structP2pvideocallStaIndi.Callee); //P2Pvideocall_IND_STATUS_ANSWERED,表示视频回传请求被成功处理处理 //视频网关需要提取其中的RTP port和对端IP,并负责与摄像头建立RTP连接和读取RTP中的H.264的视频流,然后再调用上层的视频管理系统或视频监控系统中的API //视频从摄像头回传,通过视频网关传入到上层的视频管理系统或视频监控系统 if (structP2pvideocallStaIndi.Status == P2pvideocall_Status_t.P2Pvideocall_IND_STATUS_ANSWERED) { //摄像机编码 int cameraNo = structP2pvideocallStaIndi.Callee; //源端发送码流IP; string pRemoteSendStreamIp = ip; //源端发送视频码流RTP端口号 uint uiRemoteSendStreamVideoPort = (uint)structP2pvideocallStaIndi.RemoteVideoPort; //源端发送音频端口号 uint uiRemoteSendStreamAudioPort = (uint)structP2pvideocallStaIndi.RemoteAudioPort; //本地视频、音频端口 uint uiLocalAudioPort = (uint)structP2pvideocallStaIndi.CalAudioPort; uint uiLocalVideoPort = (uint)structP2pvideocallStaIndi.LocalVideoPort; //发起视频回传,建立成功 logEx.Trace("P2pStatusDelegateFun.Camera = {0},pRemoteSendStreamIp ={1},uiRemoteSendStreamVideoPort = {2},uiRemoteSendStreamAudioPort ={3},uiLocalAudioPort ={4} ,uiLocalVideoPort ={5} P2Pvideocall_IND_STATUS_ANSWERED OK!", cameraNo, pRemoteSendStreamIp, uiRemoteSendStreamVideoPort, uiRemoteSendStreamAudioPort, uiLocalAudioPort, uiLocalVideoPort); if (uiRemoteSendStreamVideoPort == 0) { logEx.Warn("P2pvideocallStatus uiRemoteSendStreamVideoPort is NULL"); return; } //打开通道,开始接收实况RTP数据流 UInt32 channel = StartRecvStream(cameraNo.ToString(), pRemoteSendStreamIp, uiRemoteSendStreamVideoPort, uiRemoteSendStreamAudioPort == 0 ? uiRemoteSendStreamVideoPort : uiRemoteSendStreamAudioPort, uiLocalVideoPort, uiLocalAudioPort == 0 ? uiLocalVideoPort : uiLocalAudioPort); //如果为0,表示预览失败 if (channel == CgwConst.T28181_ERROR_HANDLE) { logEx.Error("Start Receive camera video data failed.Camera No:{0}.", cameraNo); return; } else { logEx.Info("Start Receive camera video data success.Camera No:{0}", cameraNo); } if (this.videoAutOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { if (videoAutoEvents.ContainsKey(cameraNo.ToString())) { videoAutoEvents[cameraNo.ToString()].VideoSuccess = true; videoAutoEvents[cameraNo.ToString()].eLTEVideoEvent.Set(); logEx.Trace("P2pStatusDelegateFun AutoResetEvent State Set,StartVideo Success"); } } finally { this.videoAutOperateLock.ExitWriteLock(); } } //设置rtp解析回调函数 rtpAdapter.ESDK_RTP_OpenESChannel(frameDataCallBack, channel); if (this.handelOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { this.cameraVideoChannelDic.Add(cameraNo.ToString(), channel); MediaDataSender mediaDataSender = new MediaDataSender(cameraNo.ToString(), this.dataCallBack); this.videoChannelDataSenderDic.Add(channel, mediaDataSender); } finally { this.handelOperateLock.ExitWriteLock(); } } } else if (P2pvideocall_Status_t.P2Pvideocall_IND_STATUS_HANGUPED == structP2pvideocallStaIndi.Status || P2pvideocall_Status_t.P2Pvideocall_IND_STATUS_RELEASED == structP2pvideocallStaIndi.Status || P2pvideocall_Status_t.P2Pvideocall_IND_STATUS_CANCELLED == structP2pvideocallStaIndi.Status) { //2015/3/6 设置信号量不阻塞 if (videoAutOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { int cameraNo = structP2pvideocallStaIndi.Callee; if (videoAutoEvents.ContainsKey(cameraNo.ToString())) { videoAutoEvents[cameraNo.ToString()].VideoSuccess = true; videoAutoEvents[cameraNo.ToString()].eLTEVideoEvent.Set(); logEx.Trace("P2pStatusDelegateFun AutoResetEvent State Set,StartVideo End"); } } finally { this.videoAutOperateLock.ExitWriteLock(); } } //收到呼叫被结束事件、需要停止RTP传输并关闭RTP连接 StopReceiveVideo(structP2pvideocallStaIndi.Callee.ToString()); } //2015/2/5 设备播放失败的错误码状态 else if (structP2pvideocallStaIndi.Status == P2pvideocall_Status_t.P2Pvideocall_IND_STATUS_REMOTE_NOTCONNECTED || structP2pvideocallStaIndi.Status == P2pvideocall_Status_t.P2Pvideocall_IND_STATUS_REMOTE_NOTSUPPORTED || structP2pvideocallStaIndi.Status == P2pvideocall_Status_t.P2Pvideocall_IND_STATUS_REMOTE_NOANSWER || structP2pvideocallStaIndi.Status == P2pvideocall_Status_t.P2Pvideocall_IND_STATUS_REMOTE_NOTFOUND || structP2pvideocallStaIndi.Status == P2pvideocall_Status_t.P2Pvideocall_IND_STATUS_RELEASED_BUSY ) { if (this.videoAutOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME)) { try { //摄像机编码 int cameraNo = structP2pvideocallStaIndi.Callee; if (videoAutoEvents.ContainsKey(cameraNo.ToString())) { videoAutoEvents[cameraNo.ToString()].VideoSuccess = false; videoAutoEvents[cameraNo.ToString()].eLTEVideoEvent.Set(); logEx.Trace("P2pStatusDelegateFun AutoResetEvent State Set,StartVideo Remote Failed"); } } finally { this.videoAutOperateLock.ExitWriteLock(); } } } }