C#封裝libEasyRTMP過程介紹

在編程語言中真正的霸主多年來一直是C++,所有的操作系統和絕大多數的商品軟件都是用C++作爲主要開發語言的。但是C#幾乎集中了所有關於軟件開發和軟件工程研究的最新成果:面向對象、類型安全、組件技術、自動內存管理、跨平臺異常處理、版本控制、代碼安全管理……。

本文我主要寫一下C#封裝libEasyRTMP的過程給大家參考一下,具體過程如下:

1、新建一個C#類庫項目,如下圖

108.png

2、查看接口函數

109.png

3、新建一個類EasyRTMPNetSDK,封裝如下:

public class EasyRTMPNetSDK
    {
       
        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct EASY_AV_Frame
        {
            public uint u32AVFrameFlag;    /* 幀標誌  視頻 or 音頻 */
            public uint u32AVFrameLen;     /* 幀的長度 */
            public uint u32VFrameType;     /* 視頻的類型,I幀或P幀 */
            public IntPtr pBuffer;           /* 數據 */
            public uint u32TimestampSec;   /* 時間戳(秒)*/
            public uint u32TimestampUsec;    /* 時間戳(微秒) */
        }

        public enum EASY_RTMP_STATE_T
        {
            EASY_RTMP_STATE_CONNECTING = 1,     /* 連接中 */
            EASY_RTMP_STATE_CONNECTED,              /* 連接成功 */
            EASY_RTMP_STATE_CONNECT_FAILED,         /* 連接失敗 */
            EASY_RTMP_STATE_CONNECT_ABORT,          /* 連接異常中斷 */
            EASY_RTMP_STATE_PUSHING,                /* 推流中 */
            EASY_RTMP_STATE_DISCONNECTED,           /* 斷開連接 */
            EASY_RTMP_STATE_ERROR
        }

        [StructLayoutAttribute(LayoutKind.Sequential)]
        public struct EASY_MEDIA_INFO_T
        {
            /// <summary>
            /// 視頻編碼類型
            /// </summary>
            public uint u32VideoCodec;

            /// <summary>
            /// 視頻幀率
            /// </summary>
            public uint u32VideoFps;



            /// <summary>
            /// 音頻編碼類型
            /// </summary>
            public uint u32AudioCodec;

            /// <summary>
            /// 音頻採樣率
            /// </summary>
            public uint u32AudioSamplerate;

            /// <summary>
            /// 音頻通道數
            /// </summary>
            public uint u32AudioChannel;

            /// <summary>
            /// 音頻採樣精度
            /// </summary>
            public uint u32AudioBitsPerSample;

            /// <summary>
            /// 視頻sps幀長度
            /// </summary>
            public uint u32VpsLength;

            /// <summary>
            /// 視頻sps幀長度
            /// </summary>
            public uint u32SpsLength;

            /// <summary>
            /// 視頻pps幀長度
            /// </summary>
            public uint u32PpsLength;


            /// <summary>
            /// 視頻pps幀長度
            /// </summary>
            public uint u32SeiLength;

            /// <summary>
            /// 視頻u8Vps幀內容
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 256)]
            public byte[] u8Vps;

            /// <summary>
            /// 視頻sps幀內容
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 256)]
            public byte[] u8Sps;

            /// <summary>
            /// 視頻sps幀內容
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 128)]
            public byte[] u8Pps;

            /// <summary>
            /// 視頻u8Sei幀內容
            /// </summary>
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 128)]
            public byte[] u8Sei;
        }

        public delegate int EasyRTMPCallBack(int _id, EASY_RTMP_STATE_T _state, ref EASY_AV_Frame _frame, IntPtr _userptr);


        [DllImport(@"Lib\libeasyrtmp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "_EasyRTMP_Activate@4")]
        public static extern int EasyRTMP_Activate(string license = "79736C36655969576B5A7541767A52656F6374414A65394659584E35556C524E55463949535573755A58686C4B56634D5671442F706634675A57467A65513D3D");

        [DllImport(@"Lib\libeasyrtmp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "_EasyRTMP_Create@0")]
        /* 創建推送句柄  返回爲句柄值 */
        public static extern IntPtr EasyRTMP_Create();


        [DllImport(@"Lib\libeasyrtmp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "_EasyRTMP_SetCallback@12")]
        /* 設置流傳輸事件回調 userptr傳輸自定義對象指針*/
        public static extern uint EasyRTMP_SetCallback(IntPtr handle, EasyRTMPCallBack callback, IntPtr userptr);

        /* 開始流傳輸 serverAddr:流媒體服務器地址、port:流媒體端口、streamName:流名稱<xxx.sdp>、username/password:推送攜帶的用戶名密碼、pstruStreamInfo:推送的媒體定義、bufferKSize:以k爲單位的緩衝區大小<512~2048之間,默認512> bool createlogfile:創建日誌文件*/
        [DllImport(@"Lib\libeasyrtmp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "_EasyRTMP_Connect@8")]
        public static extern uint EasyRTMP_Connect(IntPtr handle, string url);

        [DllImport(@"Lib\libeasyrtmp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "_EasyRTMP_InitMetadata@12")]
        /* 停止流傳輸 */
        public static extern uint EasyRTMP_InitMetadata(IntPtr handle, ref EASY_MEDIA_INFO_T pstruStreamInfo, uint bufferKSize);

        [DllImport(@"Lib\libeasyrtmp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "_EasyRTMP_SendPacket@8")]
        /* 推流 frame:具體推送的流媒體幀 */
        public static extern uint EasyRTMP_SendPacket(IntPtr pushPtr, ref EASY_AV_Frame frame);

        [DllImport(@"Lib\libeasyrtmp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "_EasyRTMP_Release@4")]
        /* 釋放推送句柄 */
        public static extern uint EasyRTMP_Release(IntPtr pushPtr);

    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章