RTSP安防攝像機(海康大華宇視等)如何推送到RTMP流媒體服務器進行直播

方案介紹

目前互聯網直播的CDN和標準RTMP流媒體服務器一般只能接收RTMP格式的音視頻推流。目前市場上有一些自帶RTMP推流的攝像機和編碼器,能夠直接在其rtmp推流配置裏面配置推送到RTMP流媒體服務器上。可是大部分的安防網絡攝像機仍是不帶推流功能,尤爲是海康、大華、宇視等通用性價比高的攝像機,是不支持的,因此,對於這種攝像機只能經過二次開發的方式,先獲取攝像機實時視頻流並封裝成RTMP/FLV格式進行推送,再由RTMP流媒體服務器進行轉發/分發。git

獲取攝像機實時視頻流的方式能夠調用攝像機廠家的SDK,也能夠經過拉取攝像機的RTSP實時流來獲取。對於調用SDK獲取視頻流的方式由於不一樣廠家、不一樣型號的設備SDK都有所不一樣,因此這種方式獲取流不夠通用,定製性、穩定性都不可控,這樣就建議使用拉取攝像機RTSP流,而後轉成RTMP推送給RTMP流媒體服務器,能夠適應幾乎全部的網絡攝像機。github

第一步:拉取攝像機RTSP流

這裏使用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流和音頻流。
服務器

第二步:推送RTMP流到流媒體服務器

經過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網絡,實現互聯網級別的直播分發;插件

    詳細說明:http://www.easynvr.com

    點擊連接加入羣【EasyNVR解決方案】:383501345

同時,爲了方便多套EasyNVR集中管控,咱們開發了EasyNVS集中管理平臺,方便進行統一的EasyNVR集中管理;
EasyNVS

獲取更多信息

郵件:support@easydarwin.org

EasyDarwin開源流媒體服務器:www.easydarwin.org

EasyDSS商用流媒體解決方案:www.easydss.com

EasyNVR無插件直播方案:www.easynvr.com

QQ羣:587254841

Copyright © EasyDarwin.org 2012-2019

EasyDarwin

相關文章
相關標籤/搜索