同步操作将从 夏楚/ZLMediaKit 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
git clone --depth 1 https://gitee.com/xiahcu/ZLMediaKit
cd ZLMediaKit
git submodule update --init
RTSP
rtp over udp
rtp over tcp
rtp over http
rtp组播
四种RTP传输方式 。rtp over udp
rtp over tcp
方式)RTMP
HLS
HTTP[S]
目录索引生成
,文件下载
,表单提交请求
。文件下载器(支持断点续传)
,接口请求器
,文件上传器
。其他
转协议:
功能/编码格式 | H264 | H265 | AAC | other |
---|---|---|---|---|
RTSP[S] --> RTMP/HTTP[S]-FLV/FLV | Y | N | Y | N |
RTMP --> RTSP[S] | Y | N | Y | N |
RTSP[S] --> HLS | Y | Y | Y | N |
RTMP --> HLS | Y | N | Y | N |
RTSP[S] --> MP4 | Y | Y | Y | N |
RTMP --> MP4 | Y | N | Y | N |
MP4 --> RTSP[S] | Y | N | Y | N |
MP4 --> RTMP | Y | N | 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 |
git clone https://github.com/zlmediakit/ZLMediaKit.git
cd ZLMediaKit
git submodule update --init
我的编译环境
编译
//如果是centos6.x,需要先安装较新版本的gcc以及cmake,然后打开脚本build_for_linux.sh手动编译
//如果是ubuntu这样的比较新的系统版本可以直接操作第4步
1、安装GCC5.2(如果gcc版本高于4.7可以跳过此步骤)
sudo yum install centos-release-scl -y
sudo yum install devtoolset-4-toolchain -y
scl enable devtoolset-4 bash
2、安装cmake
#需要安装新版本cmake,当然你也可以通过yum或者apt-get方式安装(前提是版本够新)
tar -xvf cmake-3.10.0-rc4.tar.gz
cd cmake-3.10.0-rc4
./configure
make -j4
sudo make install
3、切换高版本gcc
scl enable devtoolset-4 bash
4、编译
cd ZLMediaKit
./build_for_linux.sh
我的编译环境
编译
cd ZLMediaKit
./build_for_mac.sh
编译环境:请参考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"
我的编译环境
编译
cd ZLMediaKit
export ANDROID_NDK_ROOT=/path/to/ndk
./build_for_android.sh
我的编译环境
编译
1 进入ZLMediaKit目录执行 git submodule update --init 以下载ZLToolKit的代码
2 使用cmake-gui打开工程并生成vs工程文件.
3 找到工程文件(ZLMediaKit.sln),双击用vs2017打开.
4 选择编译Release 版本.
5 找到目标文件并运行测试用例.
作为服务器:
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),流id(streamId)
//比如说应用为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");
});
怎么测试服务器性能?
ZLMediaKit提供了测试性能的示例,代码在tests/test_benchmark.cpp。
这里是测试报告:benchmark.md
github下载太慢了,有其他下载方式吗?
你可以在通过开源中国获取最新的代码,地址为:
在windows下编译很多错误?
由于本项目主体代码在macOS/linux下开发,部分源码采用的是无bom头的UTF-8编码;由于windows对于utf-8支持不甚友好,所以如果发现编译错误请先尝试添 加bom头再编译。 也可以通过参考这篇博客解决: vs2015:/utf-8选项解决UTF-8 without BOM 源码中文输出乱码问题
支持linux、windows、mac的rtmp/rtsp播放器
上述工程可能在最新的代码的情况下编译不过,请手动修改
本项目自有代码使用宽松的MIT协议,在保留版权信息的情况下可以自由应用于各自商用、非商业的项目。 但是本项目也零碎的使用了一些其他的开源代码,在商用的情况下请自行替代或剔除; 由于使用本项目而产生的商业纠纷或侵权行为一概与本项项目及开发者无关,请自行承担法律风险。
如果要对项目有相关疑问,建议您这么做:
欢迎捐赠以便更好的推动项目的发展,谢谢您的支持!
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。