欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入免费知识星球。

ZLMediaKit教程(一)编译安装

ZLMediaKit 迷途小书童 2年前 (2021-09-24) 4287次浏览 0个评论

环境

  • ubuntu 18.04 64bit
  • ZLMediaKit 20210924
  • ffmpeg 3.4.8

前言

ZLMediaKit 是一个基于 C++11 的高性能运营级流媒体服务框架,这个项目定位于商用级流媒体服务器,支持 linuxmacoswindowsandroidios全平台,支持多种协议,如 RTSPRTMPHLSHTTP-FLVWebSocket-FLVGB28181HTTP-TSWebSocket-TSHTTP-fMP4WebSocket-fMP4MP4WebRTC等,且支持协议互转,提供了完善的标准 C APIRESTful APIweb hook,支持丰富的业务逻辑,真正做到了拿来即用

功能清单

下图是 ZLMediaKit 的功能清单,涵盖的内容非常广泛

ZLMediaKit

  • RTSP[S]

    • RTSP[S] 服务器,支持 RTMP/MP4/HLS 转 RTSP[S],支持亚马逊 echo show 这样的设备
    • RTSP[S] 播放器,支持 RTSP 代理,支持生成静音音频
    • RTSP[S] 推流客户端与服务器
    • 支持 rtp over udp rtp over tcp rtp over http rtp组播 四种 RTP 传输方式
    • 服务器/客户端完整支持 Basic/Digest 方式的登录鉴权,全异步可配置化的鉴权接口
    • 支持H265编码
    • 服务器支持RTSP推流(包括rtp over udp rtp over tcp方式)
    • 支持H264/H265/AAC/G711/OPUS编码,其他编码能转发但不能转协议
  • RTMP[S]

    • RTMP[S] 播放服务器,支持RTSP/MP4/HLS转RTMP
    • RTMP[S] 发布服务器,支持录制发布流
    • RTMP[S] 播放器,支持 RTMP 代理,支持生成静音音频
    • RTMP[S] 推流客户端
    • 支持http[s]-flv直播
    • 支持websocket-flv直播
    • 支持H264/H265/AAC/G711/OPUS编码,其他编码能转发但不能转协议
    • 支持RTMP-H265
    • 支持RTMP-OPUS
  • HLS

    • 支持 HLS 文件生成,自带 HTTP 文件服务器
    • 通过 cookie 追踪技术,可以模拟 HLS 播放为长连接,可以实现 HLS 按需拉流、播放统计等业务
    • 支持 HLS 播发器,支持拉流 HLS 转rtsp/rtmp/mp4
    • 支持H264/H265/AAC/G711/OPUS编码
  • TS

    • 支持http[s]-ts直播
    • 支持ws[s]-ts直播
    • 支持H264/H265/AAC/G711/OPUS编码
  • fMP4

    • 支持http[s]-fmp4直播
    • 支持ws[s]-fmp4直播
    • 支持H264/H265/AAC/G711/OPUS编码
  • HTTP[S]与WebSocket

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

    • 支持UDP/TCP国标RTP(PS或TS)推流服务器,可以转换成RTSP/RTMP/HLS等协议
    • 支持RTSP/RTMP/HLS转国标推流客户端,支持TCP/UDP模式,提供相应 restful api
    • 支持H264/H265/AAC/G711/OPUS编码
    • 支持海康 ehome 推流
  • MP4点播与录制

    • 支持录制为FLV/HLS/MP4
    • RTSP/RTMP/HTTP-FLV/WS-FLV支持MP4文件点播,支持seek
    • 支持H264/H265/AAC/G711/OPUS编码
  • WebRTC

    • 支持 WebRTC 推流,支持转其他协议
    • 支持 WebRTC 播放,支持其他协议转WebRTC
    • 支持 simulcast
    • 支持 rtx/nack
    • 支持单端口、多线程、客户端网络连接迁移(开源界唯一)
  • 其他

    • 支持丰富的 restful api 以及 web hook 事件
    • 支持简单的 telnet 调试
    • 支持配置文件热加载
    • 支持流量统计、推拉流鉴权等事件
    • 支持虚拟主机,可以隔离不同域名
    • 支持按需拉流,无人观看自动关断拉流
    • 支持先拉流后推流,提高及时推流画面打开率
    • 提供 c api sdk
    • 支持 FFmpeg 拉流代理任意格式的流
    • 支持 http api 生成并返回实时截图
    • 支持按需解复用、转协议,当有人观看时才开启转协议

源码编译及测试

源码编译之前,先安装编译器、cmake 构建工具及需要的第三方依赖库

# 安装编译器
sudo apt install build-essential cmake

# 其它依赖库
sudo apt-get install libssl-dev libsdl-dev libavcodec-dev libavutil-dev ffmpeg

完成后,就可以开始拉取源码并编译了,依次执行下面命令

git clone https://github.com/ZLMediaKit/ZLMediaKit.git
cd ZLMediaKit

# 更新子模块
git submodule update --init
mkdir build
cd build
cmake ..
make -j4

编译好后,生成的可执行文件存放在 ZLMediaKit/release/linux

来启动服务

cd ../release/linux

# 可以通过-h来查看命令支持的参数
sudo ./MediaServer -d
(base) xugaoxiang@1070Ti:~/workshop/github/ZLMediaKit/release/linux$ sudo ./MediaServer -d
2021-09-24 14:27:54.227 D MediaServer[1895-main thread] System.cpp:100 startDaemon | 启动子进程:1897
2021-09-24 14:27:54.227 I MediaServer[1897-main thread] System.cpp:130 systemSetup | core文件大小设置为:18446744073709551615
2021-09-24 14:27:54.227 I MediaServer[1897-main thread] System.cpp:139 systemSetup | 文件最大描述符个数设置为:1048576
2021-09-24 14:27:54.232 W MediaServer[1897-main thread] SSLUtil.cpp:98 loadPublicKey | error:02001002:system library:fopen:No such file                               or directory
2021-09-24 14:27:54.232 W MediaServer[1897-main thread] SSLUtil.cpp:126 loadPrivateKey | error:2006D080:BIO routines:BIO_new_file:no su                              ch file
2021-09-24 14:27:54.232 D MediaServer[1897-stamp thread] util.cpp:342 operator() | Stamp thread started!
2021-09-24 14:27:54.233 I MediaServer[1897-main thread] EventPoller.cpp:466 EventPollerPool | 创建EventPoller个数:4
2021-09-24 14:27:54.233 I MediaServer[1897-main thread] TcpServer.cpp:188 start_l | TCP Server listening on 0.0.0.0:554
2021-09-24 14:27:54.234 I MediaServer[1897-main thread] TcpServer.cpp:188 start_l | TCP Server listening on 0.0.0.0:332
2021-09-24 14:27:54.234 I MediaServer[1897-main thread] TcpServer.cpp:188 start_l | TCP Server listening on 0.0.0.0:1935
2021-09-24 14:27:54.234 I MediaServer[1897-main thread] TcpServer.cpp:188 start_l | TCP Server listening on 0.0.0.0:19350
2021-09-24 14:27:54.235 I MediaServer[1897-main thread] TcpServer.cpp:188 start_l | TCP Server listening on 0.0.0.0:8080
2021-09-24 14:27:54.235 I MediaServer[1897-main thread] TcpServer.cpp:188 start_l | TCP Server listening on 0.0.0.0:443
2021-09-24 14:27:54.235 I MediaServer[1897-main thread] TcpServer.cpp:188 start_l | TCP Server listening on 0.0.0.0:9000
2021-09-24 14:27:54.236 I MediaServer[1897-main thread] TcpServer.cpp:188 start_l | TCP Server listening on 0.0.0.0:10000
2021-09-24 14:27:54.236 I MediaServer[1897-main thread] UdpServer.cpp:78 start_l | UDP Server bind to 0.0.0.0:10000
2021-09-24 14:27:54.237 I MediaServer[1897-main thread] main.cpp:368 start_main | 已启动http api 接口
2021-09-24 14:27:54.237 I MediaServer[1897-main thread] main.cpp:370 start_main | 已启动http hook 接口

服务启动好了以后,就可以在客户端推流,简单起见,就在同一台机器上推流,不同主机的话,修改下 ip 地址即可

使用rtsp方式推流

# h264编码
ffmpeg -re -i test.mp4 -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1/live/test

# h265编码
ffmpeg -re -i test.mp4 -vcodec h265 -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1/live/test

ffmpeg 推流成功后,注意看下服务器端的输出信息

2021-09-24 16:47:42.327 D MediaServer[21725-event poller 0] RtspSession.cpp:53 RtspSession | 140068211663280(127.0.0.1:55128)
2021-09-24 16:47:42.329 I MediaServer[21725-event poller 0] MediaSource.cpp:414 emitEvent | 媒体注册:hls __defaultVhost__ live test
2021-09-24 16:47:42.329 D MediaServer[21725-event poller 0] MediaSink.cpp:141 emitAllTrackReady | all track ready use 0ms
2021-09-24 16:47:42.329 I MediaServer[21725-event poller 0] MultiMediaSourceMuxer.cpp:297 onAllTrackReady | stream: rtsp://127.0.0.1:554/live/test , codec info: mpeg4-generic[48000/2/16] H264[854/480/48]
2021-09-24 16:47:45.596 I MediaServer[21725-event poller 0] MediaSource.cpp:414 emitEvent | 媒体注册:rtsp __defaultVhost__ live test
2021-09-24 16:47:45.641 I MediaServer[21725-event poller 0] MediaSource.cpp:414 emitEvent | 媒体注册:rtmp __defaultVhost__ live test
2021-09-24 16:47:45.641 I MediaServer[21725-event poller 0] MediaSource.cpp:414 emitEvent | 媒体注册:ts __defaultVhost__ live test
2021-09-24 16:47:45.728 I MediaServer[21725-event poller 0] MediaSource.cpp:414 emitEvent | 媒体注册:fmp4 __defaultVhost__ live test

可以看到几个媒体注册的消息,同时支持 rtsprtmphls等协议,现在可以另一台机器上开个播放器播放了,像 vlcffplay 都可以,播放的 url

rtsp://192.168.1.140/live/test
rtmp://192.168.1.140/live/test
http://192.168.1.140/live/test/hls.m3u8

其中 192.168.1.140 是开启视频服务的机器 IP 地址

ZLMediaKit

ZLMediaKit

ZLMediaKit

hls 默认端口是80,我这里由于冲突,已经将配置文件 config.ini 中的端口改成了8080,这个 ini 文件也是视频服务器的配置文件,可以根据自己的实际情况进行修改

使用rtmp方式推流

ffmpeg -re -i test.mp4 -vcodec h264 -acodec aac -f flv rtmp://127.0.0.1/live/test

# RTMP标准不支持H265,但是国内有自行扩展的,如果你想让ffmpeg支持RTMP-H265,需要重新编译ffmpeg,可以参考:https://github.com/ksvc/FFmpeg/wiki/hevcpush

ffmpeg 推流成功后,服务器端产生的 url 与 上面的rtsp 推流方式类似,这里不再赘述

使用rtp方式推流

ffmpeg -re -i test.mp4 -vcodec h264 -acodec aac -f rtp_mpegts rtp://127.0.0.1:10000

ffmpeg 推送后,服务器端输出了对应流的 ID

ZLMediaKit

拿到了这个 ID 后,这时候就可以拼接 url 进行播放了,如

rtmp://192.168.1.140/rtp/C20C27F2
rtsp://192.168.1.140/rtp/C20C27F2
http://192.168.1.140:8080/rtp/C20C27F2/hls.m3u8

ZLMediaKit

参考资料

喜欢 (0)

您必须 登录 才能发表评论!

Ads Blocker Image Powered by Code Help Pro

Ads Blocker Detected!!!

请关闭 Adblock 等类似浏览器插件,然后刷新页面访问,感谢您的支持!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.