Go to file
xiongziliang daf87dea93 修复bug
2018-10-31 11:04:01 +08:00
bin_lib del log 2018-03-26 14:18:00 +08:00
c_wrapper 简化命名空间 2018-10-24 17:17:55 +08:00
cmake 替换成sdl2 2018-04-17 21:38:13 +08:00
src 修复bug 2018-10-31 11:04:01 +08:00
tests 修复录制点播的bug 2018-10-29 17:25:45 +08:00
ZLToolKit@109c994dc8 解决gcc4.8编译失败的问题 2018-10-29 17:19:14 +08:00
.gitignore 添加win测试程序 2017-12-13 14:21:40 +08:00
.gitmodules add zltoolkit 2017-09-27 17:09:42 +08:00
.travis.yml 编译器缓存clang 2018-10-29 14:00:15 +08:00
benchmark.md Update benchmark.md 2017-12-05 10:15:10 +08:00
build_for_android.sh 更新编译脚本 2018-03-21 15:50:07 +08:00
build_for_ios.sh 更新编译脚本 2018-03-21 15:50:07 +08:00
build_for_linux.sh 更新编译脚本 2018-03-21 15:50:07 +08:00
build_for_mac.sh 更新编译脚本 2018-03-21 15:50:07 +08:00
CMakeLists.txt mp4v2支持win32 2018-05-22 11:41:20 +08:00
LICENSE Update LICENSE 2017-09-27 16:26:24 +08:00
README.md 更新README 2018-10-29 14:09:29 +08:00

一个基于C++11的高性能运营级流媒体服务框架

Build Status

项目特点

  • 基于C++11开发避免使用裸指针代码稳定可靠同时跨平台移植简单方便代码清晰简洁。
  • 打包多种流媒体协议(RTSP/RTMP/HLS支持协议间的互相转换提供一站式的服务。
  • 使用epoll+线程池+异步网络IO模式开发并发性能优越。
  • 已实现主流的的H264+AAC流媒体方案代码精简,脉络清晰,适合学习。
  • 编码格式与框架代码解耦,方便自由简洁的添加支持其他编码格式
  • 代码经过大量的稳定性、性能测试,可满足商用服务器项目。
  • 支持linux、macos、ios、android、windows平台

项目定位

  • 移动嵌入式跨平台流媒体解决方案。
  • 商用级流媒体服务器。
  • 网络编程二次开发SDK。

功能清单

  • RTSP

    • RTSP 服务器支持RTMP/MP4转RTSP。
    • RTSP 播放器支持RTSP代理支持生成静音音频
    • 支持 rtp over udp rtp over tcp rtp over http rtp组播 四种RTP传输方式 。
    • 服务器/客户端完整支持Basic/Digest方式的登录鉴权全异步可配置化的鉴权接口。
  • RTMP

    • RTMP 播放服务器支持RTSP/MP4转RTMP。
    • RTMP 发布服务器,支持录制发布流。
    • RTMP 播放器支持RTMP代理支持生成静音音频
    • RTMP 推流客户端。
    • 支持http-flv直播。
    • 支持https-flv直播。
  • HLS

    • 支持HLS文件生成自带HTTP文件服务器。
  • HTTP[S]

    • 服务器支持目录索引生成,文件下载,表单提交请求
    • 客户端提供文件下载器(支持断点续传),接口请求器,文件上传器
    • 完整HTTP API服务器可以作为web后台开发框架。
    • 支持跨域访问。
    • 客户端支持cookie
    • 支持WebSocket服务器
  • 其他

    • 支持输入YUV+PCM自动生成RTSP/RTMP/HLS/MP4.
    • 支持简单的telnet调试。
    • 支持H264的解析支持B帧的POC计算排序。
    • 支持配置文件热加载
    • 支持流量统计、推流播放鉴权等事件
    • 支持rtsp/rtmp/http虚拟主机
    • 支持flv、mp4文件录制
    • 支持rtps/rtmp点播支持seek

后续任务

  • 添加支持H265
  • 添加rtsp推流功能

编译要求

  • 编译器支持C++11GCC4.8/Clang3.3/VC2015或以上
  • cmake3.2或以上

编译(Linux)

  • 我的编译环境

    • Ubuntu16.04 64 bit + gcc5.4
    • cmake 3.5.1
  • 编译

    cd ZLMediaKit
    ./build_for_linux.sh
    

编译(macOS)

  • 我的编译环境

    • macOS Sierra(10.12.1) + xcode8.3.1
    • Homebrew 1.1.3
    • cmake 3.8.0
  • 编译

    cd ZLMediaKit
    ./build_for_mac.sh
    

编译(iOS)

  • 编译环境:请参考macOS的编译指导。

  • 编译

    cd ZLMediaKit
    ./build_for_ios.sh
    
  • 你也可以生成Xcode工程再编译

    cd ZLMediaKit
    mkdir -p build
    cd build
    # 生成Xcode工程工程文件在build目录下
    cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/iOS.cmake -DIOS_PLATFORM=SIMULATOR64 -G "Xcode"
    

编译(Android)

  • 我的编译环境

    • macOS Sierra(10.12.1) + xcode8.3.1
    • Homebrew 1.1.3
    • cmake 3.8.0
    • android-ndk-r14b
  • 编译

    cd ZLMediaKit
    export ANDROID_NDK_ROOT=/path/to/ndk
    ./build_for_android.sh
    

编译(Windows)

  • 我的编译环境

  • 编译

   1 使用cmake-gui打开工程并生成vs工程文件.
   2 找到工程文件(ZLMediaKit.sln),双击用vs2017打开.
   3 选择编译Release 版本.
   4 找到目标文件并运行测试用例.

使用方法

  • 作为服务器:

    TcpServer::Ptr rtspSrv(new TcpServer());
    TcpServer::Ptr rtmpSrv(new TcpServer());
    TcpServer::Ptr httpSrv(new TcpServer());
    TcpServer::Ptr httpsSrv(new TcpServer());
    
    rtspSrv->start<RtspSession>(mINI::Instance()[Config::Rtsp::kPort]);
    rtmpSrv->start<RtmpSession>(mINI::Instance()[Config::Rtmp::kPort]);
    httpSrv->start<HttpSession>(mINI::Instance()[Config::Http::kPort]);
    httpsSrv->start<HttpsSession>(mINI::Instance()[Config::Http::kSSLPort]);
    EventPoller::Instance().runLoop();
    
  • 作为播放器:

    MediaPlayer::Ptr player(new MediaPlayer());
    weak_ptr<MediaPlayer> weakPlayer = player;
    player->setOnPlayResult([weakPlayer](const SockException &ex) {
        InfoL << "OnPlayResult:" << ex.what();
        auto strongPlayer = weakPlayer.lock();
        if (ex || !strongPlayer) {
            return;
        }
    
        auto viedoTrack = strongPlayer->getTrack(TrackVideo);
        if (!viedoTrack) {
            WarnL << "没有视频Track!";
            return;
        }
        viedoTrack->addDelegate(std::make_shared<FrameWriterInterfaceHelper>([](const Frame::Ptr &frame) {
            //此处解码并播放
        }));
    });
    
    player->setOnShutdown([](const SockException &ex) {
        ErrorL << "OnShutdown:" << ex.what();
    });
    
    //支持rtmp、rtsp
    (*player)[RtspPlayer::kRtpType] = PlayerBase::RTP_TCP;
    player->play("rtsp://admin:jzan123456@192.168.0.122/");
    
  • 作为代理服务器:

    //support rtmp and rtsp url
    //just support H264+AAC
    auto urlList = {"rtmp://live.hkstv.hk.lxdns.com/live/hks",
    		"rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov"};
    map<string , PlayerProxy::Ptr> proxyMap;
    int i=0;
    for(auto url : urlList){
    	//PlayerProxy构造函数前两个参数分别为应用名app,流idstreamId
    	//比如说应用为live流id为0那么直播地址为
    	//http://127.0.0.1/live/0/hls.m3u8
    	//rtsp://127.0.0.1/live/0
    	//rtmp://127.0.0.1/live/0
    	//录像地址为:
    	//http://127.0.0.1/record/live/0/2017-04-11/11-09-38.mp4
    	//rtsp://127.0.0.1/record/live/0/2017-04-11/11-09-38.mp4
    	//rtmp://127.0.0.1/record/live/0/2017-04-11/11-09-38.mp4
    	PlayerProxy::Ptr player(new PlayerProxy("live",to_string(i++).data()));
    	player->play(url);
    	proxyMap.emplace(string(url),player);
    }
    
  • 作为推流客户端器:

    PlayerProxy::Ptr player(new PlayerProxy("app","stream"));
    //拉一个流生成一个RtmpMediaSource源的名称是"app/stream"
    //你也可以以其他方式生成RtmpMediaSource比如说MP4文件请研读MediaReader代码
    player->play("rtmp://live.hkstv.hk.lxdns.com/live/hks");
    
    RtmpPusher::Ptr pusher;
    //监听RtmpMediaSource注册事件,在PlayerProxy播放成功后触发。
    NoticeCenter::Instance().addListener(nullptr,Config::Broadcast::kBroadcastRtmpSrcRegisted,
    		[&pusher](BroadcastRtmpSrcRegistedArgs){
    	//媒体源"app/stream"已经注册这时方可新建一个RtmpPusher对象并绑定该媒体源
    	const_cast<RtmpPusher::Ptr &>(pusher).reset(new RtmpPusher(app,stream));
    
    	//推流地址,请改成你自己的服务器。
    	//这个范例地址也是基于mediakit是可用的但是带宽只有1mb访问可能很卡顿。
    	pusher->publish("rtmp://jizan.iok.la/live/test");
    });
    
    EventPoller::Instance().runLoop();
    

QA

  • 怎么测试服务器性能?

    ZLMediaKit提供了测试性能的示例代码在tests/test_benchmark.cpp。

    这里是测试报告:benchmark.md

  • github下载太慢了有其他下载方式吗

    你可以在通过开源中国获取最新的代码,地址为:

    ZLToolKit

    ZLMediaKit

参考案例

授权协议

本项目使用宽松的MIT协议在保留版权信息的情况下可以自由应用于各自商用、非商业的项目。

联系方式

捐赠

如果本项目能切实帮助您减少重复开发的工作量,您可以在自愿的基础上支持下作者,谢谢!

支付宝

微信