Windows平臺如何快速實現RTSP/RTMP直播播放

前段時間,我們在 https://blog.csdn.net/renhui1112/article/details/104143794 提到“RTSP播放器開發過程中需要考慮哪些關鍵因素”,本次主要介紹,如何調用SDK實現RTSP/RTMP播放能力。
本文以調用大牛直播SDK爲例:

demo說明

  • SDK提供C++/C#兩套接口,對外提供32/64位庫,C++和C#接口一一對應,C#接口比C++接口增加前綴NT_PB_;
  • WIN-PlayerSDK-CPP-Demo:播放端SDK對應的C++接口的demo;
  • WIN-PlayerSDK-CSharp-Demo:播放端SDK對應的C#接口的demo; 播放端SDK支持Win7及以上系統;
  • 本demo基於VS2013開發;
  • 相關接口,可以到 Github 下載。

集成說明

C++頭文件:

  • [類型定義]nt_type_define.h
  • [Log定義]smart_log.h
  • [Log定義]smart_log_define.h
  • [base code定義]nt_base_code_define.h
  • [player接口]smart_player_define.h
  • [player參數定義]smart_player_sdk.h

C#頭文件:

  • [base code定義]nt_base_code_define.cs
  • [player接口]smart_player_define.cs
  • [player參數定義]smart_player_sdk.cs

到以下目錄,拷貝相關lib庫到自己系統目錄:

  • 32位debug:WIN-PlayerSDK-CSharp-Demo\SmartPlayer\bin\Debug
  • 32位 release:WIN-PlayerSDK-CSharp-Demo\SmartPlayer\bin\Release
  • 64位debug:WIN-PlayerSDK-CSharp-Demo\SmartPlayer\bin\x64\Debug
  • 64位release:WIN-PlayerSDK-CSharp-Demo\SmartPlayer\bin\x64\Release

1 初始化

NT_SP_Init
如需配置log路徑,請在NT_SP_Init之前,做如下設置(目錄可自行指定):
// 設置日誌路徑(請確保目錄存在)
//String log_path = “D:\playerlog”;
//NTSmartLog.NT_SL_SetPath(log_path);

2 Open生成播放實例

NT_SP_Open:每調用一次Open接口,對應一個播放實例。

3 設置回調事件

① NT_SP_SetEventCallBack:用於回調網絡鏈接狀態、buffer狀態(開始、buffer比例、結束)、實時帶寬等;
② NT_SP_SetVideoSizeCallBack:設置視頻分辨率回調;
③ NT_SP_SetVideoFrameCallBack:設置YUV/RGB32數據回調,可用於對接第三方視頻分析,或自行繪製等;
④ NT_SP_SetVideoFrameCallBackV2:設置YUV/RGB32數據回調,與NT_SP_SetVideoFrameCallBack接口的不同在於,吐出來的視頻數據, 可以指定寬高;
⑤ NT_SP_SetRenderVideoFrameTimestampCallBack:設置繪製視頻幀時,視頻幀時間戳回調;
⑥ NT_SP_SetAudioPCMFrameCallBack:設置音頻PCM幀回調, 吐PCM數據出來,目前每幀大小是10ms;
⑦ NT_SP_SetUserDataCallBack:設置用戶數據回調,此接口需要和推送端SDK配套使用,用於返回推送端設定的實時用戶數據(如時間戳、經緯度等各種擴展指令或信息);
⑧ NT_SP_SetSEIDataCallBack:設置視頻SEI數據回調。

4 設置RTMP/RTSP播放Url

NT_SP_SetURL:支持rtsp/rtmp/本地FLV文件(全路徑)

5 查看是否支持D3DRender

設置繪製窗口句柄(可選接口)
① NT_SP_IsSupportD3DRender
② NT_SP_SetRenderWindow
③ NT_SP_GDIDrawRGB32:使用GDI繪製RGB32數據

6 設置回調PCM

NT_SP_SetIsOutputAudioDevice:設置是否播放出聲音,這個和靜音接口是有區別的,這個接口的主要目的是爲了用戶設置了外部PCM回調接口後,又不想讓SDK播放出聲音時使用。

7 RTMP/RTSP播放參數設置

① NT_SP_SetBuffer:設置視頻播放緩衝buffer大小,單位:毫秒;
② NT_SP_SetMute:播放過程中,實時靜音、取消靜音,可播放之前調用,亦或播放過程中實時調用;
③ NT_SP_SetRTSPTcpMode:設置RTSP TCP 模式, 1爲TCP, 0爲UDP, 此接口僅RTSP有效;
④ NT_SP_SetRtspTimeout:設置RTSP超時時間, timeout單位爲秒,必須大於0;
NT_SP_SetRtspAutoSwitchTcpUdp:對於RTSP來說,有些可能支持rtp over udp方式,有些可能支持使用rtp over tcp方式. 爲了方便使用,有些場景下可以開啓自動嘗試切換開關, 打開後如果udp無法播放,sdk會自動嘗試tcp, 如果tcp方式播放不了,sdk會自動嘗試udp, is_auto_switch_tcp_udp: 如果設置1的話, sdk將在tcp和udp之間嘗試切換播放,如果設置爲0,則不嘗試切換;
⑤ NT_SP_SetFastStartup:設置秒開, 1爲秒開, 0爲不秒開,此接口用於如RTMP服務器緩存GOP時,酌情使用;
⑥ NT_SP_SetLowLatencyMode:設置低延時播放模式,默認是正常播放模式,mode: 1爲低延時模式, 0爲正常模式;
⑦ NT_SP_SetRotation:設置視頻View旋轉,順時針旋轉,degress: 設置0, 90, 180, 270度有效,其他值無效,注意:除了0度,其他角度播放會耗費更多CPU;
⑧ NT_SP_SetFlipVertical:設置視頻View上下反轉(垂直反轉);
⑨ NT_SP_SetFlipHorizontal:設置視頻View水平反轉;
⑩ NT_SP_SetReportDownloadSpeed:設置下載速度上報, 默認不上報下載速度

  • is_report: 上報開關, 1: 表上報. 0: 表示不上報. 其他值無效.
  • report_interval: 上報時間間隔(上報頻率),單位是秒,最小值是1秒1次. 如果小於1且設置了上報,將調用失敗
  • 注意:如果設置上報的話,請設置SetEventCallBack, 然後在回調函數裏面處理這個事件.
  • 上報事件是:NT_SP_E_EVENT_ID_DOWNLOAD_SPEED
    ⑪ NT_SP_GetDownloadSpeed:主動獲取下載速度,speed: 返回下載速度,單位是Byte/s;
    ⑫ NT_SP_SetParam:萬能接口, 設置參數, 大多數問題, 這些接口都能解決;
    ⑬ NT_SP_GetParam:萬能接口, 得到參數, 大多數問題,這些接口都能解決;
    ⑭ NT_SP_SetKey:設置RTMP加密流的解密key,目前只用來解密rtmp加密流,需與大牛直播SDK RTMP推送端配套使用;
    ⑮ NT_SP_SetDecryptionIV:設置RTMP加密流的解密向量,目前只用來解密rtmp加密流;
    ⑯ NT_SP_SetSDKClientKey:設置授權Key,正式授權Key請聯繫官方。

8 檢測是否支持硬解碼

		/*
         * 檢查是否支持H264硬解碼 
         * 如果支持的話返回NT_ERC_OK
		 */
        [DllImport(@"SmartPlayerSDK.dll")]
		public static extern UInt32 NT_SP_IsSupportH264HardwareDecoder();

		/*
         * 檢查是否支持H265硬解碼
         * 如果支持的話返回NT_ERC_OK
		 */
        [DllImport(@"SmartPlayerSDK.dll")]
		public static extern UInt32 NT_SP_IsSupportH265HardwareDecoder();

		/*
         * 設置H264硬解
         * is_hardware_decoder: 1:表示硬解, 0:表示不用硬解
         * reserve: 保留參數, 當前傳0就好
         * 成功返回NT_ERC_OK
		 */
        [DllImport(@"SmartPlayerSDK.dll")]
        public static extern UInt32 NT_SP_SetH264HardwareDecoder(IntPtr handle, Int32 is_hardware_decoder, Int32 reserve);

		/*
         * 設置H265硬解
         * is_hardware_decoder: 1:表示硬解, 0:表示不用硬解
         * reserve: 保留參數, 當前傳0就好
         * 成功返回NT_ERC_OK
		 */
        [DllImport(@"SmartPlayerSDK.dll")]
        public static extern UInt32 NT_SP_SetH265HardwareDecoder(IntPtr handle, Int32 is_hardware_decoder, Int32 reserve);

9 RTMP/RTSP播放端-開始播放

NT_SP_StartPlay

10 繪製窗口大小改變

NT_SP_OnWindowSize
如播放窗口大小調整,需調用此接口。

11 RTMP/RTSP拉流端錄像

① NT_SP_SetRecorderDirectory:設置錄像目錄
② NT_SP_SetRecorderFileMaxSize:設置單個文件最大大小
③ NT_SP_SetRecorderFileNameRuler:設置錄像文件名生成規則
④ NT_SP_SetRecorderCallBack:設置錄像回調接口
⑤ NT_SP_SetRecorderAudioTranscodeAAC:設置錄像時音頻轉AAC編碼的開關, aac比較通用,sdk增加其他音頻編碼(比如speex, pcmu, pcma等)轉aac的功能
⑥ NT_SP_SetRecorderVideo:設置是否錄視頻,默認的話,如果視頻源有視頻就錄,沒有就沒得錄, 但有些場景下可能不想錄制視頻,只想錄音頻,所以增加個開關
⑦ NT_SP_SetRecorderAudio:設置是否錄音頻,默認的話,如果視頻源有音頻就錄,沒有就沒得錄, 但有些場景下可能不想錄制音頻,只想錄視頻,所以增加個開關
⑧ NT_SP_StartRecorder:啓動錄像
⑨ NT_SP_StopRecorder:停止錄像

12 RTMP/RTSP拉流端快照(實時調用)

NT_SP_CaptureImage:捕獲圖片

13 RTMP/RTSP拉流端快速切換URL(實時調用)

NT_SP_SwitchURL:切換URL,其中:switch_pos: 切換到新url以後,設置的播放位置, 默認請填0, 這個只對設置播放位置的點播url有效, 直播url無效

14 用戶數據回調

NT_SP_SetUserDataCallBack:設置用戶數據回調,用於接收擴展SEI模塊發送的用戶數據信息

15 SEI數據回調

NT_SP_SetSEIDataCallBack:設置視頻sei數據回調,用於接收SEI數據回調

16 設置視頻畫面填充模式

        /*
         * 設置視頻畫面的填充模式,如填充整個繪製窗口、等比例填充繪製窗口,如不設置,默認填充整個繪製窗口
         * handle: 播放句柄
         * mode: 0: 填充整個繪製窗口; 1: 等比例填充繪製窗口, 默認值是0
         * 成功返回NT_ERC_OK
		 */
        [DllImport(@"SmartPlayerSDK.dll")]
        public static extern UInt32 NT_SP_SetRenderScaleMode(IntPtr handle, Int32 mode);

17 RTMP/RTSP播放端-停止播放

NT_SP_StopPlay

18 關閉播放實例

NT_SP_Close

19 Uninit

NT_SP_UnInit

20 RTMP/RTSP播放狀態Event回調

/*事件ID*/
        public enum NT_SP_E_EVENT_ID : uint
        {
            NT_SP_E_EVENT_ID_BASE = NTBaseCodeDefine.NT_EVENT_ID_SMART_PLAYER_SDK,

	        NT_SP_E_EVENT_ID_CONNECTING			= NT_SP_E_EVENT_ID_BASE | 0x2,	/*連接中*/
	        NT_SP_E_EVENT_ID_CONNECTION_FAILED	= NT_SP_E_EVENT_ID_BASE | 0x3,	/*連接失敗*/
	        NT_SP_E_EVENT_ID_CONNECTED			= NT_SP_E_EVENT_ID_BASE | 0x4,	/*已連接*/
	        NT_SP_E_EVENT_ID_DISCONNECTED		= NT_SP_E_EVENT_ID_BASE | 0x5,	/*斷開連接*/
             NT_SP_E_EVENT_ID_NO_MEDIADATA_RECEIVED = NT_SP_E_EVENT_ID_BASE | 0x8,	/*收不到RTMP數據*/
 		  NT_SP_E_EVENT_ID_RTSP_STATUS_CODE   = NT_SP_E_EVENT_ID_BASE | 0xB,  /*rtsp status code上報, 目前只上報401, param1表示status code*/
            NT_SP_E_EVENT_ID_NEED_KEY           = NT_SP_E_EVENT_ID_BASE | 0xC,  /*需要輸入解密key才能播放*/
            NT_SP_E_EVENT_ID_KEY_ERROR          = NT_SP_E_EVENT_ID_BASE | 0xD,  /*解密key不正確*/

	        /* 接下來請從0x81開始*/
	        NT_SP_E_EVENT_ID_START_BUFFERING = NT_SP_E_EVENT_ID_BASE | 0x81, /*開始緩衝*/
	        NT_SP_E_EVENT_ID_BUFFERING		 = NT_SP_E_EVENT_ID_BASE | 0x82, /*緩衝中, param1 表示百分比進度*/
	        NT_SP_E_EVENT_ID_STOP_BUFFERING  = NT_SP_E_EVENT_ID_BASE | 0x83, /*停止緩衝*/

	        NT_SP_E_EVENT_ID_DOWNLOAD_SPEED  = NT_SP_E_EVENT_ID_BASE | 0x91, /*下載速度, param1表示下載速度,單位是(Byte/s)*/

            NT_SP_E_EVENT_ID_PLAYBACK_REACH_EOS = NT_SP_E_EVENT_ID_BASE | 0xa1,     /*播放結束, 直播流沒有這個事件,點播流纔有*/
            NT_SP_E_EVENT_ID_RECORDER_REACH_EOS = NT_SP_E_EVENT_ID_BASE | 0xa2,     /*錄像結束, 直播流沒有這個事件, 點播流纔有*/
            NT_SP_E_EVENT_ID_PULLSTREAM_REACH_EOS = NT_SP_E_EVENT_ID_BASE | 0xa3,   /*拉流結束, 直播流沒有這個事件,點播流纔有*/

            NT_SP_E_EVENT_ID_DURATION = NT_SP_E_EVENT_ID_BASE | 0xa8, /*視頻時長,如果是直播,則不上報,如果是點播的話, 若能從視頻源獲取視頻時長的話,則上報, param1表示視頻時長,單位是毫秒(ms)*/
        }

21 RTMP/RTSP播放端音視頻數據回調

 [StructLayoutAttribute(LayoutKind.Sequential)]
    public struct NT_SP_PullStreamVideoDataInfo
    {
        public Int32 is_key_frame_; /* 1:表示關鍵幀, 0:表示非關鍵幀 */
        public UInt64 timestamp_;	/* 解碼時間戳, 單位是毫秒 */
	   public Int32 width_;	/* 一般是0 */
	   public Int32 height_; /* 一般也是0 */
	   public IntPtr parameter_info_; /* 一般是NULL */
	   public UInt32 parameter_info_size_; /* 一般是0 */
        public UInt64 presentation_timestamp_; /*顯示時間戳, 這個值要大於或等於timestamp_, 單位是毫秒*/
}
    /*
     *拉流吐音頻數據時,一些相關的數據
     */
  [StructLayoutAttribute(LayoutKind.Sequential)]
   public struct NT_SP_PullStreamAuidoDataInfo
   {
        public Int32 is_key_frame_; /* 1:表示關鍵幀, 0:表示非關鍵幀 */
        public UInt64 timestamp_;	/* 單位是毫秒 */
	   public Int32 sample_rate_;	/* 一般是0 */
	   public Int32 channel_; /* 一般是0 */
	   public IntPtr parameter_info_; /* 如果是AAC的話,這個是有值的, 其他編碼一般忽略 */
	   public UInt32 parameter_info_size_; /*如果是AAC的話,這個是有值的, 其他編碼一般忽略 */
	   public UInt64 reserve_; /* 保留  */
    }


以上是基礎的接口說明和調用流程,感興趣的開發者可以參考下。

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