zoukankan      html  css  js  c++  java
  • c#封装libEasyScreenLive同屏功能组件流程

    现在有越来越多的人在使用C#语言做编程,但我发现好像用C#做音视频流媒体开发的比较少。我们的libEasyScreenLive目前支持Windows、Android平台,通过EasyScreenLive我们就可以避免接触到稍显复杂的音视频源采集,编码和流媒体推送以及RTSP/RTP/RTCP/RTMP服务流程。

    本文就给大家介绍一下c#封装libEasyScreenLive同屏功能组件流程。

    新建一个类CapturePusherSDK,封装如下:

    public class CapturePusherSDK
        {
            /// <summary>
            /// 初始化推送接口,返回推送句柄
            /// </summary>
            /// <returns></returns>
            public static IntPtr EasyScreenLive_CreateEx()
            {
                var ret = EasyScreenLive_Create();
                return ret;
            }
    
            [DllImport(@"Lib\libEasyScreenLive.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?EasyScreenLive_Create@@YAPAXPAD0000@Z")]
            private static extern IntPtr EasyScreenLive_Create(
                string EasyIPCamera_Key = "6D72754B7A4969576B5A7341574668656F61656E772B314659584E3555324E795A57567554476C325A53356C65475862567778576F502F443430566863336C4559584A33615735555A57467453584E55614756435A584E30514449774D54686C59584E35",
                string EasyRTMP_Key = "79397037795969576B5A7341574668656F61656E772B314659584E3555324E795A57567554476C325A53356C65475751567778576F502F443430566863336C4559584A33615735555A57467453584E55614756435A584E30514449774D54686C59584E35",
                string EasyRTSP_Key = "6A36334A743469576B5A7341574668656F61656E772B314659584E3555324E795A57567554476C325A53356C6547572B567778576F502F443430566863336C4559584A33615735555A57467453584E55614756435A584E30514449774D54686C59584E35",
                string RTMPClient_KEY = null,
                string RTSPClient_KEY = null
                );
    
            /// <summary>
            /// 推送實例銷毀
            /// </summary>
            /// <param name="pusherHandle">EasyPusher_Create返回值</param>
            [DllImport(@"Lib\libEasyScreenLive.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?EasyScreenLive_Release@@YAXPAX@Z")]
            public static extern void EasyScreenLive_Release(IntPtr pusherHandle);
    
            /// <summary>
            /// 判断系统是否支持英伟达硬件编码
            /// </summary>
            /// <param name="pusherHandle">EasyScreenLive_IsSupportNvEncoder返回值</param>
            [DllImport(@"Lib\libEasyScreenLive.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?EasyScreenLive_IsSupportNvEncoder@@YA_NPAX@Z")]
            public static extern bool EasyScreenLive_IsSupportNvEncoder(IntPtr pusherHandle);
    
            /// <summary>
            /// 设置屏幕采集是否采集鼠标光标
            /// </summary>
            /// <param name="pusherHandle">EasyScreenLive_IsSupportNvEncoder返回值</param>
            [DllImport(@"Lib\libEasyScreenLive.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?EasyScreenLive_SetCaptureCursor@@YAHPAX_N@Z")]
            public static extern int EasyScreenLive_SetCaptureCursor(IntPtr pusherHandle, bool bShow);
            
            /// <summary>
            /// 開始音視頻數據捕捉
            /// 返回1正常
            /// </summary>
            /// <param name="pusherHandle">EasyPusher_Create返回值</param>
            /// <param name="eSourceType">推送數據源</param>
            /// <param name="hCapWnd">預覽句柄</param>
            /// <param name="encodeType">编码类型</param>
            /// <param name="szDataType">推送數據類型</param>
            /// <param name="nBitRate">比特率</param>
            /// <returns></returns>
            public static int EasyScreenLive_StartCapture(IntPtr pusherHandle, SOURCE_TYPE eSourceType, string szURL, IntPtr hCapWnd, EncoderType encodeType, string szDataType = "RGB24", int nWidth=1280, int nHeight=720, int nBitRate = 2048, bool bTranscode=false, ENCODE_MODE encMode=0)
            {
                var ret = EasyScreenLive_StartCapture(pusherHandle, eSourceType, szURL, 0, -1, hCapWnd, encodeType, nVideoWidth : nWidth, nVideoHeight: nHeight, nBitRate: nBitRate, szDataType: szDataType, bTransCode:bTranscode, encodeMode:encMode);
    
                return ret;
            }
    
            /// <summary>
            /// 開始音視頻數據捕捉
            /// 返回1正常
            /// </summary>
            /// <param name="pusherHandle">EasyPusher_Create返回值</param>
            /// <param name="eSourceType">推送數據源</param>
            /// <param name="nCamId">視頻設備ID</param>
            /// <param name="nAudioId">音頻設備ID</param>
            /// <param name="hCapWnd">預覽句柄</param>
            /// <param name="nVideoWidth"></param>
            /// <param name="nVideoHeight"></param>
            /// <param name="nFps"></param>
            /// <param name="nBitRate">比特率</param>
            /// <param name="szDataType">推送數據類型</param>
            /// <param name="nSampleRate"></param>
            /// <param name="nChannel">推送通道號</param>
            /// <returns></returns>
            [DllImport(@"Lib\libEasyScreenLive.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?EasyScreenLive_StartCapture@@YAHPAXW4tagSOURCE_TYPE@@PADHH0HHHHH2HH_NW4tagENCODE_MODE@@@Z")]
            private static extern int EasyScreenLive_StartCapture(IntPtr pusherHandle, SOURCE_TYPE eSourceType, string szURL, int nCamId, int nAudioId, IntPtr hCapWnd, EncoderType encodeType,
                int nVideoWidth = 1280, int nVideoHeight = 720, int nFps = 30, int nBitRate = 1024, string szDataType = "RGB24",  //VIDEO PARAM
                int nSampleRate = 44100, int nChannel = 2, bool bTransCode = false, ENCODE_MODE encodeMode = 0);
    
            /// <summary>
            /// 停止數據采集
            /// </summary>
            /// <param name="pusherHandle"></param>
            [DllImport(@"Lib\libEasyScreenLive.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?EasyScreenLive_StopCapture@@YAXPAX@Z")]
            public static extern void EasyScreenLive_StopCapture(IntPtr pusherHandle);
            /// <summary>
            /// 開始數據推送
            /// 返回0正常
            /// </summary>
            /// <param name="pusher">EasyPusher_Create返回值</param>
            /// <param name="pushType">推送類型</param>
            /// <param name="ServerIp">流媒體服務器地址</param>
            /// <param name="nPushPort">流媒體服務器端口</param>
            /// <param name="sPushName">流名稱</param>
            /// <param name="nPushBufSize">默認緩衝</param>
            /// <returns></returns>
            [DllImport(@"Lib\libEasyScreenLive.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?EasyScreenLive_StartPush@@YAHPAXW4tagPUSH_TYPE@@PADH2HH_N@Z")]
            public static extern int EasyScreenLive_StartPush(IntPtr pusher, PUSH_TYPE pushType, string ServerIp, int nPushPort, string sPushName, int rtpOverTcp, int nPushBufSize = 1024, bool bServerRecord = false);
    
            /// <summary>
            /// 停止推送
            /// </summary>
            /// <param name="pusher">EasyPusher_Create返回值</param>
            /// <param name="pushType">推送類型</param>
            [DllImport(@"Lib\libEasyScreenLive.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?EasyScreenLive_StopPush@@YAXPAXW4tagPUSH_TYPE@@@Z")]
            public static extern void EasyScreenLive_StopPush(IntPtr pusher, PUSH_TYPE pushType);
    
            /// <summary>
            /// 开始RTSP服务,返回0正常
            /// 注意:進程名稱需要為 EasyScreenLive.exe
            /// </summary>
            /// <param name="pusher">集采句柄</param>
            /// <param name="listenport">服务端口</param>
            /// <param name="username">用户名(可空)</param>
            /// <param name="password">密码(可空)</param>
            /// <param name="channelInfo">通道信息</param>
            /// <param name="channelNum">服务支持通道数,默认为1</param>
            [DllImport(@"Lib\libEasyScreenLive.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?EasyScreenLive_StartServer@@YAHPAXHPAD1PAU__EASYLIVE_CHANNEL_INFO_T@@H@Z")]
    
            public static extern int EasyScreenLive_StartServer(IntPtr pusher, int listenport, string username, string password, /*ref EASYLIVE_CHANNEL_INFO_T*/IntPtr infosIntptr, int channelNum = 1);
    
            /// <summary>
            /// 停止服务
            /// </summary>
            /// <param name="pusher">EasyPusher_Create返回值</param>
            /// <param name="pushType">推送類型</param>
            [DllImport(@"Lib\libEasyScreenLive.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?EasyScreenLive_StopServer@@YAHPAXH@Z")]
            public static extern int EasyScreenLive_StopServer(IntPtr serverHandle, int serverId);
        }
    
        public enum SOURCE_TYPE
        {
            SOURCE_LOCAL_CAMERA = 0,//本地音视频
            SOURCE_SCREEN_CAPTURE = 1,//屏幕捕获
            SOURCE_RTSP_STREAM = 2,//RTSP流
            SOURCE_RTMP_STREAM = 3,//RTMP流
            SOURCE_FILE_STREAM = 4,       //文件流推送(mp4,ts,flv???)
        }
    
        public enum PUSH_TYPE
        {
            PUSH_NONE = 0,
            PUSH_RTSP,
            PUSH_RTMP,
            //ADD ANY OTHER PUSH TYPE
        }
    
        /// <summary>
        /// 编码类型
        /// </summary>
        public enum EncoderType
        {
            默认编码器 = 0,//(效率最低,通用性强)
            快速软编码 = 1,//(效率高,通用性不强)
            快速硬编码 = 2//效率最高,通用性最低,需要英伟达独立显卡支持
        }
        public enum ENCODE_MODE
        {
            H264 = 0,
            H265 = 1
        }
        [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        public struct EASYLIVE_CHANNEL_INFO_T
        {
            public int id;
            public int enable_multicast;       //是否启用组播
            public int videoRTPPortNum;
            public int audioRTPPortNum;
            public int  ttl;
            public int enableFec;   // 是否使能fec
            public int fecGroudSize;// fec组大小
            public int fecParam;    // fec 冗余包  fecParam/%
            public int isEnableArq; // 使能 arq
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 36)]
            public string multicast_addr;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
            public string name;
        }
  • 相关阅读:
    用Eclipse做J2Me开发的前期配置
    cglib和asm相关的文章
    bcp命令详解
    Oracle/PLSQL AFTER DELETE Trigger
    Mybatis(九)分页插件PageHelper使用
    Mybatis(八)逆向工程
    Mybatis(四)关联映射
    Mybatis(三)返回值四.注解配置
    Mybatis(二)参数(Parameters)传递
    Mybatis(一)实现单表的增删改查
  • 原文地址:https://www.cnblogs.com/TSINGSEE/p/12848768.html
Copyright © 2011-2022 走看看