前段時間,我們在 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_; /* 保留 */
}
以上是基礎的接口說明和調用流程,感興趣的開發者可以參考下。