本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/73441405

介绍

EasyRTMP是EasyDarwin团队开发的一套夸平台的RTMP直播推送功能组件,内部集成了包括:基本RTMP协议、断线重连、异步推送、环形缓冲区、推送网络拥塞自动丢帧、缓冲区关键帧检索、事件回调(断线、音视频数据回调),支持市面上绝大部分的RTMP流媒体服务器。详见https://github.com/EasyDarwin/EasyRTMP

EasyRTSPClient是一套全平台支持稳定、易用、支持重连的RTSPClient工具。能够拉取RTSP流地址并解析出视频帧和音频帧数据。详见https://github.com/EasyDarwin/EasyRTSPClient

两者都是支持多路同时操作的SDK库,这样就方便了我们基于他们做多路RTSP流同时转成RTMP进行推送。

多路RTSP转RTMP流实现

单路RTSP转RTMP流可直接参考https://github.com/EasyDarwin/EasyRTMP中EasyRTMP_RTSP的Demo。

多路RTSP流转RTMP时,采用Config.ini配置文件,来配置每路输入的RTSP地址,以及目标RTMP地址。

[channel0]
rtsp=rtsp://admin:admin@192.168.66.222/11
rtmp=rtmp://www.easydss.com:10085/live/test1
option=1
[channel1]
rtsp=rtsp://admin:admin@192.168.66.222/22
rtmp=rtmp://www.easydss.com:10085/live/test2

初始化读取Config.ini文件中的配置信息,保存到std::list中,然后为每个channel都起一路EasyRTSPClient来获取RTSP数据。

std::list<_channel_info*>::iterator it;
    for(it = gChannelInfoList.begin(); it != gChannelInfoList.end(); it++)
    {
        _channel_info* pChannel = *it;
        pChannel->fLogHandle = TRACE_OpenLogFile(pChannel->fCfgInfo.channelName);

        TRACE_LOG(pChannel->fLogHandle, "channel[%d] rtsp addr : %s\n", pChannel->fCfgInfo.channelId, pChannel->fCfgInfo.srcRtspAddr);
        TRACE_LOG(pChannel->fLogHandle, "channel[%d] rtmp addr : %s\n", pChannel->fCfgInfo.channelId, pChannel->fCfgInfo.destRtmpAddr);

        EasyRTSP_Init(&(pChannel->fNVSHandle));

        if (NULL == pChannel->fNVSHandle)
        {
            TRACE_LOG(pChannel->fLogHandle, "%s rtsp init error. ret=%d!!!\n", pChannel->fCfgInfo.channelName , iret);
            continue;
        }
        unsigned int mediaType = EASY_SDK_VIDEO_FRAME_FLAG | EASY_SDK_AUDIO_FRAME_FLAG;

        EasyRTSP_SetCallback(pChannel->fNVSHandle, __RTSPSourceCallBack);

        EasyRTSP_OpenStream(pChannel->fNVSHandle, pChannel->fCfgInfo.channelId, pChannel->fCfgInfo.srcRtspAddr, EASY_RTP_OVER_TCP, mediaType, 0, 0, pChannel, 1000, 0, pChannel->fCfgInfo.option, 0);
    }

在每个__RTSPSourceCallBack回调函数中去调用一路EasyRTMP对象,将视频流和音频流封装成RTMP格式并推送到RTMP服务器。详细代码请去GitHub下载https://github.com/jinlong0813/RTMPLive

编译及运行

Windows上使用Visual Studio 2010开发,当然各位可以改成自己的编译环境。

Linux上编译命令如下:

清理: ./Buildit clean
32位编译:./Buildit i386
64位编译:./Buildit x64

运行时将Config.ini文件放至于可执行文件相同路径下,然后直接执行可执行程序,不用带参数。

下载

工具及代码下载:https://github.com/jinlong0813/RTMPLive

获取更多信息

邮件:support@easydarwin.org

WEB:www.EasyDarwin.org

QQ交流群:587254841

Copyright © EasyDarwin.org 2012-2017

EasyRTMP+EasyRTSPClient实现的多路(支持断线重连)RTSP转RTMP直播推流工具的更多相关文章

  1. 支持断线重连、永久watcher、递归操作并且能跨平台(.NET Core)的ZooKeeper异步客户端

    在公司内部的微服务架构中有使用到了"ZooKeeper",虽然官方有提供了.NET的SDK,但易用性非常的差,且搜遍github.nuget,没有发现一个可以跨平台且易用的组件,所 ...

  2. EasyRTMP结合海康HCNetSDK获取海康摄像机H.264实时流并转化成为RTMP直播推流(附源码)

    最近一家深耕于南方电网的科技公司同事找到我们,咨询关于调用海康HCNetSDK取流,并进行互联网转化的方案,经过反复的沟通以及自身在EasyDSS和EasyNVR方面的经验,我们推荐了海康HCNetS ...

  3. SignalR控制台自托管服务端向web客户端指定用户推送数据,客户端断线重连

    一.前言 SignalR是微软推出的开源实时通信框架.其内部使用Web Socket, Server Sent Events 和 Long Polling作为底层传输方式,SignalR会根据客户端和 ...

  4. 海康威视实时预览回调PS流用EasyRTMP向RTMP服务器推流中视频数据处理的代码

    在上一篇方案<EasyRTMP结合海康HCNetSDK获取海康摄像机H.264实时流并转化成为RTMP直播推流(附源码)>我们介绍了将海康安防摄像机进行互联网直播的整体方案流程,其中有一个 ...

  5. 发现电脑上装着liteide,就用golang做一个TCP通讯测试(支持先启动client端和断线重连)

    1.参考https://www.cnblogs.com/yin5th/p/9274495.html server端 main.go package main import ( "fmt&qu ...

  6. 关于socket tcp 断线重连

    这个问题困扰过我几次,都没有来得及研究,今天研究一下. 首先写一个最简易的socket tcp程序,连接成功后再关闭服务器然后再用客户端各种操作看是什么情况 测试表明 (1)客户端已经连接,当服务端关 ...

  7. Netty断线重连

    Netty断线重连 最近使用Netty开发一个中转服务,需要一直保持与Server端的连接,网络中断后需要可以自动重连,查询官网资料,实现方案很简单,核心思想是在channelUnregistered ...

  8. 微信小程序使用原生WebSokcet实现断线重连及数据拼接

    以前做小程序为了应急找了个插件去链接WebSokcet,文章传送门. 回过头在新项目中再次使用时出现了些许问题,不一一赘述.遂决定好好用一下原生的WebSokcet. 一.说明 1.小程序原生的Web ...

  9. C#之Socket断线重连

    一.网上常用方法 1.当Socket.Conneted == false时,调用如下函数进行判断 /// /// 当socket.connected为false时,进一步确定下当前连接状态 /// / ...

随机推荐

  1. Linux系统调用怎么和内核或底层驱动交互的

    学习Linux系统下驱动程序开发已有大半年时间,心中一直有个疑惑:那就是诸如open.write.read等系统调用是怎么和内核或底层驱动建立起联系的呢?今天将自己的一些粗略的理解总结如下.      ...

  2. Java 面试题基础概念收集(高级)

    JVM垃圾回收: GC又分为 minor GC 和 Full GC (也称为 Major GC ).Java 堆内存分为新生代和老年代,新生代中又分为1个 Eden 区域 和两个 Survivor 区 ...

  3. Vue中使用百度地图——设置地图标注

    知识点:创建Map实例,为指定的位置设置标注 参考博客:https://www.cnblogs.com/liuswi/p/3994757.html 1.效果图:初始化地图,设置指定经纬度为地图中心点坐 ...

  4. prometheus statsd 监控

    Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的.随着发展,越来越多公司和组织接受采用Prometheus,社会也十分活跃,他们 ...

  5. 哥德巴赫猜想-nefu2 & 分拆素数和 hdu2098

    哥德巴赫猜想-nefu2 & 分拆素数和 hdu2098 //哥德巴赫猜想 #include <iostream> #include <cmath> #include ...

  6. Object.defineProperties——MEAN开发后台的Model层

    Object.defineProperties是什么?有什么用? 这个问题比较听起来可能比较难以理解,确实我也是在项目中遇到的才会去想.以前看到<高级程序设计>的时候,有这么一种东西,定义 ...

  7. linux一键安装php脚本

    #!/bin/sh echo "----------------------------------start install php --------------------------- ...

  8. Struts2 入门实例

    一.最简登录 Demo:login.jsp——web.xml——struts.xml——LoginAction.java——struts.xml——index.jsp 1.下载 Struts2 框架: ...

  9. angularjs1 自定义图片查看器(可旋转、放大、缩小、拖拽)

    笔记: angularjs1 制作自定义图片查看器(可旋转.放大.缩小.拖拽) 2018-01-12 更新  可以在我的博客  查看我 已经封装好的 纯 js写的图片查看器插件    博客链接 懒得把 ...

  10. 【Python】模块学习之(__call__)实现准确计算函数运行时间

    背景 博主在写自动化的过程中,有遇到有的用例运行缓慢的问题,想起在上一家公司的的“自动化工厂”有一个指标:两小时内运行完所有的用例才算合格.所以想计算每一个用例的运行时间. 思路 因为使用的POM模型 ...