安防网络摄像机推送到RTMP流媒体服务器方案
方案介紹
RTMP流媒體服務器一般只接收RTMP格式的推流。目前市場上有一些自帶RTMP推流的攝像機和編碼器,可以直接在其配置里面配置推送到RTMP流媒體服務器上。但是大部分的安防網絡攝像機還不帶推流功能,對于這種攝像機只能通過自己動手開發出獲取攝像機實時視頻流并封裝成RTMP格式推送給流媒體服務器了。?
獲取攝像機實時視頻流的方式可以調用攝像機的SDK,也可以通過拉取攝像機的RTSP實時流來獲取。對于調用SDK獲取視頻流的方式因為不同廠家、不同型號的設備SDK都不同,所以這種方式獲取流不夠通用。這樣就建議使用拉取攝像機RTSP流,然后轉成RTMP推送給RTMP流媒體服務器,可以適應基本所有的網絡攝像機。
拉取攝像機RTSP流
這里使用EasyRTSPClient庫拉取RTSP流,非常簡單易用,接口如下:
/*
? ? _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庫可以直接將這些數據自帶封裝成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。需要同時拉取多路視頻并推送的Demo可以參考https://github.com/jinlong0813/RTMPLive。
總結
EasyRTSPClient與EasyRTMP SDK都是支持Windows、Linux、Android、iOS多個平臺的,可以實現在各個平臺上推送RTMP給流媒體服務器。兩個SDK都避開了RTSP及RTMP等格式的繁瑣流程,直接簡單調用接口就可以輕松實現流媒體直播推送。
獲取更多信息
技術方案與商業授權咨詢:13718530929
郵件:support@easydarwin.org
EasyDarwin開源流媒體服務器:www.easydarwin.org
EasyDSS商用流媒體解決方案:www.easydss.com
EasyNVR無插件直播方案:www.easynvr.com
QQ群:587254841
Copyright ? EasyDarwin.org 2012-2018
---------------------?
作者:jinlong0603?
來源:CSDN?
原文:https://blog.csdn.net/jinlong0603/article/details/78956993?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
總結
以上是生活随笔為你收集整理的安防网络摄像机推送到RTMP流媒体服务器方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: typescript中this报错
- 下一篇: java 关键字 assert的学习