zoukankan      html  css  js  c++  java
  • EasyRTMP+EasyRTSPClient实现的多路(支持断线重连)RTSP转RTMP直播推流工具

    本文转自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
    ", pChannel->fCfgInfo.channelId, pChannel->fCfgInfo.srcRtspAddr);
            TRACE_LOG(pChannel->fLogHandle, "channel[%d] rtmp addr : %s
    ", pChannel->fCfgInfo.channelId, pChannel->fCfgInfo.destRtmpAddr);
    
            EasyRTSP_Init(&(pChannel->fNVSHandle));
    
            if (NULL == pChannel->fNVSHandle)
            {
                TRACE_LOG(pChannel->fLogHandle, "%s rtsp init error. ret=%d!!!
    ", 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

    EasyDarwin

  • 相关阅读:
    几种常见sqlalchemy查询:
    Python error: Unable to find vcvarsall.bat
    ES5中的数组方法
    JQuery的API
    异步加载中按需加载的代码
    js和jQuery中ajax的重要步骤
    编写一个JavaScript函数,把URL参数解析为一个对象
    弹性盒子的用法
    js实现飞机大战小游戏
    H5中的canvas完成动态时钟
  • 原文地址:https://www.cnblogs.com/babosa/p/7348761.html
Copyright © 2011-2022 走看看