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