日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows平台RTSP|RTMP播放端SDK集成说明

發布時間:2025/3/12 windows 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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目錄下debug/release庫拷貝到需要集成的工程對應的debug或release目錄下(確保32位/64位庫debug/release目錄一一對應);
  • lib目錄如下:

  • 32位debug庫:debug
  • 32位release庫:release
  • 64位debug庫:x64\debug
  • 64位release庫:x64\release
  • 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_SetEventCallBack用于回調網絡鏈接狀態、buffer狀態(開始、buffer比例、結束)、實時帶寬等,對應EventID如下:
  • /*事件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*//* 接下來請從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)*/ }
  • NT_SP_SetVideoSizeCallBack設置視頻分辨率回調,如流數據攜帶視頻數據,SDK會回上來視頻寬高信息:
  • //video resolution callback video_size_call_back_ = new SP_SDKVideoSizeCallBack(SP_SDKVideoSizeHandle); NTSmartPlayerSDK.NT_SP_SetVideoSizeCallBack(player_handle_, IntPtr.Zero, video_size_call_back_);

    注意:視頻寬高回上來或繪制窗口發生變化時,記得調用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); }
  • NT_SP_SetVideoFrameCallBack設置YUV/RGB32數據回調,可用于對接第三方視頻分析,或自行繪制等,如系統不支持D3D繪制,可設置回調數據,上層GDI模式繪制:
  • /*定義視頻幀圖像格式*/ public enum NT_SP_E_VIDEO_FRAME_FORMAT : uint {NT_SP_E_VIDEO_FRAME_FORMAT_RGB32 = 1, // 32位的rgb格式, r, g, b各占8, 另外一個字節保留, 內存字節格式為: bb gg rr xx, 主要是和windows位圖匹配, 在小端模式下,按DWORD類型操作,最高位是xx, 依次是rr, gg, bbNT_SP_E_VIDEO_FRAME_FORMAT_ARGB = 2, // 32位的argb格式,內存字節格式是: bb gg rr aa 這種類型,和windows位圖匹配NT_SP_E_VIDEO_FRAME_FROMAT_I420 = 3, // YUV420格式, 三個分量保存在三個面上 }
  • NT_SP_SetVideoFrameCallBackV2設置YUV/RGB32數據回調,與NT_SP_SetVideoFrameCallBack接口的不同在于,吐出來的視頻數據, 可以指定寬高
  • NT_SP_SetRenderVideoFrameTimestampCallBack設置繪制視頻幀時,視頻幀時間戳回調,一般播放器無時間戳回調需求的話,無需設置:
  • //video timestamp callback video_frame_ts_callback_ = new SP_SDKRenderVideoFrameTimestampCallBack(SP_SDKRenderVideoFrameTimestampCallBack); NTSmartPlayerSDK.NT_SP_SetRenderVideoFrameTimestampCallBack(player_handle_, IntPtr.Zero, video_frame_ts_callback_);
  • NT_SP_SetAudioPCMFrameCallBack設置音頻PCM幀回調, 吐PCM數據出來,目前每幀大小是10ms一般播放器無使用需求的話,無需設置;
  • NT_SP_SetUserDataCallBack設置用戶數據回調此接口需要和推送端SDK配套使用,用于返回推送端設定的實時用戶數據(如時間戳、經緯度等各種擴展指令或信息),如只是單純使用播放SDK,無需設置;
  • NT_SP_SetSEIDataCallBack設置視頻SEI數據回調如只是單純使用播放SDK,不需要額外處理擴展SEI數據的話,無需設置
  • 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 播放前可選設置接口

  • NT_SP_SetBuffer設置視頻播放緩沖buffer大小,單位:毫秒;
  • 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_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萬能接口, 得到參數, 大多數問題,這些接口都能解決
  • 2.4.10.2 播放前后可實時調用的接口

  • NT_SP_SetMute播放過程中,實時靜音、取消靜音,可播放之前調用,亦或播放過程中實時調用;
  • NT_SP_SetAudioVolume不同于實時靜音接口,此接口可以更細粒度的控制音量,默認范圍[0,100],其中0是靜音,100是最大音量, 默認是100;
  • NT_SP_SetOnlyDecodeVideoKeyFrame多窗口播放場景下,部分窗口可能只需要播放關鍵幀,如有類似場景需求,可用此接口;
  • NT_SP_SetRotation設置視頻View旋轉,順時針旋轉,degress: 設置0, 90, 180, 270度有效,其他值無效,注意:除了0度,其他角度播放會耗費更多CPU;
  • NT_SP_SetFlipVertical設置視頻View上下反轉(垂直反轉)
  • NT_SP_SetFlipHorizontal設置視頻View水平反轉
  • NT_SP_SetRenderScaleMode:設置視頻畫面的填充模式,如填充整個繪制窗口、等比例填充繪制窗口,如不設置,默認填充整個繪制窗口;
  • 2.4.11 開始播放

    NT_SP_StartPlay

    開始播放RTMP或RTSP流數據。

    2.4.12 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停止錄像
  • 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集成说明的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。