安防网络摄像机推送到RTMP流媒体服务器方案 清疚 2022-05-12 13:58 499阅读 0赞 方案介绍 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 版权声明:本文为博主原创文章,转载请附上博文链接!
还没有评论,来说两句吧...