mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-26 12:37:09 +08:00
Merge branch 'master' of https://github.com/xiongziliang/ZLMediaKit into develop
This commit is contained in:
commit
2df966f52b
54
README.md
54
README.md
@ -1,17 +1,19 @@
|
|||||||
# 一个基于C++11简单易用的轻量级流媒体库
|
# 一个基于C++11的高性能运营级流媒体服务框架
|
||||||
平台|编译状态
|
[![Build Status](https://travis-ci.org/xiongziliang/ZLMediaKit.svg?branch=master)](https://travis-ci.org/xiongziliang/ZLMediaKit)
|
||||||
----|-------
|
|
||||||
Linux | [![Build Status](https://travis-ci.org/xiongziliang/ZLMediaKit.svg?branch=master)](https://travis-ci.org/xiongziliang/ZLMediaKit)
|
|
||||||
macOS | [![Build Status](https://travis-ci.org/xiongziliang/ZLMediaKit_build_for_mac.svg?branch=master)](https://travis-ci.org/xiongziliang/ZLMediaKit_build_for_mac)
|
|
||||||
iOS | [![Build Status](https://travis-ci.org/xiongziliang/ZLMediaKit-build_for_ios.svg?branch=master)](https://travis-ci.org/xiongziliang/ZLMediaKit-build_for_ios)
|
|
||||||
Android | [![Build Status](https://travis-ci.org/xiongziliang/ZLMediaKit_build_for_android.svg?branch=master)](https://travis-ci.org/xiongziliang/ZLMediaKit_build_for_android)
|
|
||||||
Windows | 已经完成移植
|
|
||||||
|
|
||||||
## 项目特点
|
## 项目特点
|
||||||
- 基于C++11开发,避免使用裸指针,代码稳定可靠;同时跨平台移植简单方便,代码清晰简洁。
|
- 基于C++11开发,避免使用裸指针,代码稳定可靠;同时跨平台移植简单方便,代码清晰简洁。
|
||||||
- 打包多种流媒体协议(RTSP/RTMP/HLS),支持协议间的互相转换,提供一站式的服务。
|
- 打包多种流媒体协议(RTSP/RTMP/HLS),支持协议间的互相转换,提供一站式的服务。
|
||||||
- 使用epoll+线程池+异步网络IO模式开发,并发性能优越。
|
- 使用epoll+线程池+异步网络IO模式开发,并发性能优越。
|
||||||
- 只实现主流的的H264+AAC流媒体方案,代码精简,脉络清晰,适合学习。
|
- 只实现主流的的H264+AAC流媒体方案,代码精简,脉络清晰,适合学习。
|
||||||
|
- 代码经过大量的稳定性、性能测试,可满足商用服务器项目。
|
||||||
|
- 支持linux、macos、ios、android、windows平台
|
||||||
|
|
||||||
|
## 项目定位
|
||||||
|
- 移动嵌入式跨平台流媒体解决方案。
|
||||||
|
- 商用级流媒体服务器。
|
||||||
|
- 网络编程二次开发SDK。
|
||||||
|
|
||||||
|
|
||||||
## 功能清单
|
## 功能清单
|
||||||
- RTSP
|
- RTSP
|
||||||
@ -44,6 +46,9 @@ Windows | 已经完成移植
|
|||||||
- 支持配置文件热加载
|
- 支持配置文件热加载
|
||||||
- 支持流量统计、推流播放鉴权等事件
|
- 支持流量统计、推流播放鉴权等事件
|
||||||
- 支持rtsp/rtmp/http虚拟主机
|
- 支持rtsp/rtmp/http虚拟主机
|
||||||
|
- 支持flv、mp4文件录制
|
||||||
|
- 支持rtps/rtmp点播,支持seek
|
||||||
|
|
||||||
|
|
||||||
## 后续任务
|
## 后续任务
|
||||||
- 添加rtsp推流功能
|
- 添加rtsp推流功能
|
||||||
@ -202,17 +207,9 @@ Windows | 已经完成移植
|
|||||||
## QA
|
## QA
|
||||||
- 怎么测试服务器性能?
|
- 怎么测试服务器性能?
|
||||||
|
|
||||||
ZLMediaKit提供了测试性能的示例,代码在tests/test_benchmark.cpp。由于ZLToolKit默认关闭了tcp客户端多线程的支持,如果需要提高测试并发量,需要在编译ZLToolKit时启用ENABLE_ASNC_TCP_CLIENT宏,具体操作如下:
|
ZLMediaKit提供了测试性能的示例,代码在tests/test_benchmark.cpp。
|
||||||
```
|
|
||||||
#编译ZLToolKit
|
这里是测试报告:[benchmark.md](https://github.com/xiongziliang/ZLMediaKit/blob/master/benchmark.md)
|
||||||
cd ZLToolKit
|
|
||||||
mkdir -p build
|
|
||||||
cd build
|
|
||||||
cmake .. -DENABLE_ASNC_TCP_CLIENT
|
|
||||||
make -j4
|
|
||||||
sudo make install
|
|
||||||
```
|
|
||||||
这里是测试报告:[benchmark.md](https://github.com/xiongziliang/ZLMediaKit/blob/master/benchmark.md)
|
|
||||||
|
|
||||||
- github下载太慢了,有其他下载方式吗?
|
- github下载太慢了,有其他下载方式吗?
|
||||||
|
|
||||||
@ -227,8 +224,23 @@ Windows | 已经完成移植
|
|||||||
- [IOS rtmp/rtsp播放器,视频推流器](https://gitee.com/xiahcu/IOSPlayer)
|
- [IOS rtmp/rtsp播放器,视频推流器](https://gitee.com/xiahcu/IOSPlayer)
|
||||||
- [支持linux、windows、mac的rtmp/rtsp播放器](https://github.com/xiongziliang/ZLMediaPlayer)
|
- [支持linux、windows、mac的rtmp/rtsp播放器](https://github.com/xiongziliang/ZLMediaPlayer)
|
||||||
|
|
||||||
|
上述工程可能在最新的代码的情况下编译不过,请手动修改
|
||||||
|
|
||||||
|
|
||||||
|
## 授权协议
|
||||||
|
|
||||||
|
本项目使用宽松的MIT协议,在保留版权信息的情况下可以自由应用于各自商用、非商业的项目。
|
||||||
|
|
||||||
## 联系方式
|
## 联系方式
|
||||||
- 邮箱:<771730766@qq.com>
|
- 邮箱:<771730766@qq.com>
|
||||||
- QQ群:542509000
|
- QQ群:542509000
|
||||||
|
|
||||||
|
## 捐赠
|
||||||
|
如果本项目能切实帮助您减少重复开发的工作量,您可以在自愿的基础上支持下作者,谢谢!
|
||||||
|
|
||||||
|
[支付宝](https://raw.githubusercontent.com/xiongziliang/other/master/IMG_3919.JPG)
|
||||||
|
|
||||||
|
[微信](https://raw.githubusercontent.com/xiongziliang/other/master/IMG_3920.JPG)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -83,12 +83,12 @@ extern const char kBroadcastHttpRequest[];
|
|||||||
|
|
||||||
//该流是否需要认证?是的话调用invoker并传入realm,否则传入空的realm.如果该事件不监听则不认证
|
//该流是否需要认证?是的话调用invoker并传入realm,否则传入空的realm.如果该事件不监听则不认证
|
||||||
extern const char kBroadcastOnGetRtspRealm[];
|
extern const char kBroadcastOnGetRtspRealm[];
|
||||||
#define BroadcastOnGetRtspRealmArgs const string &app,const string &stream,const RtspSession::onGetRealm &invoker,TcpSession &sender
|
#define BroadcastOnGetRtspRealmArgs const MediaInfo &args,const RtspSession::onGetRealm &invoker,TcpSession &sender
|
||||||
|
|
||||||
//请求认证用户密码事件,user_name为用户名,must_no_encrypt如果为true,则必须提供明文密码(因为此时是base64认证方式),否则会导致认证失败
|
//请求认证用户密码事件,user_name为用户名,must_no_encrypt如果为true,则必须提供明文密码(因为此时是base64认证方式),否则会导致认证失败
|
||||||
//获取到密码后请调用invoker并输入对应类型的密码和密码类型,invoker执行时会匹配密码
|
//获取到密码后请调用invoker并输入对应类型的密码和密码类型,invoker执行时会匹配密码
|
||||||
extern const char kBroadcastOnRtspAuth[];
|
extern const char kBroadcastOnRtspAuth[];
|
||||||
#define BroadcastOnRtspAuthArgs const string &user_name,const bool &must_no_encrypt,const RtspSession::onAuth &invoker,TcpSession &sender
|
#define BroadcastOnRtspAuthArgs const MediaInfo &args,const string &user_name,const bool &must_no_encrypt,const RtspSession::onAuth &invoker,TcpSession &sender
|
||||||
|
|
||||||
//鉴权结果回调对象
|
//鉴权结果回调对象
|
||||||
//如果errMessage为空则代表鉴权成功
|
//如果errMessage为空则代表鉴权成功
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/*
|
/*
|
||||||
* MIT License
|
* MIT License
|
||||||
*
|
*
|
||||||
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
|
* Copyright (c) 2016 xiongziliang <771730766@qq.com>
|
||||||
@ -240,8 +240,7 @@ bool RtspSession::handleReq_Describe() {
|
|||||||
|
|
||||||
//广播是否需要认证事件
|
//广播是否需要认证事件
|
||||||
if(!NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastOnGetRtspRealm,
|
if(!NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastOnGetRtspRealm,
|
||||||
m_mediaInfo.m_app,
|
m_mediaInfo,
|
||||||
m_mediaInfo.m_streamid,
|
|
||||||
invoker,
|
invoker,
|
||||||
*this)){
|
*this)){
|
||||||
//无人监听此事件,说明无需认证
|
//无人监听此事件,说明无需认证
|
||||||
@ -352,7 +351,7 @@ void RtspSession::onAuthBasic(const weak_ptr<RtspSession> &weakSelf,const string
|
|||||||
}
|
}
|
||||||
|
|
||||||
//此时必须提供明文密码
|
//此时必须提供明文密码
|
||||||
if(!NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastOnRtspAuth,user, true,invoker,*strongSelf)){
|
if(!NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastOnRtspAuth,strongSelf->m_mediaInfo,user, true,invoker,*strongSelf)){
|
||||||
//表明该流需要认证却没监听请求密码事件,这一般是大意的程序所为,警告之
|
//表明该流需要认证却没监听请求密码事件,这一般是大意的程序所为,警告之
|
||||||
WarnL << "请监听kBroadcastOnRtspAuth事件!";
|
WarnL << "请监听kBroadcastOnRtspAuth事件!";
|
||||||
//但是我们还是忽略认证以便完成播放
|
//但是我们还是忽略认证以便完成播放
|
||||||
@ -433,7 +432,7 @@ void RtspSession::onAuthDigest(const weak_ptr<RtspSession> &weakSelf,const strin
|
|||||||
};
|
};
|
||||||
|
|
||||||
//此时可以提供明文或md5加密的密码
|
//此时可以提供明文或md5加密的密码
|
||||||
if(!NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastOnRtspAuth,username, false,invoker,*strongSelf)){
|
if(!NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastOnRtspAuth,strongSelf->m_mediaInfo,username, false,invoker,*strongSelf)){
|
||||||
//表明该流需要认证却没监听请求密码事件,这一般是大意的程序所为,警告之
|
//表明该流需要认证却没监听请求密码事件,这一般是大意的程序所为,警告之
|
||||||
WarnL << "请监听kBroadcastOnRtspAuth事件!";
|
WarnL << "请监听kBroadcastOnRtspAuth事件!";
|
||||||
//但是我们还是忽略认证以便完成播放
|
//但是我们还是忽略认证以便完成播放
|
||||||
|
@ -64,7 +64,7 @@ using namespace ZL::Network;
|
|||||||
|
|
||||||
static onceToken s_token([](){
|
static onceToken s_token([](){
|
||||||
NoticeCenter::Instance().addListener(nullptr,Config::Broadcast::kBroadcastOnGetRtspRealm,[](BroadcastOnGetRtspRealmArgs){
|
NoticeCenter::Instance().addListener(nullptr,Config::Broadcast::kBroadcastOnGetRtspRealm,[](BroadcastOnGetRtspRealmArgs){
|
||||||
if(string("1") == stream ){
|
if(string("1") == args.m_streamid ){
|
||||||
// live/1需要认证
|
// live/1需要认证
|
||||||
EventPoller::Instance().async([invoker](){
|
EventPoller::Instance().async([invoker](){
|
||||||
//该流需要认证,并且设置realm
|
//该流需要认证,并且设置realm
|
||||||
|
Loading…
Reference in New Issue
Block a user