/// <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> /// 推送H264或AAC流 /// </summary> /// <param name="frame"></param> /// <returns></returns> public KeyValuePair <bool, string> SendPacket(EasyTypes.EASY_AV_Frame frame) { if (!this.IsInit) { return(new KeyValuePair <bool, string>(false, "RTMP 未创建!")); } try { int ret = IsWindows ? EasyRTMP_SendPacket_Win32(this.RtmpHandle, frame) : EasyRTMP_SendPacket_Linux(this.RtmpHandle, frame); if (ret == 0) { return(new KeyValuePair <bool, string>(true, "发送流媒体数据包成功!")); } else { return(new KeyValuePair <bool, string>(true, "发送流媒体数据包失败!")); } } catch (System.Exception e) { return(new KeyValuePair <bool, string>(false, e.Message)); } }
private extern static int EasyRTMP_SendPacket_Linux(IntPtr handle, EasyTypes.EASY_AV_Frame frame);