コード例 #1
0
        /// <summary>
        /// 处理RTSP视频帧
        /// </summary>
        /// <param name="channelPtr"></param>
        /// <param name="frameInfoPtr"></param>
        /// <param name="pBuf"></param>
        /// <returns></returns>
        private int ProcessVideoFrame(IntPtr channelPtr, IntPtr frameInfoPtr, IntPtr pBuf)
        {
            //判断RTMP是否初始化
            if (!this.rtmpClient.IsInit)
            {
                return(0);
            }
            //获取帧信息
            EasyTypes.EASY_FRAME_INFO frameInfo = (EasyTypes.EASY_FRAME_INFO)Marshal.PtrToStructure(frameInfoPtr, typeof(EasyTypes.EASY_FRAME_INFO));

            EasyTypes.EASY_AV_Frame avFrame = new EasyTypes.EASY_AV_Frame();
            avFrame.u32AVFrameFlag = EasyTypes.EASY_SDK_VIDEO_FRAME_FLAG;
            //avFrame.u32AVFrameLen = frameinfo->length-4;
            avFrame.u32AVFrameLen = frameInfo.length - 4;
            //avFrame.pBuffer = (unsigned char*)pbuf+4;
            avFrame.pBuffer       = new IntPtr(pBuf.ToInt64() + 4);
            avFrame.u32VFrameType = EasyTypes.EASY_SDK_VIDEO_FRAME_P;
            //发送数据包
            var ret = this.rtmpClient.SendPacket(avFrame);

            if (!ret.Key)
            {
                //return;
            }

            return(0);
        }
コード例 #2
0
        /// <summary>
        /// 处理RTSP视频I帧
        /// </summary>
        /// <param name="channelPtr"></param>
        /// <param name="frameInfoPtr"></param>
        /// <param name="pBuf"></param>
        /// <returns></returns>
        private int ProcessVideoFrame_I(IntPtr channelPtr, IntPtr frameInfoPtr, IntPtr pBuf)
        {
            //获取通道信息
            _channel_info channelInfo = (_channel_info)Marshal.PtrToStructure(channelPtr, typeof(_channel_info));

            //获取帧信息
            EasyTypes.EASY_FRAME_INFO frameInfo = (EasyTypes.EASY_FRAME_INFO)Marshal.PtrToStructure(frameInfoPtr, typeof(EasyTypes.EASY_FRAME_INFO));
            //RTMP初始化
            if (!this.rtmpClient.IsInit)
            {
                //启动 rtmp
                var retRtmp = this.StartRtmp();
                if (!retRtmp.Key)
                {
                    return(0);
                }
                EasyTypes.EASY_MEDIA_INFO_T mediaInfo = EasyTypes.Create_EASY_MEDIA_INFO_T();
                mediaInfo.u32VideoFps           = channelInfo.fMediainfo.u32VideoFps;
                mediaInfo.u32AudioSamplerate    = channelInfo.fMediainfo.u32AudioSamplerate;    /* 音频采样率 */
                mediaInfo.u32AudioChannel       = channelInfo.fMediainfo.u32AudioChannel;       /* 音频通道数 */
                mediaInfo.u32AudioBitsPerSample = channelInfo.fMediainfo.u32AudioBitsPerSample; /* 音频采样精度 */
                //媒体信息
                retRtmp = this.rtmpClient.InitMetadata(mediaInfo);
                if (!retRtmp.Key)
                {
                    //return;
                }
            }
            EasyTypes.EASY_AV_Frame avFrame = new EasyTypes.EASY_AV_Frame();
            avFrame.u32AVFrameFlag = EasyTypes.EASY_SDK_VIDEO_FRAME_FLAG;
            avFrame.u32AVFrameLen  = frameInfo.length;
            avFrame.pBuffer        = pBuf;
            avFrame.u32VFrameType  = EasyTypes.EASY_SDK_VIDEO_FRAME_I;
            //发送数据包
            var ret = this.rtmpClient.SendPacket(avFrame);

            if (!ret.Key)
            {
                //return;
            }
            return(0);
        }
コード例 #3
0
        /// <summary>
        /// rtsp 回调
        /// </summary>
        /// <param name="channelId"></param>
        /// <param name="channelPtr"></param>
        /// <param name="frameType"></param>
        /// <param name="pBuf"></param>
        /// <param name="frameInfo"></param>
        /// <returns></returns>
        private int RtspCallBack(int channelId, IntPtr channelPtr, int frameType, IntPtr pBuf, IntPtr frameInfoPtr)
        {
            //视频帧处理
            if (frameType == EasyTypes.EASY_SDK_VIDEO_FRAME_FLAG)
            {
                //是否存在帧
                if (frameInfoPtr != IntPtr.Zero)
                {
                    this.OnRtspConnectChanged(true, "RTSP 正在接收!");
                    //获取帧信息
                    EasyTypes.EASY_FRAME_INFO frameInfo = (EasyTypes.EASY_FRAME_INFO)Marshal.PtrToStructure(frameInfoPtr, typeof(EasyTypes.EASY_FRAME_INFO));
                    if (frameInfo.type == EasyTypes.EASY_SDK_VIDEO_FRAME_I)//处理I帧
                    {
                        this.ProcessVideoFrame_I(channelPtr, frameInfoPtr, pBuf);
                    }
                    else//处理其他帧
                    {
                        this.ProcessVideoFrame(channelPtr, frameInfoPtr, pBuf);
                    }
                }
            }

            //音频侦处理
            if (frameType == EasyTypes.EASY_SDK_AUDIO_FRAME_FLAG)
            {
                this.ProcessAudioFrame(channelPtr, frameInfoPtr, pBuf);
            }

            //媒体类型侦处理
            if (frameType == EasyTypes.EASY_SDK_MEDIA_INFO_FLAG)
            {
                this.ProcessMediaFrame(channelPtr, frameInfoPtr, pBuf);
            }

            //事件帧处理
            if (frameType == EasyTypes.EASY_SDK_EVENT_FRAME_FLAG)
            {
                this.ProcessEventFrame(channelPtr, frameInfoPtr, pBuf);
            }

            return(0);
        }
コード例 #4
0
        /// <summary>
        /// 处理RTSP事件帧
        /// </summary>
        /// <param name="channelInfo"></param>
        /// <param name="frameInfoPtr"></param>
        /// <param name="pBuf"></param>
        /// <returns></returns>
        private int ProcessEventFrame(IntPtr channelPtr, IntPtr frameInfoPtr, IntPtr pBuf)
        {
            //开始进行连接,建立EasyRTSPClient连接线程
            if (pBuf == IntPtr.Zero && frameInfoPtr == IntPtr.Zero)
            {
                this.OnRtspConnectChanged(false, "RTSP 正在连接!");
                return(0);
            }

            //是否存在帧
            bool hasFrame = frameInfoPtr != IntPtr.Zero;

            //获取帧信息
            EasyTypes.EASY_FRAME_INFO frameInfo = hasFrame ? (EasyTypes.EASY_FRAME_INFO)Marshal.PtrToStructure(frameInfoPtr, typeof(EasyTypes.EASY_FRAME_INFO)) : new EasyTypes.EASY_FRAME_INFO();

            //连接线程退出,此时上层应该停止相关调用,复位连接按钮等状态
            if (hasFrame && frameInfo.codec == EasyTypes.EASY_SDK_EVENT_CODEC_EXIT)
            {
                this.OnRtspConnectChanged(false, "RTSP 连接退出!");
                return(0);
            }

            //连接失败
            if (hasFrame && frameInfo.codec == EasyTypes.EASY_SDK_EVENT_CODEC_FAIL)
            {
                this.OnRtspConnectChanged(false, "RTSP 连接失败!");
                return(0);
            }

            //连接错误,错误码通过EasyRTSP_GetErrCode()接口获取,比如404
            if (hasFrame && frameInfo.codec == EasyTypes.EASY_SDK_EVENT_CODEC_ERROR)
            {
                int errorCode;
                this.rtspClient.GetErrCode(out errorCode);
                string message = errorCode.ToString();
                if (errorCode == 400)
                {
                    message = "Bad Request";
                }
                else if (errorCode == 401)
                {
                    message = "Unauthorized";
                }
                else if (errorCode == 403)
                {
                    message = "Forbidden";
                }
                else if (errorCode == 404)
                {
                    message = "Not Found";
                }
                else if (errorCode == 500)
                {
                    message = "Internal Server Error";
                }
                else
                {
                    message = errorCode.ToString();
                }
                this.OnRtspConnectChanged(false, string.Concat("RTSP 连接错误:", message));
            }

            return(0);
        }