コード例 #1
0
ファイル: eLTEVideoMonitor.cs プロジェクト: eSDK/esdk_Cgw
        /// <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();
                    }
                }
            }
        }