/// <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> /// 创建RTMP推送的参数信息 /// </summary> /// <param name="mediaInfo"> 流媒体信息 </param> /// <param name="bufferKSize"> 缓冲区大小 </param> /// <returns></returns> public KeyValuePair <bool, string> InitMetadata(EasyTypes.EASY_MEDIA_INFO_T mediaInfo, int bufferKSize = 1024) { if (!this.IsInit) { return(new KeyValuePair <bool, string>(false, "RTMP 未创建!")); } try { int ret = IsWindows ? EasyRTMP_InitMetadata_Win32(this.RtmpHandle, mediaInfo, bufferKSize) : EasyRTMP_InitMetadata_Linux(this.RtmpHandle, mediaInfo, bufferKSize); if (ret == 0) { return(new KeyValuePair <bool, string>(true, "RTMP 创建媒体成功!")); } else { return(new KeyValuePair <bool, string>(false, string.Format("RTMP 创建媒体失败,错误代码:{0}", ret))); } } catch (System.Exception e) { return(new KeyValuePair <bool, string>(false, e.Message)); } }
private extern static int EasyRTMP_InitMetadata_Linux(IntPtr handle, EasyTypes.EASY_MEDIA_INFO_T pstruStreamInfo, int bufferKSize);