跨平台屏幕/摄像头RTMP推流模块设计要点
生活随笔
收集整理的這篇文章主要介紹了
跨平台屏幕/摄像头RTMP推流模块设计要点
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
經常有企業或開發者有這樣的疑惑,明明看到網上的demo,一個RTMP推送,五六個接口就搞定了,你們咋就搞得這么復雜?
以大牛直播SDK的(Github)Windows RTMP推流為例,我們的接口要100多個,下面我們就扯扯,為什么一個RTMP推送,怎么就這么難?
RTMP推送端SDK特點:
上個圖:
功能支持:
- ?[視頻采集處理]Windows平臺涵蓋“Windows視頻采集處理”功能;
- ?[音頻采集處理]Windows平臺涵蓋“Windows音頻采集處理”功能;
- ?[本地預覽]Windows平臺支持攝像頭/屏幕/合成數據實時預覽功能,Android/iOS平臺支持本地前后置攝像頭預覽;
- ?[攝像頭反轉/旋轉]Windows平臺支持攝像頭水平反轉、垂直反轉、0°/90°/180°/270°旋轉;
- ?[攝像頭采集]除常規YUV格式外,Windows平臺還支持MJPEG格式的攝像頭采集;
- ?[麥克風/揚聲器采集]Windows平臺音頻輸入端支持麥克風、揚聲器,或麥克風和揚聲器混音輸入;
- ?[RTMP推流]超低延時的RTMP協議直播推流SDK(Windows/Android/iOS支持RTMP擴展H.265推送);
- ?[視頻格式]Windows/Android平臺支持H.264/H.265編碼(Android H.265硬編碼),iOS平臺支持H.264編碼;
- ?[音頻格式]Windows/Android/iOS平臺支持AAC編碼,Windows/Android平臺支持Speex編碼;
- ?[音頻編碼]Windows/Android平臺支持Speex推送、Speex編碼質量設置;
- ?[音量調節]Windows/Android平臺采集端支持實時音量調節(其中,Windows平臺混音模式下支持單獨控制麥克風、揚聲器音量);
- ?[H.264硬編碼]Windows/Android/iOS平臺支持H.264特定機型硬編碼;
- ?[H.265硬編碼]Android/iOS平臺支持H.265特定機型硬編碼;
- ?[硬編碼自適應]Android/iOS平臺支持硬編碼自適應,如檢測到硬編碼不支持,自動切換到軟編(iOS如H.265硬編,先切換到H.264硬編碼,如不支持再嘗試H.264軟編);
- ?[軟硬編碼參數配置]支持gop間隔、幀率、bit-rate設置;
- ?[軟編碼參數配置]支持軟編碼profile、軟編碼速度、可變碼率設置;
- ?[多實例推送]支持多實例推送(如同時推送屏幕/攝像頭和外部數據);
- ?[RTMP擴展H.265]Windows/Android/iOS推送SDK支持RTMP擴展H.265推送,Windows針對攝像頭采集軟編碼,使用H.265可變碼率,帶寬大幅節省,效果直逼傳統H.265編碼攝像頭,Android/iOS平臺支持H.265硬編碼;
- ?[橫豎屏推流]Android/iOS平臺支持支持橫屏、豎屏推流;
- ?[多分辨率支持]支持攝像頭或屏幕多種分辨率設置;
- ?[Windows推屏]Windows平臺支持屏幕裁剪、窗口采集、屏幕/攝像頭數據合成等多種模式推送;
- ?[移動端推屏]Android平臺支持后臺service推送屏幕(推送屏幕需要5.0+版本);
- ?[移動端推屏]iOS平臺支持后臺推送屏幕(基于ReplayKit,需要iOS 10.0+版本);
- ?[事件回調]支持各種狀態實時回調;
- ?[水印]Windows平臺支持文字水印、png水印、實時遮擋,Android平臺支持文字水印、png水印;
- ?[RTMP推送模式]支持RTMP推送 live|record模式設置(需服務器支持);
- ?[鏡像]Android/iOS平臺支持前置攝像頭實時鏡像功能;
- ?[前后攝像頭實時切換]Android/iOS平臺支持采集過程中,前后攝像頭切換;
- ?[復雜網絡處理]支持斷網重連等各種網絡環境自動適配;
- ?[動態碼率]支持根據網絡情況自動調整推流碼率;
- ?[實時靜音]支持推送過程中,實時靜音/取消靜音;
- ?[實時快照]支持推流過程中,實時快照;
- ?[純音頻推流]支持僅采集音頻流并發起推流功能;
- ?[純視頻推流]支持特殊場景下的純視頻推流功能;
- ?[降噪]Windows/Android平臺支持環境音、手機干擾等引起的噪音降噪處理、自動增益、VAD檢測;
- ?[回音消除]Android平臺支持實時傳遞遠端PCM數據,方便回音消除處理;
- ?[外部編碼前視頻數據對接]支持YUV數據對接;
- ?[外部編碼前音頻數據對接]支持PCM對接;
- ?[外部編碼后視頻數據對接]支持外部H.264數據對接;
- ?[外部編碼后音頻數據對接]外部AAC/PCMA/PCMU/SPEEX數據對接;
- ?[推送端休眠設置]Windows平臺支持休眠接口(設置成休眠模式后CPU會適當降低);
- ?[編碼后數據輸出]Android平臺支持輸出編碼后的H264/AAC數據到上層,方便對接第三方平臺(如GB28181)對接;
- ?[擴展錄像功能]完美支持和錄像SDK組合使用,錄像相關功能,可參見"Windows/Android/iOS錄像";
- ?[裁剪模式]Android/iOS平臺支持特定分辨率攝像頭裁剪模式設置;
- ?[服務器兼容]支持自建服務器(如Nginx、SRS)或CDN。
支持平臺架構
| Windows平臺 | x86 debug/release, x64 debug/release |
| Android平臺 | armeabi-v7a, arm64-v8a, x86, x86_64 |
| iOS平臺 | armv7, arm64, i386, x86_64 |
Windows視頻采集處理相關:
- ?支持Windows屏幕采集、屏幕裁剪、特定窗口采集、攝像頭采集、擴展外部H.264數據對接;
- 攝像頭和屏幕合成
- ?[攝像頭和屏幕實時切換]支持推送過程中,攝像頭和屏幕互相切換,單畫面顯示攝像頭或屏幕;
- ?[攝像頭疊加到屏幕] 支持攝像頭按照設置坐標,疊加到屏幕指定位置,并支持實時關閉疊加層;
- ?[屏幕疊加到攝像頭] 支持屏幕按照設定坐標,疊加到攝像頭指定位置,并支持實時關閉疊加層;
- ?[實時水印]支持動態水印設置,完美支持文字水印、實時時間水印和圖片水印;
- ?[透明度]可以設置透明度處理(設置遮蓋);
Windows音頻采集處理相關
- ?支持Windows采集麥克風、揚聲器和外部AAC, Speex WB, PCMA, PCMU數據接口輸入;
- ?[音頻]支持揚聲器和麥克風音頻混音輸出(同時選擇“采集揚聲器”和“采集麥克風”);
- ?支持音頻“端點檢測(VAD)”,自適應碼流,音頻碼流更節省;
- ?支持回音消除功能;
- ?支持噪音抑制功能;
- ?支持自動增益控制。
Windows/Android/iOS錄像SDK相關
- ?[拉流]支持拉取RTSP流錄像;
- ?[拉流]支持拉取RTMP流錄像;
- ?[推流端錄像]支持推送端同步錄像;
- ?[邏輯分離]大牛直播錄像SDK不同于普通錄像接口,更智能,和推送、播放、轉發、內置輕量級RTSP服務SDK功能完全分離,支持隨時錄像;
- ?[url切換]在錄像過程中,支持切換不同URL,如兩個URL配置一致,則可以錄制到同一個MP4文件,如不一致,可自動分割到下一個文件;
- ?[參數設置]支持設置單個錄像文件大小、錄像路徑等,并支持純音頻、純視頻、音視頻錄制模式;
- ?[音頻轉碼]支持音頻(PCMU/PCMA,Speex等)轉AAC后再錄像;
- ?[265支持]支持RTSP/RTMP H.265錄制到MP4文件;
- ?[推送端265錄像]Windows/Android推送端SDK支持H265錄像;
- ?[事件回調]從開始錄像,到錄像結束均有event callback上來,網絡堵塞、音視頻同步均做了非常友好的處理。
看過之后,你再思考下,一個能滿足商業化目的的RTMP推流,真的是幾個接口能搞定的嗎?
附個Windows推送SDK的接口頭文件:
#ifndef NT_SMART_PUBLISHER_SDK_H_ #define NT_SMART_PUBLISHER_SDK_H_// The following ifdef block is the standard way of creating macros which make exporting // from a DLL simpler. All files within this DLL are compiled with the SMARTPUBLISHERSDK_EXPORTS // symbol defined on the command line. This symbol should not be defined on any project // that uses this DLL. This way any other project whose source files include this file see // SMARTPUBLISHERSDK_API functions as being imported from a DLL, whereas this DLL sees symbols // defined with this macro as being exported. #ifdef SMARTPUBLISHERSDK_EXPORTS #define SMARTPUBLISHERSDK_API __declspec(dllexport) #else #define SMARTPUBLISHERSDK_API __declspec(dllimport) #endif#include "nt_type_define.h"#include "nt_smart_publisher_define.h"#ifdef __cplusplus extern "C"{ #endif/*Image處理提供單獨的結構體, 降低存儲空間,方便拷貝*/typedef struct _NT_SmartPublisherImageSDKAPI{/*分配Image, 分配后,SDK內部會初始化這個結構體, 失敗的話返回NULL*/NT_PB_Image* (NT_API *AllocateImage)(NT_VOID);/*釋放Image, 注意一定要調用這個接口釋放內存,如果在你自己的模塊中釋放,Windows會出問題的,成功返回 NT_ERC_OK*/NT_UINT32(NT_API *FreeImage)(NT_PB_Image** ppImage);/*克隆一個Image, 失敗返回NULL*/NT_PB_Image* (NT_API* CloneImage)(const NT_PB_Image* src);/*拷貝Image, 會先釋放dst的資源,然后再拷貝成功返回 NT_ERC_OK*/NT_UINT32(NT_API* CopyImage)(NT_PB_Image* dst, const NT_PB_Image* src);/*給圖像一個面設置數據,如果這個面已經有數據,將會釋放掉再設置這個設置行為依賴于NT_PB_Image::format_成功返回 NT_ERC_OK*/NT_UINT32(NT_API* SetImagePlane)(NT_PB_Image* image, NT_INT32 plane,NT_INT32 planeStride, const NT_UINT8* planeData, NT_INT32 planeDataSize);/*加載PNG圖片file_name_utf8: 必須是utf8編碼成功返回 NT_ERC_OK*/NT_UINT32(NT_API* LoadImage)(NT_PCSTR file_name_utf8,NT_PB_Image** ppImage);} NT_SmartPublisherImageSDKAPI;/*繪制相關接口, 繪制后續可能會提供更多接口*/typedef struct _NT_SmartPublisherDrawImageSDKAPI{/*成功返回NT_ERC_OK*/NT_UINT32(NT_API *Draw)(NT_HDC hdc, NT_INT32 xDst, NT_INT32 yDst,NT_INT32 dstWidth, NT_INT32 dstHeight,NT_INT32 xSrc, NT_INT32 ySrc,NT_INT32 srcWidth, NT_INT32 srcHeight,const NT_PB_Image* image);} NT_SmartPublisherDrawImageSDKAPI;typedef struct _NT_SmartPublisherSDKAPI{/*flag目前傳0,后面擴展用, pReserve傳NULL,擴展用,成功返回 NT_ERC_OK*/NT_UINT32(NT_API *Init)(NT_UINT32 flag, NT_PVOID pReserve);/*這個是最后一個調用的接口成功返回 NT_ERC_OK*/NT_UINT32(NT_API *UnInit)();/*video_option 請參考 NT_PB_E_VIDEO_OPTION,auido_option 請參考 NT_PB_E_AUDIO_OPTIONflag目前傳0,后面擴展用, pReserve傳NULL,擴展用,獲取Handle成功返回 NT_ERC_OK*/NT_UINT32(NT_API *Open)(NT_PHANDLE pHandle, NT_UINT32 video_option, NT_UINT32 auido_option, NT_UINT32 flag, NT_PVOID pReserve);/*調用這個接口之后handle失效,成功返回 NT_ERC_OK*/NT_UINT32(NT_API *Close)(NT_HANDLE handle);/*設置事件回調,如果想監聽事件的話,建議調用Open成功后,就調用這個接口*/NT_UINT32(NT_API *SetEventCallBack)(NT_HANDLE handle,NT_PVOID call_back_data, NT_PB_SDKEventCallBack call_back);/*參數相關設置*//*設置屏幕裁剪left: 屏幕左上角x位置top: 屏幕左上角y位置width: 寬度, 必須是16的倍數height: 高度, 必須是16的倍數*/NT_UINT32(NT_API *SetScreenClip)(NT_HANDLE handle, NT_UINT32 left, NT_UINT32 top, NT_UINT32 width, NT_UINT32 height);/*移動屏幕剪切區域,這個接口只能推送或者錄像中調用left: 屏幕左上角x位置top: 屏幕左上角y位置*/NT_UINT32(NT_API *MoveScreenClipRegion)(NT_HANDLE handle, NT_UINT32 left, NT_UINT32 top);/*允許使用DXGI屏幕采集方式, 這種方式需要win8及以上系統才支持is_enable: 1表示啟用DXGI采集,0表示不啟用, 其他值直接返回錯誤成功返回 NT_ERC_OK*/NT_UINT32(NT_API *EnableDXGIScreenCapturer)(NT_HANDLE handle, NT_INT32 is_enable);/**采集屏幕時停用Aero, 這個只對win7有影響,win8及以上系統, 微軟已經拋棄了Aero Glass效果*is_disable: 1:表示停用,如果設置為1的話,在win7系統上開始捕屏時可能黑屏閃爍一下, 0:表示不停用* sdk內部默認值是1*成功返回 NT_ERC_OK*/NT_UINT32(NT_API *DisableAeroScreenCapturer)(NT_HANDLE handle, NT_INT32 is_disable);/*在使用GDI方式采集屏幕時, 如果需要采集WS_EX_LAYERED屬性窗口,設置成1is_enable: 1表示采集WS_EX_LAYERED屬性窗口, 0表示不采集WS_EX_LAYERED屬性窗口. 默認系統是0,不采集.注意采集WS_EX_LAYERED屬性窗口,鼠標會閃爍成功返回 NT_ERC_OK*/NT_UINT32(NT_API *EnableScreenCaptureLayeredWindow)(NT_HANDLE handle, NT_INT32 is_enable);/*這個接口主要判斷頂層窗口能否能被捕獲, 如果不能被捕獲的話返回NT_ERC_FAILED如果返回NT_ERC_OK,表示可能能捕獲*/NT_UINT32(NT_API *CheckCapturerWindow)(NT_HWND hwnd);/*設置要捕獲的窗口的句柄*/NT_UINT32(NT_API *SetCaptureWindow)(NT_HANDLE handle, NT_HWND hwnd);/*設置幀率*/NT_UINT32(NT_API *SetFrameRate)(NT_HANDLE handle, NT_UINT32 frame_rate);/*+++攝像頭相關接口+++*//*獲取攝像頭數量pNumer: 返回設備數量成功返回 NT_ERC_OK*/NT_UINT32(NT_API* GetVideoCaptureDeviceNumber)(NT_INT32* pNumer);/*返回攝像頭設備信息device_index: 設備索引device_name_utf8: 設備名稱,傳NULL將不返回名稱,如果不是NULL的話, device_name_length必須大于等于256, 返回utf8編碼的設備名稱device_name_length: 設備名稱緩沖大小,如果device_name_utf8是NULL,則傳入0, 否則必須大于等于256device_unique_id_utf8: 設備唯一ID, 傳NULL將不返回ID,如果不傳NULL的話,device_unique_id_length必須大于等于1024,返回utf8編碼的設備IDdevice_unique_id_length: 設備唯一ID緩沖代銷, 如果是device_unique_id_utf8NULL, 則傳入0,否則必須大于等于1024成功返回 NT_ERC_OK*/NT_UINT32(NT_API* GetVideoCaptureDeviceInfo)(NT_INT32 device_index,NT_PSTR device_name_utf8,NT_UINT32 device_name_length,NT_PSTR device_unique_id_utf8,NT_UINT32 device_unique_id_length);/*返回攝像頭能力數device_unique_id_utf8: 設備唯一idcapability_number: 返回的設備能力數成功返回 NT_ERC_OK*/NT_UINT32(NT_API* GetVideoCaptureDeviceCapabilityNumber)(NT_PCSTR device_unique_id_utf8,NT_INT32* capability_number);/*返回攝像頭能力device_unique_id_utf8: 設備唯一id,device_capability_index: 設備能力索引capability: 設備能力成功返回 NT_ERC_OK*/NT_UINT32(NT_API* GetVideoCaptureDeviceCapability)(NT_PCSTR device_unique_id_utf8,NT_INT32 device_capability_index,NT_PB_VideoCaptureCapability* capability);/** 在多個實例推送多路時,對于一個攝像頭來說,所有實例只能共享攝像頭,那么只有一個實例可以改變攝像頭分辨率,其他實例使用這個縮放后的圖像.在使用多實例時,調用這個接口禁止掉實例的分辨率設置能力.只留一個實例能改變分辨,如果不設置,行為未定義.這個接口必須在 SetLayersConfig, AddLayerConfig 之前調用device_unique_id_utf8: 設備唯一id成功返回 NT_ERC_OK*/NT_UINT32(NT_API* DisableVideoCaptureResolutionSetting)(NT_HANDLE handle,NT_PCSTR device_unique_id_utf8);/*啟動攝像頭預覽device_unique_id_utf8: 設備唯一idhwnd: 繪制的窗口句柄成功返回 NT_ERC_OK*/NT_UINT32(NT_API* StartVideoCaptureDevicePreview)(NT_PCSTR device_unique_id_utf8,NT_HWND hwnd);/**上下反轉攝像頭預覽圖像*is_flip: 1:表示反轉, 0:表示不反轉*/NT_UINT32(NT_API *FlipVerticalCameraPreview)(NT_HWND hwnd, NT_INT32 is_flip);/**水平反轉攝像頭預覽圖像*is_flip: 1:表示反轉, 0:表示不反轉*/NT_UINT32(NT_API *FlipHorizontalCameraPreview)(NT_HWND hwnd, NT_INT32 is_flip);/**旋轉攝像頭預覽圖像, 順時針旋轉degress: 設置0, 90, 180, 270度有效,其他值無效注意:除了0度,其他角度播放會耗費更多CPU*/NT_UINT32(NT_API *RotateCameraPreview)(NT_HWND hwnd, NT_INT32 degress);/*告訴SDK預覽窗口大小改變hwnd: 繪制的窗口句柄成功返回 NT_ERC_OK*/NT_UINT32(NT_API* VideoCaptureDevicePreviewWindowSizeChanged)(NT_HWND hwnd);/*停止攝像頭預覽hwnd: 繪制的窗口句柄成功返回 NT_ERC_OK*/NT_UINT32(NT_API* StopVideoCaptureDevicePreview)(NT_HWND hwnd);/***************************//*****獲取攝像頭RBG32圖像接口++//***************************//*調用流程:1. StartGetVideoCaptureDeviceImage 獲取句柄,切保存句柄2. GetVideoCaptureDeviceImage 獲取圖像3. StopGetVideoCaptureDeviceImage 停止, 之后句柄將無效*//*調用此接口前置條件: 必須調用過Init接口, 否則會奔潰或失敗pVideoCaptrueImageHandle: 要返回的句柄的指針,請不要和其他句柄搞混device_unique_id_utf8: 設備唯一id成功返回 NT_ERC_OK 并返回VideoCaptrueImageHandle句柄*/NT_UINT32(NT_API* StartGetVideoCaptureDeviceImage)(NT_PHANDLE pVideoCaptrueImageHandle,NT_PCSTR device_unique_id_utf8);/**上下反轉設備圖像*is_flip: 1:表示反轉, 0:表示不反轉*/NT_UINT32(NT_API *FlipVerticalVideoCaptureDeviceImage)(NT_HANDLE videoCaptrueImageHandle, NT_INT32 is_flip);/**水平反轉設備圖像*is_flip: 1:表示反轉, 0:表示不反轉*/NT_UINT32(NT_API *FlipHorizontalVideoCaptureDeviceImage)(NT_HANDLE videoCaptrueImageHandle, NT_INT32 is_flip);/**旋轉設備圖像, 順時針旋轉degress: 設置0, 90, 180, 270度有效,其他值無效注意:除了0度,其他角度播放會耗費更多CPU*/NT_UINT32(NT_API *RotateVideoCaptureDeviceImage)(NT_HANDLE videoCaptrueImageHandle, NT_INT32 degress);/*調用這個接口可以獲取攝像頭圖像videoCaptrueImageHandle: 句柄, 通過StartGetVideoCaptureDeviceImage得到的isDiscardImage: 1:表示取到圖像后,就把SDK內部保存的圖像刪除掉, 0:表示取到圖像后, SDK內部的圖像不刪除,那么下一次再調用這個接口的時候,如果攝像頭沒有產生新的圖像,就會返回上次返回過的圖像ppImage: 指向圖像指針的指針,如果有圖像的話, 會填充 *ppImage返回值:NT_ERC_OK: 表示取到圖像, *ppImage必然有值NT_ERC_PB_NO_IMAGE: 表示SDK內部目前沒有圖像,需要等待攝像頭產生圖像其他值: 可能是其他錯誤,比如參數錯誤等等注意:1. 這個接口返回的圖像 寬和高可能會變, 就是說每一次調用返回的圖像寬高可能不一樣2. 取到的圖像是從上到下的*/NT_UINT32(NT_API* GetVideoCaptureDeviceImage)(NT_HANDLE videoCaptrueImageHandle,NT_INT32 isDiscardImage,NT_PB_Image** ppImage);/*停止獲取攝像頭圖像成功返回 NT_ERC_OK注意:必須在調用UnInit之前調用*/NT_UINT32(NT_API* StopGetVideoCaptureDeviceImage)(NT_HANDLE videoCaptrueImageHandle);/***************************//*****獲取攝像頭RBA32圖像接口--//***************************//*設置攝像頭信息*/NT_UINT32(NT_API *SetVideoCaptureDeviceBaseParameter)(NT_HANDLE handle, NT_PCSTR device_unique_id_utf8, NT_UINT32 width, NT_UINT32 height);/**上下反轉攝像頭圖像*is_flip: 1:表示反轉, 0:表示不反轉*/NT_UINT32(NT_API *FlipVerticalCamera)(NT_HANDLE handle, NT_INT32 is_flip);/**水平反轉攝像頭圖像*is_flip: 1:表示反轉, 0:表示不反轉*/NT_UINT32(NT_API *FlipHorizontalCamera)(NT_HANDLE handle, NT_INT32 is_flip);/**旋轉攝像頭圖像, 順時針旋轉degress: 設置0, 90, 180, 270度有效,其他值無效注意:除了0度,其他角度播放會耗費更多CPU*/NT_UINT32(NT_API *RotateCamera)(NT_HANDLE handle, NT_INT32 degress);/*---攝像頭相關接口---*//*+++視頻合成相關設置+++*//*設置視頻合成層, 傳入的是一個數組, 請正確填充每一層reserve: 這個參數保留, 當前請傳0confs: 層配置數組count: 數組大小flag: 目前傳0pReserve: 保留將來用成功返回 NT_ERC_OK*/NT_UINT32(NT_API *SetLayersConfig)(NT_HANDLE handle, NT_INT32 reserve, const NT_PB_LayerBaseConfig** confs, NT_INT32 count,NT_UINT32 flag, NT_PVOID pReserve);/*清除所有層配置,注意這個接口只能在推送或者錄像之前調用,否則結果未定義這個接口主要是給C#使用,C++請直接使用SetLayersConfigreserve: 這個參數保留, 當前請傳0flag: 目前傳0pReserve: 保留將來用成功返回 NT_ERC_OK*/NT_UINT32 (NT_API *ClearLayersConfig)(NT_HANDLE handle, NT_INT32 reserve,NT_UINT32 flag, NT_PVOID pReserve);/*增加層配置,注意這個接口只能在推送或者錄像之前調用,否則結果未定義這個接口主要是給C#使用,C++請直接使用SetLayersConfigreserve: 這個參數保留, 當前請傳0conf: 配置層layer_type: 層類型flag: 目前傳0pReserve: 保留將來用成功返回 NT_ERC_OK*/NT_UINT32 (NT_API *AddLayerConfig)(NT_HANDLE handle, NT_INT32 reserve,NT_PVOID conf, NT_INT32 layer_type,NT_UINT32 flag, NT_PVOID pReserve);/*動態禁止或者啟用層index: 層索引, 不能是第0層,如果傳0的話,會失敗reserve: 保留字段,請傳0is_enable: 1表示能用,0表示禁止, 其他值直接返回錯誤成功返回 NT_ERC_OK*/NT_UINT32(NT_API *EnableLayer)(NT_HANDLE handle, NT_INT32 reserve,NT_INT32 index, NT_INT32 is_enable);/*更新層相關配置, 注意不是層的所有字段都可以更新,只是部分可以更新,并且有些層沒有字段可以更新,傳入的參數,SDK只選擇能更新的字段更新,不能更新的字段會被忽略reserve: 保留字段,請傳0conf: 配置flag: 請傳0pReserve: 保留字段,請傳0成功返回 NT_ERC_OK*/NT_UINT32(NT_API * UpdateLayerConfig)(NT_HANDLE handle, NT_INT32 reserve,const NT_PB_LayerBaseConfig* conf, NT_UINT32 flag, NT_PVOID pReserve);/*這個接口是給C#使用的, C++請使用上面的UpdateLayerConfig接口更新層相關配置, 注意不是層的所有字段都可以更新,只是部分可以更新,并且有些層沒有字段可以更新,傳入的參數,SDK只選擇能更新的字段更新,不能更新的字段會被忽略reserve: 保留字段,請傳0conf: 配置flag: 請傳0pReserve: 保留字段,請傳0成功返回 NT_ERC_OK*/NT_UINT32(NT_API * UpdateLayerConfigV2)(NT_HANDLE handle, NT_INT32 reserve,NT_PVOID conf, NT_INT32 layer_type, NT_UINT32 flag, NT_PVOID pReserve);/*修改層區域pReserve: 保留字段,請傳0成功返回 NT_ERC_OK*/NT_UINT32(NT_API *UpdateLayerRegion)(NT_HANDLE handle, NT_INT32 reserve,NT_INT32 index, const NT_PB_RectRegion* region);/*給index層投遞Image數據,目前主要是用來把rgb和yuv視頻數據傳給相關層reserve: 保留字段,請傳0index: 層索引image: 圖像flag: 請傳0pReserve: 保留字段,請傳0成功返回 NT_ERC_OK*/NT_UINT32(NT_API * PostLayerImage)(NT_HANDLE handle, NT_INT32 reserve,NT_INT32 index, const NT_PB_Image* image, NT_UINT32 flag, NT_PVOID pReserve);/*---視頻合成相關設置---*//*+++視頻截屏相關接口+++*//*捕獲圖片file_name_utf8: 文件名稱,utf8編碼call_back_data: 回調時用戶自定義數據call_back: 回調函數,用來通知用戶截圖已經完成或者失敗成功返回 NT_ERC_OK只有在推送或者錄像時調用才可能成功,其他情況下調用,返回錯誤.因為生成PNG文件比較耗時,一般需要幾百毫秒,為防止CPU過高,SDK會限制截圖請求數量,當超過一定數量時,調用這個接口會返回NT_ERC_PB_TOO_MANY_CAPTURE_IMAGE_REQUESTS. 這種情況下, 請延時一段時間,等SDK處理掉一些請求后,再嘗試.*/NT_UINT32(NT_API* CaptureImage)(NT_HANDLE handle, NT_PCSTR file_name_utf8,NT_PVOID call_back_data, NT_PB_SDKCaptureImageCallBack call_back);/*---視頻截屏相關接口---*//*+++視頻編碼相關接口+++*//*獲取視頻硬編碼器信息數count: 返回的數量成功返回 NT_ERC_OK*/NT_UINT32(NT_API *GetHWVideoEncoderInfoCount)(NT_INT32* count);/*獲取視頻硬編碼信息infos: 請先調用GetHWVideoEncoderInfoCount, 然后分配這個數組info_array_size: 分配的數組大小out_count: 實際返回的數量成功返回 NT_ERC_OK*/NT_UINT32(NT_API *GetHWVideoEncoderInfos)(NT_PB_HWVideoEncoderInfo* infos, NT_INT32 info_array_size, NT_INT32* out_count);/*設置軟硬編碼類型, 編碼器, codec_id, 編碼器其他參數.type: 0為軟編碼, 1為硬編碼, 默認是軟編碼.encoder_id: 如果是軟編碼, 請設置0; 如果是硬編碼, 128為NVIDIA video encoder (NVENC), 填其他值接口返回錯誤.param1: 如果是軟編碼,請設置0; 如果是硬編碼且是NVENC, 這個參數用來設置GPU index, 設置-1的話SDK自動選擇GPU.codec_id: 設置h264或h265編碼, 默認是h264, 請參考NT_MEDIA_CODEC_ID, h264填 NT_MEDIA_CODEC_ID_H264, h265填 NT_MEDIA_CODEC_ID_H265.注意: 軟編碼不支持h265, 硬編碼根據實際硬件情況決定是否支持h265.如果調用了這個接口,請不要再調用SetVideoEncoderType接口成功返回 NT_ERC_OK*/NT_UINT32(NT_API *SetVideoEncoder)(NT_HANDLE handle, NT_INT32 type, NT_INT32 encoder_id, NT_UINT32 codec_id, NT_INT32 param1);/*這個接口已經廢棄, 請使用SetVideoEncoder接口設置編碼類型, 當前支持h264和h265(注意:h265只有64位sdk庫支持, 在32位庫上設置會失敗)encoder_type: 1為h264, 2為h265, 默認為h264成功返回 NT_ERC_OK*/NT_UINT32(NT_API *SetVideoEncoderType)(NT_HANDLE handle, NT_INT32 encoder_type);/*注意,碼率控制兩種方式,要么是 SetVideoQuality(或者 SetVideoQualityV2) + SetVideoMaxBitRate要么是 SetVideoMaxBitRate + SetVideoBitRate*//*設置視頻質量, 范圍[0-20], 默認是10, 值越小質量越好,但碼率會越大建議用SetVideoQualityV2(注意:請看v2具體參數和范圍)*/NT_UINT32(NT_API *SetVideoQuality)(NT_HANDLE handle, NT_INT32 quality);/*設置視頻質量, 范圍[1-50], 值越小視頻質量越好,但碼率會越大. 請優先考慮默認值,對于H264, 默認值23對于H265, 默認值28*/NT_UINT32(NT_API *SetVideoQualityV2)(NT_HANDLE handle, NT_INT32 quality);/*設置最大視頻碼率, 單位kbps*/NT_UINT32(NT_API *SetVideoMaxBitRate)(NT_HANDLE handle, NT_INT32 kbit_rate);/*設置視頻碼率, 單位kbps, 默認是0,不使用平均碼率方式*/NT_UINT32(NT_API *SetVideoBitRate)(NT_HANDLE handle, NT_INT32 kbit_rate);/** 在一些特殊場景下, 視頻分辨率會改變, 如果設置一個固定碼率的的話,當視頻分辨率變大的時候會變的模糊,變小的話又會浪費碼率* 所以提供可以設置一組碼率的接口,滿足不同分辨率切換的需求* 規則: 比如設置兩組分辨率 640*360, 640*480, 那么當分辨率小于等于640*360時都使用640*360的碼率,* 當分辨率大于640*360且小于等于640*480時,就使用640*480的碼率,如果分辨率大于640*480 那就使用640*480的分辨率* 為了設置的更準確, 建議多劃分幾組, 讓區間變小* 調用這個接口每次設置一組,設置多組就調用多次**/NT_UINT32(NT_API* AddVideoEncoderBitrateGroupItem)(NT_HANDLE handle, const NT_PB_VideoEncoderBitrateGroupItem* item);/*清除視頻碼率組*/NT_UINT32(NT_API* ClearVideoEncoderBitrateGroup)(NT_HANDLE handle);/*設置關鍵幀間隔, 比如1表示所有幀都是關鍵幀,10表示每10幀里面一個關鍵幀,25表示每25幀一個關鍵幀*/NT_UINT32(NT_API *SetVideoKeyFrameInterval)(NT_HANDLE handle, NT_INT32 interval);/*設置H264 profile.profile: 1: H264 baseline(默認值). 2: H264 main. 3. H264 high成功返回 NT_ERC_OK*/NT_UINT32(NT_API *SetVideoEncoderProfile)(NT_HANDLE handle, NT_INT32 profile);/*設置視頻編碼速度speed: 范圍是 1 到 6, 值越小,速度越快,質量也越差*/NT_UINT32(NT_API *SetVideoEncoderSpeed)(NT_HANDLE handle, NT_INT32 speed);/*設置是否對圖像進行相同比較,相同圖像比較一般在采集桌面時有一定好處,可能能降低碼率is_compare_image: 1:表示比較, 0:表示不比較, 其他值無效max_frame_interval: */NT_UINT32(NT_API *SetVideoCompareSameImage)(NT_HANDLE handle, NT_INT32 is_compare_image,NT_UINT32 max_frame_interval);/*設置視頻最大關鍵幀間隔, 這個接口一般不使用,這里是用來配合SetVideoCompareSameImage接口的.比如開啟圖像比較后,SDK發現連續20s圖像都是相同的,但播放端需要收到關鍵幀才能解碼播放,所以需要一個限制.interval:單位是毫秒, 請和SetVideoKeyFrameInterval接口區分開,他們的參數設置方式是不同的*/NT_UINT32(NT_API *SetVideoMaxKeyFrameInterval)(NT_HANDLE handle, NT_INT32 interval);/*---視頻編碼相關接口---*//*+++音頻相關接口+++*//*獲取系統音頻輸入設備數*/NT_UINT32(NT_API* GetAuidoInputDeviceNumber)(NT_INT32* pNumer);/*獲取音頻輸入設備名稱device_id: 設備ID,需要輸入, 從0開始,最大值不能超過設備數device_name_buff: 設備名稱,返回的字符串以0結尾device_name_buff_size: 設備名稱buffer的大小,建議512*/NT_UINT32(NT_API* GetAuidoInputDeviceName)(NT_UINT32 device_id, NT_PSTR device_name_buff, NT_UINT32 device_name_buff_size);/**設置推送音頻編碼類型*type: 1:使用AAC編碼, 2:使用speex編碼, 其他值返回錯誤*成功返回 NT_ERC_OK*/NT_UINT32(NT_API* SetPublisherAudioCodecType)(NT_HANDLE handle, NT_INT32 type);/**設置推送Speex編碼質量*quality: 范圍是0-10, 默認是8:大約28kbps, 值越大,質量越好,碼率也越大*成功返回 NT_ERC_OK*/NT_UINT32(NT_API* SetPublisherSpeexEncoderQuality)(NT_HANDLE handle, NT_INT32 quality);/*設置推送靜音is_mute: 0表示不靜音, 1表示靜音*/NT_UINT32(NT_API* SetMute)(NT_HANDLE handle, NT_INT32 is_mute);/*設置音頻輸入設備IDdevice_id: 設備id, 一般從0開始 */NT_UINT32(NT_API* SetAuidoInputDeviceId)(NT_HANDLE handle, NT_UINT32 device_id);/*檢查是否能捕獲揚聲器音頻out_flag: 1表示可以捕獲揚聲器,0:表示不可以捕獲揚聲器*/NT_UINT32(NT_API* IsCanCaptureSpeaker)(NT_INT32* out_flag);/**設置采集揚聲器時是否補償靜音幀 這個只在auido_option是NT_PB_E_AUDIO_OPTION_CAPTURE_SPEAKER有效*is_compensation: 1表示補償, 0表示補償, 設置其他值無效*成功返回 NT_ERC_OK*/NT_UINT32(NT_API* SetCaptureSpeakerCompensateMute)(NT_HANDLE handle, NT_INT32 is_compensation);/**設置回音消除*isCancel: 1表示消除回音, 0表示不消除回音*delay: 回音時延,單位是毫秒,目前推薦設置100ms, 如果設置為0的話,將使用100ms*注意這個只對麥克風捕獲有作用,揚聲器捕獲無效*成功返回 NT_ERC_OK*/NT_UINT32(NT_API* SetEchoCancellation)(NT_HANDLE handle, NT_INT32 isCancel, NT_INT32 delay);/**設置音頻噪音抑制*isNS: 1表示噪音抑制, 0表示不抑制*注意,這個一般用在采集麥克風上,采集系統播放聲音時必須要性不大*成功返回 NT_ERC_OK*/NT_UINT32(NT_API* SetNoiseSuppression)(NT_HANDLE handle, NT_INT32 isNS);/**設置音頻自動增益控制*isAGC: 1表示增益控制, 0表示不控制*注意,這個一般用在采集麥克風上,采集系統播放聲音時必須要性不大*成功返回 NT_ERC_OK*/NT_UINT32(NT_API* SetAGC)(NT_HANDLE handle, NT_INT32 isAGC);/**設置端點檢測(Voice Activity Detection (VAD))*isVAD: 1表示端點檢測, 0表示不檢測*注意,這個一般用在采集麥克風上,采集系統播放音樂聲音時效果不好*成功返回 NT_ERC_OK*/NT_UINT32(NT_API* SetVAD)(NT_HANDLE handle, NT_INT32 isVAD);/**設置輸入音量, 這個接口一般不建議調用, 在一些特殊情況下可能會用, 一般不建議放大音量*index: 一般是0和1, 如果沒有混音的只用0, 有混音的話, 0,1分別設置音量*volume: 音量,默認是1.0,范圍是[0.0, 5.0], 設置成0靜音, 1音量不變*成功返回 NT_ERC_OK*/NT_UINT32(NT_API* SetInputAudioVolume)(NT_HANDLE handle, NT_INT32 index, float volume);/*---音頻相關接口---*//*+++推送相關接口+++*//*設置推送的URL支持同時推送到多個RTMP服務器上, 最多可以同時支持推到三個服務器上為設置多個URL,請調用多次成功返回 NT_ERC_OK*/NT_UINT32(NT_API *SetURL)(NT_HANDLE handle, NT_PCSTR url, NT_PVOID pReserve);/*設置rtmp推送加密選項url: 考慮到可能推送到多個服務器,可以根據推送url配置不同的加密選項, 請確保url和SetURL一致is_encrypt_video: 1:表示視頻加密, 0:表示視頻不加密, 默認不加密, 其他值返回錯誤is_encrypt_audio: 1:表示音頻加密, 0:表示音頻不加密, 默認不加密, 其他值返回錯誤成功返回 NT_ERC_OK*/NT_UINT32(NT_API *SetRtmpEncryptionOption)(NT_HANDLE handle, NT_PCSTR url, NT_INT32 is_encrypt_video, NT_INT32 is_encrypt_audio);/*設置rtmp加密算法url: 考慮到可能推送到多個服務器,可以根據推送url配置不同的加密選項, 請確保url和SetURL一致encryption_algorithm: 加密算法, 當前支持aes和國標sm4. 1為aes, 2為sm4, 默認為aes.*/NT_UINT32(NT_API *SetRtmpEncryptionAlgorithm)(NT_HANDLE handle, NT_PCSTR url, NT_INT32 encryption_algorithm);/*設置rtmp推送加密密鑰url: 考慮到可能推送到多個服務器,可以根據推送url配置不同的加密選項, 請確保url和SetURL一致key:加密密鑰key_size: 如果加密算法是aes, key_size必須是16, 24, 32 這三個值, 其他返回錯誤; 如果加密算法是sm4, key_size必須是16, 其他值返回錯誤.成功返回 NT_ERC_OK*/NT_UINT32(NT_API *SetRtmpEncryptionKey)(NT_HANDLE handle, NT_PCSTR url, const NT_BYTE* key, NT_UINT32 key_size);/*設置rtmp推送加密IV(初始化向量), 這個接口不調用的話, 將使用默認IVurl: 考慮到可能推送到多個服務器,可以根據推送url配置不同的加密選項, 請確保url和SetURL一致iv: 初始化向量iv_size: 當前必須是16, 其他值返回錯誤成功返回 NT_ERC_OK*/NT_UINT32(NT_API *SetRtmpEncryptionIV)(NT_HANDLE handle, NT_PCSTR url, const NT_BYTE* iv, NT_UINT32 iv_size);/**設置視頻包時間戳回調url:推送urlmin_call_interval:最小回調時間間隔(單位是毫秒), 如果是0的話,發送每個視頻包時都會回調callbackdata:回調時用戶自定義數據call_back:回調函數指針*/NT_UINT32(NT_API *SetVideoPacketTimestampCallBack)(NT_HANDLE handle,NT_PCSTR url, NT_UINT32 min_call_interval,NT_PVOID call_back_data, NT_PB_SDKVideoPacketTimestampCallBack call_back);/*設置推送狀態回調call_back_data: 回調時用戶自定義數據call_back*/NT_UINT32(NT_API *SetPublisherStatusCallBack)(NT_HANDLE handle,NT_PVOID call_back_data, NT_PB_SDKPublisherStatusCallBack call_back);/*啟動推送*/NT_UINT32(NT_API *StartPublisher)(NT_HANDLE handle, NT_PVOID pReserve);/*停止推送*/NT_UINT32(NT_API *StopPublisher)(NT_HANDLE handle);/*---推送相關接口---*//*+++發布rtsp流相關接口+++*//** 設置rtsp的流名稱* stream_name: 流程名稱,不能為空字符串,必須是英文* 這個作用是: 比如rtsp的url是:rtsp://192.168.0.111/test, test就是設置下去的stream_name* 成功返回 NT_ERC_OK*/NT_UINT32(NT_API *SetRtspStreamName)(NT_HANDLE handle, NT_PCSTR stream_name);/** 給要發布的rtsp流設置rtsp server, 一個流可以發布到多個rtsp server上,rtsp server的創建啟動請參考OpenRtspServer和StartRtspServer接口* handle: 推送實例句柄* rtsp_server_handle:rtsp server句柄 * reserve: 保留參數,傳0*/NT_UINT32(NT_API *AddRtspStreamServer)(NT_HANDLE handle, NT_HANDLE rtsp_server_handle, NT_INT32 reserve);/** 清除設置的rtsp server*/NT_UINT32(NT_API *ClearRtspStreamServer)(NT_HANDLE handle);/*啟動rtsp流reserve: 保留參數,傳0*/NT_UINT32(NT_API *StartRtspStream)(NT_HANDLE handle, NT_INT32 reserve);/*停止rtsp流*/NT_UINT32(NT_API *StopRtspStream)(NT_HANDLE handle);/*---發布rtsp流相關接口---*//*+++推送rtsp相關接口+++*//*設置推送rtsp傳輸方式transport_protocol: 1表示UDP傳輸rtp包; 2表示TCP傳輸rtp包. 默認是1, UDP傳輸. 傳其他值SDK報錯。成功返回 NT_ERC_OK*/NT_UINT32(NT_API *SetPushRtspTransportProtocol)(NT_HANDLE handle, NT_INT32 transport_protocol);/*設置推送RTSP的URL成功返回 NT_ERC_OK*/NT_UINT32(NT_API *SetPushRtspURL)(NT_HANDLE handle, NT_PCSTR url);/*啟動推送RTSP流reserve: 保留參數,傳0*/NT_UINT32(NT_API *StartPushRtsp)(NT_HANDLE handle, NT_INT32 reserve);/*停止推送RTSP流*/NT_UINT32(NT_API *StopPushRtsp)(NT_HANDLE handle);/*---推送rtsp相關接口---*//*+++錄像相關接口+++*//*設置本地錄像目錄, 必須是英文目錄,否則會失敗*/NT_UINT32(NT_API *SetRecorderDirectory)(NT_HANDLE handle, NT_PCSTR dir, NT_PVOID pReserve);/*設置單個錄像文件最大大小, 當超過這個值的時候,將切割成第二個文件size: 單位是KB(1024Byte), 當前范圍是 [5MB-1GB], 超出將被設置到范圍內*/NT_UINT32(NT_API *SetRecorderFileMaxSize)(NT_HANDLE handle, NT_UINT32 size);/*設置錄像文件名生成規則*/NT_UINT32(NT_API *SetRecorderFileNameRuler)(NT_HANDLE handle, NT_PB_RecorderFileNameRuler* ruler);/*啟動錄像*/NT_UINT32(NT_API *StartRecorder)(NT_HANDLE handle, NT_PVOID pReserve);/*暫停錄像is_pause: 1表示暫停, 0表示恢復錄像, 輸入其他值將調用失敗成功返回NT_ERC_OK返回NT_ERC_PB_NEED_RETRY, 請隔一段時間再嘗試調用*/NT_UINT32(NT_API *PauseRecorder)(NT_HANDLE hanlde, NT_INT32 is_pause);/*停止錄像*/NT_UINT32(NT_API *StopRecorder)(NT_HANDLE handle);/*---錄像相關接口---*//*+++預覽相關接口+++*//*設置預覽圖像回調image_format: 請參考NT_PB_E_IMAGE_FORMAT,只能是NT_PB_E_IMAGE_FORMAT_RGB32, NT_PB_E_IMAGE_FORMAT_I420*/NT_UINT32(NT_API *SetVideoPreviewImageCallBack)(NT_HANDLE handle,NT_INT32 image_format,NT_PVOID call_back_data, NT_PB_SDKVideoPreviewImageCallBack call_back);/*啟動預覽reserve1: 保留參數傳0pReserve2: 保留參數傳NULL*/NT_UINT32(NT_API *StartPreview)(NT_HANDLE handle, NT_UINT32 reserve1, NT_PVOID pReserve2);/*停止預覽*/NT_UINT32(NT_API *StopPreview)(NT_HANDLE handle);/*---預覽相關接口---*//** 投遞編碼過的視頻數據給SDK* codec_id:請參考NT_MEDIA_CODEC_ID, 注意不要傳遞auido codec id,否則結果沒有定義* data: 編碼數據* size: 編碼數據大小* is_key_frame: 1:表示是關鍵幀, 0:表示不是* timestamp: 時間戳* 成功返回 NT_ERC_OK*/NT_UINT32(NT_API *PostVideoEncodedData)(NT_HANDLE handle, NT_UINT32 codec_id, const NT_BYTE* data, NT_UINT32 size,NT_INT32 is_key_frame, NT_UINT64 timestamp);/** 投遞編碼過的視頻數據給SDK V2版 * codec_id:請參考NT_MEDIA_CODEC_ID, 注意不要傳遞auido codec id,否則結果沒有定義* data: 編碼數據* size: 編碼數據大小* is_key_frame: 1:表示是關鍵幀, 0:表示不是* timestamp: 解碼時間戳* presentation_timestamp: 顯示時間戳* 注意:請確保 presentation_timestamp >= timestamp, 否則結果未定義* 成功返回 NT_ERC_OK*/NT_UINT32(NT_API *PostVideoEncodedDataV2)(NT_HANDLE handle, NT_UINT32 codec_id,const NT_BYTE* data, NT_UINT32 size,NT_INT32 is_key_frame, NT_UINT64 timestamp, NT_UINT64 presentation_timestamp);/** 投遞編碼過的音頻數據給SDK*codec_id:請參考NT_MEDIA_CODEC_ID, 注意不要傳遞video codec id,否則結果沒有定義* data: 編碼數據* size: 編碼數據大小* is_key_frame: 1:表示是關鍵幀, 0:表示不是* timestamp: 時間戳* parameter_info: 當編碼是aac的時候,這個是AudioSpecificConfig, 其他編碼請傳NULL* parameter_info_size: parameter_info 長度* 成功返回 NT_ERC_OK*/NT_UINT32(NT_API *PostAudioEncodedData)(NT_HANDLE handle, NT_UINT32 codec_id,const NT_BYTE* data, NT_UINT32 size,NT_INT32 is_key_frame, NT_UINT64 timestamp,const NT_BYTE* parameter_info,NT_UINT32 parameter_info_size);/** 投遞PCM音頻數據給SDK, 每10ms音頻數據傳入一次** data: pcm數據, 注意每個采樣必須是16位的,其他格式不支持, 注意雙通道的話數據是交錯的* size: pcm數據大小* timestamp:時間戳單位是毫秒,必須是遞增的* sample_rate: 采樣率* channels: 通道, 當前通道只支持1和2,也就是單通道和雙通道* per_channel_sample_number: 這個請傳入的是 sampleRate/100, 也就是單個通道的10毫秒的采樣數*/NT_UINT32(NT_API *PostAudioPCMData)(NT_HANDLE handle,const NT_BYTE* data, NT_UINT32 size, NT_UINT64 timestamp,NT_INT32 sample_rate, NT_INT32 channels, NT_INT32 per_channel_sample_number);/*** 投遞用來混音的PCM音頻數據給SDK, 每10ms音頻數據傳入一次* 這個接口只有在auido_option是NT_PB_E_AUDIO_OPTION_MIC_EXTERNAL_PCM_MIXER使用,其他情況下報錯* 當前只支持一路外部音頻和內置麥克風混音** data: pcm數據, 注意每個采樣必須是16位的,其他格式不支持, 注意雙通道的話數據是交錯的* size: pcm數據大小* timestamp:時間戳單位是毫秒,必須是遞增的* sample_rate: 采樣率* channels: 通道, 當前通道只支持1和2,也就是單通道和雙通道* per_channel_sample_number: 這個請傳入的是 sampleRate/100, 也就是單個通道的10毫秒的采樣數*/NT_UINT32(NT_API *PostAudioExternalPCMMixerData)(NT_HANDLE handle,const NT_BYTE* data, NT_UINT32 size, NT_UINT64 timestamp,NT_INT32 sample_rate, NT_INT32 channels, NT_INT32 per_channel_sample_number);/*++++發送用戶自定義數據相關接口++++*//** 1. 目前使用sei機制發送用戶自定數據到播放端* 2. 這種機制有可能會丟失數據, 所以這種方式不保證接收端一定能收到* 3. 優勢:能和視頻保持同步,雖然有可能丟失,但一般的需求都滿足了* 4. 目前提供兩種發送方式 第一種發送二進制數據, 第二種發送 utf8字符串*//** 設置發送隊列大小,為保證實時性,默認大小為3, 必須設置一個大于0的數* 如果數據超過隊列大小,將丟掉隊頭數據* 這個接口請在 StartPublisher 之前調用*/NT_UINT32(NT_API *SetPostUserDataQueueMaxSize)(NT_HANDLE handle, NT_INT32 max_size, NT_INT32 reserve);/** 清空用戶數據隊列, 有些情況可能會用到,比如發送隊列里面有4條消息再等待發送,又想把最新的消息快速發出去, 可以 * 先清除掉正在排隊消息, 再調用PostUserXXX **/NT_UINT32(NT_API *ClearPostUserDataQueue)(NT_HANDLE handle);/** 發送二進制數據* data: 二進制數據* size:數據大小* 注意: 1.目前數據大小限制在256個字節以內,太大可能會影響視頻傳輸,如果有特殊需求,需要增大限制,請聯系我們* 2. 如果積累的數據超過了設置的隊列大小,之前的隊頭數據將被丟棄* 3. 必須再調用StartPublisher之后再發送數據*/NT_UINT32(NT_API *PostUserData)(NT_HANDLE handle, const NT_BYTE* data, NT_UINT32 size, NT_INT32 reserve);/** 發送utf8字符串* utf8_str: utf8字符串* 注意: 1. 字符串長度不能超過256, 太大可能會影響視頻傳輸,如果有特殊需求,需要增大限制,請聯系我們* 2. 如果積累的數據超過了設置的隊列大小,之前的隊頭數據將被丟棄* 3. 必須再調用StartPublisher之后再發送數據*/NT_UINT32(NT_API *PostUserUTF8StringData)(NT_HANDLE handle, NT_PCSTR utf8_str, NT_INT32 reserve);/*----發送用戶自定義數據相關接口----*//*設置休眠模式mode: 1表示休眠, 0表示不休眠reserve: 保留參數, 當前傳0成功返回NT_ERC_OK*/NT_UINT32(NT_API *SetSleepMode)(NT_HANDLE hanlde, NT_INT32 mode, NT_INT32 reserve);/*萬能接口, 設置參數, 大多數問題, 這些接口都能解決*/NT_UINT32(NT_API *SetParam)(NT_HANDLE handle, NT_UINT32 id, NT_PVOID pData);/*萬能接口, 得到參數, 大多數問題,這些接口都能解決*/NT_UINT32(NT_API *GetParam)(NT_HANDLE handle, NT_UINT32 id, NT_PVOID pData);/*+++屏幕選取工具+++*//*注意這個接口返回的句柄,一定要和上面的推送時用的Open接口返回的句柄區分開,完全是不同的句柄,用錯結果未定義*//*mode: 請參考NT_PB_E_SCREEN_REGION_CHOOSE_MODEmode_data: mode == NT_PB_E_SCREEN_REGION_CHOOSE_MODE_CHOOSE, mode_data 是NULL.mode == NT_PB_E_SCREEN_REGION_CHOOSE_MODE_MOVE, mode_data 是NT_PB_RectRegion*callback: 這個必須要有,并且必須處理, 否則資源泄漏callback_data: callback dataflag目前傳0,后面擴展用, pReserve傳NULL,擴展用,打開一個屏幕選取工具的toolHandle成功返回 NT_ERC_OK*/NT_UINT32(NT_API *OpenScreenRegionChooseTool)(NT_PHANDLE pToolHandle,NT_UINT32 mode, NT_PVOID mode_data,NT_PB_SDKScreenRegionChooseCallBack callback,NT_PVOID callback_data,NT_UINT32 flag, NT_PVOID pReserve);/*調用這個接口之后toolHandle失效,成功返回 NT_ERC_OK*/NT_UINT32(NT_API *CloseScreenRegionChooseTool)(NT_HANDLE toolHandle);/*---屏幕選取工具---*//*+++rtsp server操作接口+++*//** 創建一個rtsp server * pRtspServerHandle: rtsp server 句柄* reserve:保留參數傳0* 成功返回 NT_ERC_OK*/NT_UINT32(NT_API *OpenRtspServer)(NT_PHANDLE pRtspServerHandle, NT_INT32 reserve);/** 設置rtsp server 監聽端口, 在StartRtspServer之前必須要設置端口* rtsp_server_handle: rtsp server 句柄* port: 端口號,可以設置為554,或者是1024到65535之間,其他值返回失敗* 成功返回 NT_ERC_OK*/NT_UINT32(NT_API *SetRtspServerPort)(NT_HANDLE rtsp_server_handle, NT_INT32 port);/** 設置rtsp server 鑒權用戶名和密碼, 這個可以不設置,只有需要鑒權的再設置* rtsp_server_handle: rtsp server 句柄* user_name: 用戶名,必須是英文* password:密碼,必須是英文* 成功返回 NT_ERC_OK*/NT_UINT32(NT_API *SetRtspServerUserNamePassword)(NT_HANDLE rtsp_server_handle, NT_PCSTR user_name, NT_PCSTR password);/** 設置rtsp server 組播, 如果server設置成組播就不能單播,組播和單播只能選一個, 一般來說單播網絡設備支持的好,wifi組播很多路由器不支持* rtsp_server_handle: rtsp server 句柄* is_multicast: 是否組播, 1為組播, 0為單播, 其他值接口返回錯誤, 默認是單播* 成功返回 NT_ERC_OK*/NT_UINT32(NT_API *SetRtspServerMulticast)(NT_HANDLE rtsp_server_handle, NT_INT32 is_multicast);/** 設置rtsp server 組播組播地址 * rtsp_server_handle: rtsp server 句柄* multicast_address: 組播地址* 如果設置的不是組播地址, 將返回錯誤* 組播地址范圍說明: [224.0.0.0, 224.0.0.255] 為組播預留地址, 不能設置. 可設置范圍為[224.0.1.0, 239.255.255.255], 其中SSM地址范圍為[232.0.0.0, 232.255.255.255]* 成功返回 NT_ERC_OK*/NT_UINT32(NT_API *SetRtspServerMulticastAddress)(NT_HANDLE rtsp_server_handle, NT_PCSTR multicast_address);/** 獲取rtsp server當前的客戶會話數, 這個接口必須在StartRtspServer之后再調用* rtsp_server_handle: rtsp server 句柄* session_numbers: 會話數* 成功返回 NT_ERC_OK*/NT_UINT32(NT_API *GetRtspServerClientSessionNumbers)(NT_HANDLE rtsp_server_handle, NT_INT32* session_numbers);/** 啟動rtsp server* rtsp_server_handle: rtsp server 句柄* reserve: 保留參數傳0* 成功返回 NT_ERC_OK*/NT_UINT32(NT_API *StartRtspServer)(NT_HANDLE rtsp_server_handle, NT_INT32 reserve);/** 停止rtsp server* rtsp_server_handle: rtsp server 句柄* 成功返回 NT_ERC_OK*/NT_UINT32(NT_API *StopRtspServer)(NT_HANDLE rtsp_server_handle);/** 關閉rtsp server* 調用這個接口之后rtsp_server_handle失效,* 成功返回 NT_ERC_OK*/NT_UINT32 (NT_API *CloseRtspServer)(NT_HANDLE rtsp_server_handle);/*---rtsp server操作接口---*//*+++ NT_PB_Image 操作函數+++*/NT_SmartPublisherImageSDKAPI ImageAPI_;/*--- NT_PB_Image 操作函數---*//*+++繪制操作+++*/NT_SmartPublisherDrawImageSDKAPI drawImageAPI_;/*---繪制操作---*/} NT_SmartPublisherSDKAPI;NT_UINT32 NT_API NT_GetSmartPublisherSDKAPI(NT_SmartPublisherSDKAPI* pAPI);/*reserve1: 請傳0NT_PVOID: 請傳NULL成功返回: NT_ERC_OK*/NT_UINT32 NT_API NT_PB_SetSDKClientKey(NT_PCSTR cid, NT_PCSTR key, NT_INT32 reserve1, NT_PVOID reserve2);#ifdef __cplusplus } #endif#endif?
總結
以上是生活随笔為你收集整理的跨平台屏幕/摄像头RTMP推流模块设计要点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【深度学习】你不知道的车牌识别系统
- 下一篇: 【GNN】谷歌、阿里、腾讯等在大规模图神