zoukankan      html  css  js  c++  java
  • RTSP安防摄像机(海康大华宇视等)如何推送到RTMP流媒体服务器进行直播

    方案介绍

    目前互联网直播的CDN和标准RTMP流媒体服务器通常只能接收RTMP格式的音视频推流。目前市场上有一些自带RTMP推流的摄像机和编码器,可以直接在其rtmp推流配置里面配置推送到RTMP流媒体服务器上。但是大部分的安防网络摄像机还是不带推流功能,尤其是海康、大华、宇视等通用性价比高的摄像机,是不支持的,所以,对于这种摄像机只能通过二次开发的方式,先获取摄像机实时视频流并封装成RTMP/FLV格式进行推送,再由RTMP流媒体服务器进行转发/分发。

    获取摄像机实时视频流的方式可以调用摄像机厂家的SDK,也可以通过拉取摄像机的RTSP实时流来获取。对于调用SDK获取视频流的方式因为不同厂家、不同型号的设备SDK都有所不同,所以这种方式获取流不够通用,定制性、稳定性都不可控,这样就建议使用拉取摄像机RTSP流,然后转成RTMP推送给RTMP流媒体服务器,可以适应几乎所有的网络摄像机。

    第一步:拉取摄像机RTSP流

    这里使用EasyRTSPClient(https://github.com/EasyDSS/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(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。

    总结

    EasyRTSPClient与EasyRTMP 都是支持Windows、Linux、Android、iOS多个平台的,可以实现在各个平台上推送RTMP给流媒体服务器。两者功能都避开了RTSP及RTMP等格式的繁琐流程,直接简单调用接口就可以轻松实现流媒体直播推送。

    目前基于EasyRTSPClient拉流和EasyRTMP推流的拉转推方案主要有两款:

    • RTMPLive(https://github.com/EasyDSS/RTMPLive):支持多路拉转推;

    • 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

  • 相关阅读:
    [Bootstrap]全局样式(四)
    [Bootstrap]全局样式(三)
    [Bootstrap]全局样式(二)
    [Bootstrap]全局样式(一)
    [Bootstrap]概述
    原生JS-----一个剪刀石头布游戏
    聊聊 ES6 中的箭头函数
    jQuery中的 AJAX
    AJAX封装
    AJAX 初识
  • 原文地址:https://www.cnblogs.com/babosa/p/10459831.html
Copyright © 2011-2022 走看看