Пример #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>
 /// 推送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));
     }
 }
Пример #4
0
 private extern static int EasyRTMP_SendPacket_Linux(IntPtr handle, EasyTypes.EASY_AV_Frame frame);