方案介绍

目前互联网直播的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集中管理;

获取更多信息

邮件:support@easydarwin.org

EasyDarwin开源流媒体服务器:www.easydarwin.org

EasyDSS商用流媒体解决方案:www.easydss.com

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

QQ群:587254841

Copyright © EasyDarwin.org 2012-2019

RTSP安防摄像机(海康大华宇视等)如何推送到RTMP流媒体服务器进行直播的更多相关文章

  1. 海康&大华&DSS视频拉流-RTSP转RTMP多媒体播放技术

    海康&大华&DSS获取RTSP 实时流 海康:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/ ...

  2. 浏览器低延时播放监控摄像头RTSP海康大华硬盘录像机NVR视频(EasyNVR播放FLV视频流)

    背景描述 EasyNVR的使用者应该都是清楚的知道,EasyNVR一个强大的功能就是可以进行全平台的无插件直播.主要原因在于rtsp协议的视频流(默认是需要插件才可以播放的)经由EasyNVR处理后可 ...

  3. 将海康大华等网络摄像机RTSP流进行网页Flash rtmp和H5 hls直播的技术方案

    前言 再小的技术点也会有他的市场! 一直以来,都有一些不被看好,认为是成本太高,无法大规模展开的软件和产品形态,就好比每一座城市都会有他的著名小吃一样,即使是慕名而来的人源源不断,受众群体也总是有限, ...

  4. 海康/大华 IpCamera RTSP地址和格式

    海康:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream说明:username: 用户名.例如 ...

  5. EasyPlayer播放海康大华RTSP流时RTSPClient客户端连接兼容问题的解决

    在之前的博客<EasyPlayer RTSP播放器对RTSP播放地址url的通用兼容修改意见>中,我描述了遇到的一个客户在播放大华某款摄像机时地址不兼容的问题,这不,团队刚刚参考我的这个意 ...

  6. 海康大华RTSP格式

    海康实时流:rtsp://admin:12345@192.2.82.50:554/h264/ch4/main/av_stream海康回放流(模拟通道):rtsp://admin:12345@192.2 ...

  7. javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  8. 通用安防摄像机通过RTSP转RTMP推流进行H5(RTMP/HLS)直播的方案

    EasyNVR摄像机无插件直播方案 随着互联网的发展,尤其是移动互联网的普及,基于H5.微信的应用越来越多,企业也更多地想基于H5.微信公众号来快速开发和运营自己的视频及视频相关性产品,那么传统的安防 ...

  9. 使用ffmpeg -re循环推流(循环读取视频文件)推送EasyDSS RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器的方法

    需求分析 众所周知,EasyDSS与EasyNVR最大的区别是,EasyDSS被动接受前端设备的推流,将推送过来的直播流进行直播转码.智能处理.视频分发,在通过CDN分发节点分发到终端播放SDK.而E ...

随机推荐

  1. [转]SQL Server 性能调优(io)

      目录 诊断磁盘io问题 常见的磁盘问题 容量替代了性能 负载隔离配置有问题 分区对齐配置有问题 总结 关于io这一块,前面的东西如磁盘大小,磁盘带宽,随机读取写入,顺序读取写入,raid选择,DA ...

  2. Tomcat 服务器只能存有一个正在运行的项目

    即使新建了一个new project (在同一个工作空间),启动Tomcat 还是会出现先前(工程名)一样的问题/异常. [原因]: 在底下Server 那里——Tomcat 7.X 底下会有很多工程 ...

  3. Spring 注解Autowired自动注入bean异常解决

      错误: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'xx' is defined ...

  4. C# DateTime的11种构造函数

    别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Globalization; using Syste ...

  5. C语言学习笔记(五) 数组

    数组 数组的出现就是为了解决大量同类型数据的存储和使用的问题: 数组的分类:一维数组.二维数组. 一维数组:为多个变量连续分配存储控件:所有的变量的数据类型必须相同:所有变量所占的字节大小必须相等: ...

  6. Bootstrap组件之导航

    .nav--指定列表元素为导航组件. .nav-tabs--指定导航组件的样式为标签页: .nav-pills--指定导航组件的样式为胶囊式标签页: .nav-stacked--指定标签页的样式为垂直 ...

  7. HTML学习笔记(四)

    1.       css行内样式要注意的问题: a)     stylekeyword要作为标签的一个属性写在标签内: b)     等号后面是一对双引號包括的内容. c)      Style属性和 ...

  8. ORCAD应用小技巧

    1.位号复制 递增和不变 2.netlist log信息 3.off page页码对其 4.批量修改off page符号命名的方法 5.批量修改电源符号 6.capture中instance和Occu ...

  9. 今日头条&58转转笔试

    昨天参加今日头条和58转转的笔试,因为时间上有冲突,所以主要选择参加头条的笔试. 先说头条: 头条的题型: 一道改错题 三道编程题 一道设计题 感受: 做题目的的时候还是有点紧张的,因为突然遇到题目需 ...

  10. docker run

    1.登录Docker Hub 账户 2.输入命令:构建一个web应用. docker run -d -P training/webapp python app.py 参数说明: -d:让容器在后台运行 ...