/// <summary> /// rtmp 回调 /// </summary> /// <param name="frameType"></param> /// <param name="pBuf"></param> /// <param name="state"></param> /// <param name="userPtr"></param> /// <returns></returns> private int RtmpCallBack(int frameType, IntPtr pBuf, EasyRTMPAPI.EASY_RTMP_STATE_T state, IntPtr userPtr) { //获取通道信息 _channel_info channelInfo = (_channel_info)Marshal.PtrToStructure(userPtr, typeof(_channel_info)); switch (state) { case EasyRTMPAPI.EASY_RTMP_STATE_T.EASY_RTMP_STATE_CONNECTING: this.OnRtmpConnectChanged(false, "RTMP 正在连接!"); break; case EasyRTMPAPI.EASY_RTMP_STATE_T.EASY_RTMP_STATE_CONNECTED: this.OnRtmpConnectChanged(false, "RTMP 已连接!"); break; case EasyRTMPAPI.EASY_RTMP_STATE_T.EASY_RTMP_STATE_CONNECT_FAILED: this.OnRtmpConnectChanged(false, "RTMP 连接失败!"); break; case EasyRTMPAPI.EASY_RTMP_STATE_T.EASY_RTMP_STATE_CONNECT_ABORT: this.OnRtmpConnectChanged(false, "RTMP 连接中断!"); break; case EasyRTMPAPI.EASY_RTMP_STATE_T.EASY_RTMP_STATE_DISCONNECTED: this.OnRtmpConnectChanged(false, "RTMP 连接断开!"); break; default: break; } return(0); }
/// <summary> /// 启动 rtsp /// </summary> /// <returns></returns> public KeyValuePair <bool, string> StartRtsp() { //rtsp 初始化 var ret = this.rtspClient.Init(); if (!ret.Key) { this.StopRtsp(); return(ret); } //rtsp 回调 ret = this.rtspClient.SetCallback(this.RtspCallBack); if (!ret.Key) { this.StopRtsp(); return(ret); } //创建通道信息结构体 var channelInfo = new _channel_info(); channelInfo.fCfgInfo.channelId = this.ChannelId; channelInfo.fHavePrintKeyInfo = false; char[] charBuffer = new char[64]; string stringBuffer = string.Format("channel{0}", this.ChannelId); Array.Copy(stringBuffer.ToCharArray(), charBuffer, stringBuffer.Length); channelInfo.fCfgInfo.channelName = charBuffer; charBuffer = new char[512]; Array.Copy(this.RtspUrl.ToCharArray(), charBuffer, this.RtspUrl.Length); channelInfo.fCfgInfo.srcRtspAddr = charBuffer; charBuffer = new char[512]; Array.Copy(this.RtmpUrl.ToCharArray(), charBuffer, this.RtmpUrl.Length); channelInfo.fCfgInfo.destRtmpAddr = charBuffer; channelInfo.fCfgInfo.option = this.Option; channelInfo.fNVSHandle = this.rtspClient.RtspHandle; //分配用户自定义数据指针缓冲区 this.userPtr = Marshal.AllocHGlobal(Marshal.SizeOf(channelInfo)); //拷贝结构体数据作为用户自定义数据 Marshal.StructureToPtr(channelInfo, this.userPtr, true); //rtsp 连接 ret = this.rtspClient.OpenStream(this.RtspUrl, this.userPtr, 0); if (!ret.Key) { this.StopRtsp(); return(ret); } return(new KeyValuePair <bool, string>(true, "rtsp 已启动!")); }
/// <summary> /// 处理RTSP媒体信息帧 /// </summary> /// <param name="channelPtr"></param> /// <param name="frameInfoPtr"></param> /// <param name="pBuf"></param> /// <returns></returns> private int ProcessMediaFrame(IntPtr channelPtr, IntPtr frameInfoPtr, IntPtr pBuf) { if (pBuf == IntPtr.Zero) { return(0); } this.OnRtspConnectChanged(true, "RTSP 已连接!"); //获取通道信息 _channel_info channelInfo = (_channel_info)Marshal.PtrToStructure(channelPtr, typeof(_channel_info)); //从pBuf中获取媒体信息 var mediainfo = (EasyTypes.EASY_MEDIA_INFO_T)Marshal.PtrToStructure(pBuf, typeof(EasyTypes.EASY_MEDIA_INFO_T)); //更新通道媒体信息 channelInfo.fMediainfo = mediainfo; //更新通道信息指针 Marshal.StructureToPtr(channelInfo, channelPtr, true); 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); }