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

2021-05-31 15:51:48 浏览数 (1)

推荐一个比较好用的流媒体服务开源代码:

ZLMediaKit: 实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求 https://gitee.com/xiahcu/ZLMediaKit

logo

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qGMRzHOl-1588662590011)(https://travis-ci.org/xiongziliang/ZLMediaKit.svg?branch=master)]

项目特点

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

项目定位

  • 移动嵌入式跨平台流媒体解决方案。
  • 商用级流媒体服务器。
  • 网络编程二次开发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-flv直播。
  • 支持https-flv直播。
  • 支持任意编码格式的rtmp推流,只是除H264/H265 AAC外无法转协议
  • HLS
  • 支持HLS文件生成,自带HTTP文件服务器。
  • 支持播放鉴权,鉴权结果可以缓存为cookie
  • HTTP[S]
  • 服务器支持目录索引生成,文件下载,表单提交请求
  • 客户端提供文件下载器(支持断点续传),接口请求器,文件上传器
  • 完整HTTP API服务器,可以作为web后台开发框架。
  • 支持跨域访问。
  • 支持http客户端、服务器cookie
  • 支持WebSocket服务器和客户端
  • 支持http文件访问鉴权
  • 其他
  • 支持输入YUV PCM自动生成RTSP/RTMP/HLS/MP4.
  • 支持简单的telnet调试。
  • 支持H264的解析,支持B帧的POC计算排序。
  • 支持配置文件热加载
  • 支持流量统计、推流播放鉴权等事件
  • 支持rtsp/rtmp/http虚拟主机
  • 支持flv、mp4文件录制
  • 支持rtps/rtmp协议的mp4点播,支持seek
  • 支持按需拉流,无人观看自动关断拉流
  • 支持先拉流后推流,提高及时推流画面打开率
  • 支持rtsp/rtmp/http-flv/hls播放鉴权(url参数方式)

其他功能细节表

  • 转协议: 功能/编码格式H264H265AACotherRTSP[S] --> RTMP/HTTP[S]-FLV/FLVYNYNRTMP --> RTSP[S]YNYNRTSP[S] --> HLSYYYNRTMP --> HLSYNYNRTSP[S] --> MP4YYYNRTMP --> MP4YNYNMP4 --> RTSP[S]YNYNMP4 --> RTMPYNYN
  • 流生成: 功能/编码格式H264H265AACotherRTSP[S]推流YYYYRTSP拉流代理YYYYRTMP推流YYYYRTMP拉流代理YYYY
  • RTP传输方式: 功能/RTP传输方式tcpudphttpudp_multicastRTSP[S] Play ServerYYYYRTSP[S] Push ServerYYNNRTSP PlayerYYNYRTSP PusherYYNN
  • 支持的服务器类型列表 服务类型Y/NRTSP[S] Play ServerYRTSP[S] Push ServerYRTMPYHTTP[S]/WebSocket[S]Y
  • 支持的客户端类型 客户端类型Y/NRTSP PlayerYRTSP PusherYRTMP PlayerYRTMP PusherYHTTP[S]YWebSocket[S]Y

后续任务

  • 完善支持H265

编译要求

  • 编译器支持C 11,GCC4.8/Clang3.3/VC2015或以上
  • cmake3.2或以上
  • 必须使用git下载完整的代码,不要使用下载zip包的方式下载源码,否则子模块代码默认不下载!你可以像以下这样操作:
代码语言:javascript复制
git clone https://github.com/zlmediakit/ZLMediaKit.git
cd ZLMediaKit
git submodule update --init

编译(Linux)

我的编译环境

Ubuntu16.04 64 bit gcc5.4

cmake 3.5.1

编译

编译(macOS)

我的编译环境

macOS Sierra(10.12.1) xcode8.3.1

Homebrew 1.1.3

cmake 3.8.0

编译

编译(iOS)

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

编译

你也可以生成Xcode工程再编译:

编译(Android)

我的编译环境

macOS Sierra(10.12.1) xcode8.3.1

Homebrew 1.1.3

cmake 3.8.0

android-ndk-r14b

编译

编译(Windows)

  • 我的编译环境
  • windows 10
  • visual studio 2017
  • cmake-gui
  • 编译
代码语言:javascript复制
   1 进入ZLMediaKit目录执行 git submodule update --init 以下载ZLToolKit的代码
   2 使用cmake-gui打开工程并生成vs工程文件.
   3 找到工程文件(ZLMediaKit.sln),双击用vs2017打开.
   4 选择编译Release 版本.
   5 找到目标文件并运行测试用例.

使用方法

作为服务器:

作为播放器:

作为代理服务器:

作为推流客户端器:

QA

  • 怎么测试服务器性能? ZLMediaKit提供了测试性能的示例,代码在tests/test_benchmark.cpp。 这里是测试报告:benchmark.md
  • github下载太慢了,有其他下载方式吗? 你可以在通过开源中国获取最新的代码,地址为: ZLToolKit ZLMediaKit
  • 在windows下编译很多错误? 由于本项目主体代码在macOS/linux下开发,部分源码采用的是无bom头的UTF-8编码;由于windows对于utf-8支持不甚友好,所以如果发现编译错误请先尝试添 加bom头再编译。 也可以通过参考这篇博客解决: vs2015:/utf-8选项解决UTF-8 without BOM 源码中文输出乱码问题

参考案例

  • IOS摄像头实时录制,生成rtsp/rtmp/hls/http-flv
  • IOS rtmp/rtsp播放器,视频推流器
  • 支持linux、windows、mac的rtmp/rtsp播放器 上述工程可能在最新的代码的情况下编译不过,请手动修改

授权协议

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

0 人点赞