Windows平台RTSP|RTMP播放端SDK集成说明
2.1 demo說明
- 大牛直播SDK提供C++/C#兩套接口,對外提供32/64位debug/release庫,C++和C#接口一一對應,C#接口比C++接口增加前綴NT_PB_;
- WIN-PlayerSDK-CPP-Demo:播放端SDK對應的C++接口的demo;
- WIN-PlayerSDK-CSharp-Demo:播放端SDK對應的C#接口的demo;
- 播放端SDK支持Win7及以上系統;
- 本demo基于VS2013開發。
2.2 界面UI展示
?
2.3集成說明
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:
- SmartLog.dll
- SmartLog.lib
- SmartPlayerSDK.dll
- SmartPlayerSDK.lib
- avcodec-56.dll
- avdevice-56.dll
- avfilter-5.dll
- avformat-56.dll
- avutil-54.dll
- postproc-53.dll
- swresample-1.dll
- swscale-3.dll
集成步驟:
lib目錄如下:
2. 相關cs頭文件,加入需要集成的工程;
3. 在需要集成的工程,右鍵->Properties->
Application->Assembly name,大牛直播SDK按照APP名稱授權,未授權版本,此處請改成“SmartPlayer”,如需授權,可直接聯系商務;
?
4. 正式授權版,需要在Init()接口調用之前添加設置license的代碼(相關Key和CID請根據正式授權版郵件說明填寫):
2.4 接口調用時序(以C#為例)
2.4.1 設置授權license
C#的SDK,請在在NT.NTSmartPlayerSDK.NT_SP_Init之前添加下面的代碼:
NT.NTSmartPlayerSDK.NT_SP_SetSDKClientKey("xxxxxxxxxx", "xxxxxxxxxx", 0, IntPtr.Zero);UInt32 isInited = NT.NTSmartPlayerSDK.NT_SP_Init(0, IntPtr.Zero); if (isInited != 0) {MessageBox.Show("調用NT_SP_Init失敗..");return; }C++的SDK,請在player_api_.Init之前添加下面的代碼:
NT_SP_SetSDKClientKey(NT_SP_SetSDKClientKey("xxxxxxxxxx", "xxxxxxxxxx", 0, nullptr);if ( NT_ERC_OK != player_api_.Init(0, NULL) ) {return FALSE; }2.4.2 設置日志存放路徑
需要在player_api_.Init之前添加下面的代碼:
// 設置日志路徑(請確保目錄存在) String log_path = "D:\\playerlog"; NTSmartLog.NT_SL_SetPath(log_path);如目錄存在,并具備文件寫入權限,關閉應用程序后,相關文件夾下會有smart_sdk.log生成。
2.4.3 初始化SDK
NT_SP_Init:SDK初始化,多實例播放,此接口僅需調用一次即可。
2.4.4 特定機型硬解碼檢測
如系統用于特定機型環境下,特別是多路播放場景,需用到硬解碼的話,可以用以下兩組接口檢測系統是否支持硬解。
注:在軟解性能滿足系統需求的前提下,一般建議優先使用軟解。
/** 檢查是否支持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();如需使用硬解碼,調用如下接口即可:
NTSmartPlayerSDK.NT_SP_SetH264HardwareDecoder(player_handle_, is_support_h264_hardware_decoder_ ? 1 : 0, 0); NTSmartPlayerSDK.NT_SP_SetH265HardwareDecoder(player_handle_, is_support_h265_hardware_decoder_ ? 1 : 0, 0);2.4.5 Open生成播放實例
NT_SP_Open:每調用一次Open接口,對應一個播放實例,如需播放多實例,對應多個player handler。
if (player_handle_ == IntPtr.Zero) {player_handle_ = new IntPtr();UInt32 ret_open = NTSmartPlayerSDK.NT_SP_Open(out player_handle_, IntPtr.Zero, 0, IntPtr.Zero);if (ret_open != 0){player_handle_ = IntPtr.Zero;MessageBox.Show("調用NT_SP_Open失敗..");return;} }2.4.6 設置回調事件
注意:視頻寬高回上來或繪制窗口發生變化時,記得調用NT_SP_OnWindowSize()更新,如不調用可能會引起視頻模糊。
private void PlaybackWindowResized(Int32 width,Int32 height) {width_=width;height_=height;int left=playWnd.Left;int top=playWnd.Top;textBox_resolution.Text=width+"*"+height;if(player_handle_==IntPtr.Zero){return;}NTSmartPlayerSDK.NT_SP_OnWindowSize(player_handle_,playWnd.Width,playWnd.Height); }2.4.7 D3DRender檢測
目前,幾乎很少存在不支持D3D繪制的情況,考慮到系統通用性,我們在播放之前,先做檢測,具體調用接口如下:
/** handle: 播放句柄* hwnd: 這個要傳入真正用來繪制的窗口句柄* is_support: 如果支持的話?*is_support 為1, 不支持的話為0* 接口調用成功返回NT_ERC_OK*/ [DllImport(@"SmartPlayerSDK.dll")] public static extern UInt32 NT_SP_IsSupportD3DRender(IntPtr handle, IntPtr hwnd, ref Int32 is_support);對于不支持D3D繪制的情況下,設置回調YUV數據,上層直接用GDI模式繪制,注意:GDI繪制效率偏低。
Int32 in_support_d3d_render = 0;if (NT.NTBaseCodeDefine.NT_ERC_OK == NTSmartPlayerSDK.NT_SP_IsSupportD3DRender(player_handle_, playWnd.Handle, ref in_support_d3d_render)) {if (1 == in_support_d3d_render){is_support_d3d_render = true;} }if (is_support_d3d_render) {is_gdi_render_ = false;// 支持d3d繪制的話,就用D3D繪制NTSmartPlayerSDK.NT_SP_SetRenderWindow(player_handle_, playWnd.Handle);if (btn_check_render_scale_mode.Checked){NTSmartPlayerSDK.NT_SP_SetRenderScaleMode(player_handle_, 1);}else{NTSmartPlayerSDK.NT_SP_SetRenderScaleMode(player_handle_, 0);} } else {is_gdi_render_ = true;playWnd.Visible = false;// 不支持D3D就讓播放器吐出數據來,用GDI繪制//video frame callback (YUV/RGB)//format請參見?NT_SP_E_VIDEO_FRAME_FORMAT,如需回調YUV,請設置為?NT_SP_E_VIDEO_FRAME_FROMAT_I420video_frame_call_back_ = new SP_SDKVideoFrameCallBack(SetVideoFrameCallBack); NTSmartPlayerSDK.NT_SP_SetVideoFrameCallBack(player_handle_, (Int32)NT.NTSmartPlayerDefine.NT_SP_E_VIDEO_FRAME_FORMAT.NT_SP_E_VIDEO_FRAME_FORMAT_RGB32, IntPtr.Zero, video_frame_call_back_); }2.4.8 設置播放URL
NT_SP_SetURL:支持rtsp/rtmp/本地FLV文件(全路徑)。
2.4.9 設置回調PCM
NT_SP_SetIsOutputAudioDevice:設置是否播放出聲音,這個和靜音接口是有區別的,這個接口的主要目的是為了用戶設置了外部PCM回調接口后,又不想讓SDK播放出聲音時使用。
2.4.10 RTMP/RTSP播放參數設置
具體可參照Demo源碼里面InitCommonSDKParam():
2.4.10.1 播放前可選設置接口
* is_report: 上報開關, 1: 表上報. 0: 表示不上報. 其他值無效.
* report_interval: 上報時間間隔(上報頻率),單位是秒,最小值是1秒1次. 如果小于1且設置了上報,將調用失敗
* 注意:如果設置上報的話,請設置SetEventCallBack, 然后在回調函數里面處理這個事件.
* 上報事件是:NT_SP_E_EVENT_ID_DOWNLOAD_SPEED
2.4.10.2 播放前后可實時調用的接口
2.4.11 開始播放
NT_SP_StartPlay
開始播放RTMP或RTSP流數據。
2.4.12 RTMP/RTSP拉流端錄像
2.4.13 實時快照
NT_SP_CaptureImage
用于播放端實時截取當前播放圖片,圖片以PNG形式保存至本地。
String name = capture_image_path_ + "\\" + ?DateTime.Now.ToString("hh-mm-ss") + ".png";byte[] buffer1 = Encoding.Default.GetBytes(name); byte[] buffer2 = Encoding.Convert(Encoding.Default, Encoding.UTF8, buffer1, 0, buffer1.Length);byte[] buffer3 = new byte[buffer2.Length + 1]; buffer3[buffer2.Length] = 0;Array.Copy(buffer2, buffer3, buffer2.Length);IntPtr file_name_ptr = Marshal.AllocHGlobal(buffer3.Length); Marshal.Copy(buffer3, 0, file_name_ptr, buffer3.Length);capture_image_call_back_ = new SP_SDKCaptureImageCallBack(SDKCaptureImageCallBack);UInt32 ret = NTSmartPlayerSDK.NT_SP_CaptureImage(player_handle_, file_name_ptr, IntPtr.Zero, capture_image_call_back_);Marshal.FreeHGlobal(file_name_ptr);if (NT.NTBaseCodeDefine.NT_ERC_OK == ret) {// 發送截圖請求成功 } else if ((UInt32)NT.NTSmartPlayerDefine.SP_E_ERROR_CODE.NT_ERC_SP_TOO_MANY_CAPTURE_IMAGE_REQUESTS == ret) {// 通知用戶延時MessageBox.Show("Too many capture image requests!"); } else {// 其他失敗 }2.4.14 快速切換URL
NT_SP_SwitchURL
快速切換URL,用于不用析構整個player實例的前提下,實時切換播放的URL。
2.4.15 用戶數據回調
NT_SP_SetUserDataCallBack
設置用戶數據回調,用于接收擴展SEI模塊發送的用戶數據信息,如不是配合我們擴展SEI發送DK,此接口無需調用。
2.4.16 SEI數據回調
NT_SP_SetSEIDataCallBack
設置視頻sei數據回調,用于接收SEI數據回調,如流數據不存在SEI或不準備處理SEI數據,此接口無需調用。
2.4.17 停止播放
NT_SP_StopPlay
停止播放RTMP或RTSP流數據。
2.4.18 關閉播放實例
NT_SP_Close
調用Close接口后,player handler置空。
if ( player_handle_ != IntPtr.Zero) {NTSmartPlayerSDK.NT_SP_Close(player_handle_);player_handle_ = IntPtr.Zero; }2.4.19 Uninit
NT_SP_UnInit
UnInit() 是SDK最后一個調用的接口,多實例環境下,只需要調用一次即可。
總結
以上是生活随笔為你收集整理的Windows平台RTSP|RTMP播放端SDK集成说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: syslog发送日志而docker容器接
- 下一篇: java信息管理系统总结_java实现科