ZLMediaKit/README.md
2020-04-09 22:19:47 +08:00

12 KiB
Raw Blame History

logo

english readme

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

Build Status

项目特点

  • 基于C++11开发避免使用裸指针代码稳定可靠同时跨平台移植简单方便代码清晰简洁。
  • 打包多种流媒体协议(RTSP/RTMP/HLS/HTTP-FLV/Websocket-FLV支持协议间的互相转换提供一站式的服务。
  • 使用epoll+线程池+异步网络IO模式开发并发性能优越。
  • 已实现主流的的H264/H265+AAC流媒体方案代码精简,脉络清晰,适合学习。
  • 编码格式与框架代码解耦,方便自由简洁的添加支持其他编码格式。
  • 代码经过大量的稳定性、性能测试,可满足商用服务器项目。
  • 支持linux、macos、ios、android、windows平台。
  • 支持画面秒开(GOP缓存)、极低延时(500毫秒内最低可达100毫秒)。
  • ZLMediaKit高并发实现原理
  • 提供完善的标准C API,可以作SDK用或供其他语言调用。
  • 提供完整的MediaServer服务器,可以免开发直接部署为商用服务器。

项目定位

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

功能清单

  • RTSP

    • RTSP 服务器支持RTMP/MP4转RTSP
    • RTSPS 服务器支持亚马逊echo show这样的设备
    • RTSP 播放器支持RTSP代理支持生成静音音频
    • RTSP 推流客户端与服务器
    • 支持 rtp over udp rtp over tcp rtp over http rtp组播 四种RTP传输方式
    • 服务器/客户端完整支持Basic/Digest方式的登录鉴权全异步可配置化的鉴权接口
    • 支持H265编码
    • 服务器支持RTSP推流(包括rtp over udp rtp over tcp方式)
    • 支持任意编码格式的rtsp推流只是除H264/H265+AAC外无法转协议
  • RTMP

    • RTMP 播放服务器支持RTSP/MP4转RTMP
    • RTMP 发布服务器,支持录制发布流
    • RTMP 播放器支持RTMP代理支持生成静音音频
    • RTMP 推流客户端
    • 支持http[s]-flv直播
    • 支持websocket-flv直播
    • 支持任意编码格式的rtmp推流只是除H264/H265+AAC外无法转协议
    • 支持RTMP-H265
  • HLS

    • 支持HLS文件生成自带HTTP文件服务器
    • 通过cookie追踪技术可以模拟HLS播放为长连接实现丰富的业务逻辑
    • 支持完备的HLS用户追踪、播放统计等业务功能可以实现HLS按需拉流等业务
  • HTTP[S]

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

    • 支持UDP/TCP国标RTP(PS或TS)推流可以转换成RTSP/RTMP/HLS等协议
  • 点播

    • 支持录制为FLV/HLS/MP4
    • RTSP/RTMP/HTTP-FLV/WS-FLV支持MP4文件点播支持seek
  • 其他

    • 支持丰富的restful api以及web hook事件
    • 支持简单的telnet调试
    • 支持配置文件热加载
    • 支持流量统计、推拉流鉴权等事件
    • 支持虚拟主机,可以隔离不同域名
    • 支持按需拉流,无人观看自动关断拉流
    • 支持先拉流后推流,提高及时推流画面打开率
    • 提供c api sdk

细节列表

  • 转协议:

    功能/编码格式 H264 H265 AAC other
    RTSP[S] --> RTMP/HTTP[S]-FLV/FLV Y Y Y N
    RTMP --> RTSP[S] Y Y Y N
    RTSP[S] --> HLS Y Y Y N
    RTMP --> HLS Y Y Y N
    RTSP[S] --> MP4 Y Y Y N
    RTMP --> MP4 Y Y Y N
    MP4 --> RTSP[S] Y Y Y N
    MP4 --> RTMP Y Y Y N
  • 流生成:

    功能/编码格式 H264 H265 AAC other
    RTSP[S]推流 Y Y Y Y
    RTSP拉流代理 Y Y Y Y
    RTMP推流 Y Y Y Y
    RTMP拉流代理 Y Y Y Y
  • RTP传输方式:

    功能/RTP传输方式 tcp udp http udp_multicast
    RTSP[S] Play Server Y Y Y Y
    RTSP[S] Push Server Y Y N N
    RTSP Player Y Y N Y
    RTSP Pusher Y Y N N
  • 支持的服务器类型列表

    服务类型 Y/N
    RTSP[S] Play Server Y
    RTSP[S] Push Server Y
    RTMP Y
    HTTP[S]/WebSocket[S] Y
  • 支持的客户端类型

    客户端类型 Y/N
    RTSP Player Y
    RTSP Pusher Y
    RTMP Player Y
    RTMP Pusher Y
    HTTP[S] Y
    WebSocket[S] Y

编译以及测试

请参考wiki:快速开始

Docker 镜像

你可以从Docker Hub下载已经编译好的镜像并启动它

docker run -id -p 1935:1935 -p 8080:80 gemfield/zlmediakit:20.04-runtime-ubuntu18.04

你也可以根据Dockerfile编译镜像

bash build_docker_images.sh

使用方法

  • 作为服务器:

    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]);
    
  • 作为播放器:

    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)[Client::kRtpType] = Rtsp::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");
    });
    
    

参考案例

授权协议

本项目自有代码使用宽松的MIT协议在保留版权信息的情况下可以自由应用于各自商用、非商业的项目。 但是本项目也零碎的使用了一些其他的开源代码,在商用的情况下请自行替代或剔除; 由于使用本项目而产生的商业纠纷或侵权行为一概与本项项目及开发者无关,请自行承担法律风险。

联系方式

  • 邮箱:771730766@qq.com(本项目相关或流媒体相关问题请走issue流程否则恕不邮件答复)
  • QQ群542509000

怎么提问?

如果要对项目有相关疑问,建议您这么做:

  • 1、仔细看下readme、wiki如果有必要可以查看下issue.
  • 2、如果您的问题还没解决可以提issue.
  • 3、有些问题如果不具备参考性的无需在issue提的可以在qq群提.
  • 4、QQ私聊一般不接受无偿技术咨询和支持(为什么不提倡QQ私聊).

致谢

感谢以下各位对本项目包括但不限于代码贡献、问题反馈、资金捐赠等各种方式的支持!以下排名不分先后:

老陈 Gemfield 南冠彤 凹凸慢 chenxiaolei 史前小虫 清涩绿茶 3503207480 DroidChow 阿塞 火宣 γ瑞γミ linkingvision 茄子 好心情 浮沉

捐赠

欢迎捐赠以便更好的推动项目的发展,谢谢您的支持!

支付宝

微信