コード例 #1
0
        /// <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);
        }
コード例 #2
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 已启动!"));
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
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);
        }