目前互聯網直播的CDN和標準RTMP流媒體服務器一般只能接收RTMP格式的音視頻推流。目前市場上有一些自帶RTMP推流的攝像機和編碼器,能夠直接在其rtmp推流配置裏面配置推送到RTMP流媒體服務器上。可是大部分的安防網絡攝像機仍是不帶推流功能,尤爲是海康、大華、宇視等通用性價比高的攝像機,是不支持的,因此,對於這種攝像機只能經過二次開發的方式,先獲取攝像機實時視頻流並封裝成RTMP/FLV格式進行推送,再由RTMP流媒體服務器進行轉發/分發。git
獲取攝像機實時視頻流的方式能夠調用攝像機廠家的SDK,也能夠經過拉取攝像機的RTSP實時流來獲取。對於調用SDK獲取視頻流的方式由於不一樣廠家、不一樣型號的設備SDK都有所不一樣,因此這種方式獲取流不夠通用,定製性、穩定性都不可控,這樣就建議使用拉取攝像機RTSP流,而後轉成RTMP推送給RTMP流媒體服務器,能夠適應幾乎全部的網絡攝像機。github
這裏使用EasyRTSPClient(https://github.com/EasyDSS/EasyRTSPClient)拉取RTSP流,很是簡單易用,接口以下:web
/* _channelId: 通道號,暫時不用 _channelPtr: 通道對應對象,暫時不用 _frameType: EASY_SDK_VIDEO_FRAME_FLAG/EASY_SDK_AUDIO_FRAME_FLAG/EASY_SDK_EVENT_FRAME_FLAG/... _pBuf: 回調的數據部分,具體用法看Demo _frameInfo: 幀結構數據 */ typedef int (Easy_APICALL *RTSPSourceCallBack)( int _channelId, void *_channelPtr, int _frameType, char *pBuf, RTSP_FRAME_INFO* _frameInfo); #ifdef __cplusplus extern "C" { #endif /* 獲取最後一次錯誤的錯誤碼 */ Easy_API int Easy_APICALL EasyRTSP_GetErrCode(Easy_RTSP_Handle handle); /* 激活 */ #ifdef ANDROID Easy_API int Easy_APICALL EasyRTSP_Activate(char *license, char* userPtr); #else Easy_API int Easy_APICALL EasyRTSP_Activate(char *license); #endif /* 建立RTSPClient句柄 返回0表示成功,返回非0表示失敗 */ Easy_API int Easy_APICALL EasyRTSP_Init(Easy_RTSP_Handle *handle); /* 釋放RTSPClient 參數爲RTSPClient句柄 */ Easy_API int Easy_APICALL EasyRTSP_Deinit(Easy_RTSP_Handle *handle); /* 設置數據回調 */ Easy_API int Easy_APICALL EasyRTSP_SetCallback(Easy_RTSP_Handle handle, RTSPSourceCallBack _callback); /* 打開網絡流 */ Easy_API int Easy_APICALL EasyRTSP_OpenStream(Easy_RTSP_Handle handle, int _channelid, char *_url, EASY_RTP_CONNECT_TYPE _connType, unsigned int _mediaType, char *_username, char *_password, void *userPtr, int _reconn/*1000表示長鏈接,即若是網絡斷開自動重連, 其它值爲鏈接次數*/, int outRtpPacket/*默認爲0,即回調輸出完整的幀, 若是爲1,則輸出RTP包*/, int heartbeatType/*0x00:不發送心跳 0x01:OPTIONS 0x02:GET_PARAMETER*/, int _verbosity/*日誌打印輸出等級,0表示不輸出*/); /* 關閉網絡流 */ Easy_API int Easy_APICALL EasyRTSP_CloseStream(Easy_RTSP_Handle handle); #ifdef __cplusplus } #endif
各個平臺調用Demo參考https://github.com/EasyDSS/EasyRTSPClient。EasyRTSPClient拉取RTSP流,輸出實時的視頻H264流和音頻流。
服務器
經過EasyRTSPClient庫已經能夠獲取攝像機實時的視頻和音頻流, 再經過調用EasyRTMP(https://github.com/EasyDSS/EasyRTMP)庫能夠直接將這些數據自帶封裝成RTMP格式推送給服務器。網絡
typedef struct __EASY_AV_Frame { Easy_U32 u32AVFrameFlag; /* 幀標誌 視頻 or 音頻 */ Easy_U32 u32AVFrameLen; /* 幀的長度 */ Easy_U32 u32VFrameType; /* 視頻的類型,I幀或P幀 */ Easy_U8 *pBuffer; /* 數據 */ Easy_U32 u32TimestampSec; /* 時間戳(秒)*/ Easy_U32 u32TimestampUsec; /* 時間戳(微秒) */ }EASY_AV_Frame; /* 推送事件類型定義 */ typedef enum __EASY_RTMP_STATE_T { EASY_RTMP_STATE_CONNECTING = 1, /* 鏈接中 */ EASY_RTMP_STATE_CONNECTED, /* 鏈接成功 */ EASY_RTMP_STATE_CONNECT_FAILED, /* 鏈接失敗 */ EASY_RTMP_STATE_CONNECT_ABORT, /* 鏈接異常中斷 */ EASY_RTMP_STATE_PUSHING, /* 推流中 */ EASY_RTMP_STATE_DISCONNECTED, /* 斷開鏈接 */ EASY_RTMP_STATE_ERROR }EASY_RTMP_STATE_T; /* _frameType: EASY_SDK_VIDEO_FRAME_FLAG/EASY_SDK_AUDIO_FRAME_FLAG/EASY_SDK_EVENT_FRAME_FLAG/... _pBuf: 回調的數據部分,具體用法看Demo _frameInfo: 幀結構數據 _userPtr: 用戶自定義數據 */ typedef int (*EasyRTMPCallBack)(int _frameType, char *pBuf, EASY_RTMP_STATE_T _state, void *_userPtr); #ifdef __cplusplus extern "C" { #endif /* 激活EasyRTMP */ #ifdef ANDROID EasyRTMP_API Easy_I32 Easy_APICALL EasyRTMP_Activate(char *license, char* userPtr); #else EasyRTMP_API Easy_I32 Easy_APICALL EasyRTMP_Activate(char *license); #endif /* 建立RTMP推送Session 返回推送句柄 */ EasyRTMP_API Easy_RTMP_Handle Easy_APICALL EasyRTMP_Create(void); /* 設置數據回調 */ EasyRTMP_API Easy_I32 Easy_APICALL EasyRTMP_SetCallback(Easy_RTMP_Handle handle, EasyRTMPCallBack _callback, void * _userptr); /* 建立RTMP推送的參數信息 */ EasyRTMP_API Easy_I32 Easy_APICALL Easy_APICALL EasyRTMP_InitMetadata(Easy_RTMP_Handle handle, EASY_MEDIA_INFO_T* pstruStreamInfo, Easy_U32 bufferKSize); /* 鏈接RTMP服務器 */ EasyRTMP_API Easy_Bool Easy_APICALL EasyRTMP_Connect(Easy_RTMP_Handle handle, const char *url); /* 推送H264或AAC流 */ EasyRTMP_API Easy_U32 Easy_APICALL EasyRTMP_SendPacket(Easy_RTMP_Handle handle, EASY_AV_Frame* frame); /* 中止RTMP推送,釋放句柄 */ EasyRTMP_API void Easy_APICALL EasyRTMP_Release(Easy_RTMP_Handle handle); #ifdef __cplusplus }; #endif
在EasyRTSPClient的回調函數中將實時數據經過EasyRTMP庫的EasyRTMP_SendPacket接口推送出去便可。EasyRTMP SDK在https://github.com/EasyDSS/EasyRTMP。參考其中的EasyRTMP_RTSP例子,就是實現的拉取一路攝像機RTSP視頻流並以RTMP推送出去的Demo。svg
EasyRTSPClient與EasyRTMP 都是支持Windows、Linux、Android、iOS多個平臺的,能夠實如今各個平臺上推送RTMP給流媒體服務器。二者功能都避開了RTSP及RTMP等格式的繁瑣流程,直接簡單調用接口就能夠輕鬆實現流媒體直播推送。函數
目前基於EasyRTSPClient拉流和EasyRTMP推流的拉轉推方案主要有兩款:編碼
RTMPLive(https://github.com/EasyDSS/RTMPLive):支持多路拉轉推;url
EasyNVR(http://www.easynvr.com):EasyNVR可以經過簡單的網絡攝像機通道配置,將傳統監控行業裏面的高清網絡攝像機IP Camera、NVR等具備RTSP協議輸出的設備接入到EasyNVR,EasyNVR可以將這些視頻源的音視頻數據進行拉取,轉換爲RTMP/HLS,進行全平臺終端H5直播(Web、Android、iOS),而且EasyNVR可以將視頻源的直播數據對接到第三方CDN網絡,實現互聯網級別的直播分發;插件
點擊連接加入羣【EasyNVR解決方案】:383501345
同時,爲了方便多套EasyNVR集中管控,咱們開發了EasyNVS集中管理平臺,方便進行統一的EasyNVR集中管理;
EasyDarwin開源流媒體服務器:www.easydarwin.org
EasyDSS商用流媒體解決方案:www.easydss.com
EasyNVR無插件直播方案:www.easynvr.com
QQ羣:587254841
Copyright © EasyDarwin.org 2012-2019