ZLMediaKit搭建直播平台

软件简介

  • 基于C++11开发,避免使用裸指针,代码稳定可靠,性能优越。
  • 支持多种协议(RTSP/RTMP/HLS/HTTP-FLV/WebSocket-FLV/GB28181/HTTP-TS/WebSocket-TS/HTTP-fMP4/WebSocket-fMP4/MP4/WebRTC),支持协议互转。
  • 使用多路复用/多线程/异步网络IO模式开发,并发性能优越,支持海量客户端连接。
  • 代码经过长期大量的稳定性、性能测试,已经在线上商用验证已久。
  • 支持linux、macos、ios、android、windows全平台。
  • 支持x86、arm、risc-v、mips、龙芯、申威等指令集平台。
  • 支持画面秒开、极低延时(500毫秒内,最低可达100毫秒)。
  • 提供完善的标准C API,可以作SDK用,或供其他语言调用。
  • 提供完整的MediaServer服务器,可以免开发直接部署为商用服务器。
  • 提供完善的restful api以及web hook,支持丰富的业务逻辑。
  • 打通了视频监控协议栈与直播协议栈,对RTSP/RTMP支持都很完善。
  • 功能完善,支持集群、按需转协议、按需推拉流、先播后推、断连续推等功能。
  • 极致性能,单机10W级别播放器,100Gb/s级别io带宽能力。
  • 全面支持ipv6网络
  • 支持多轨道模式(一个流中多个视频/音频)
  • 全协议支持H264/H265/AAC/G711/OPUS/MP3,部分支持VP8/VP9/AV1/JPEG/MP3/H266/ADPCM/SVAC/G722/G723/G729

项目地址

github.com/ZLMediaKit/...

编译

使用的系统

sh 复制代码
➜  ~ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 12 (bookworm)
Release:        12
Codename:       bookworm

克隆项目

sh 复制代码
git clone --depth 1 https://github.com/ZLMediaKit/ZLMediaKit.git

切换到项目目录

sh 复制代码
cd ZLMediaKit

更新源

sh 复制代码
git submodule update --init 

开始构建

项目使用的是cmake构建的,因此在构建之前需要提前安装下cmake构建工具和必备的软件工具包

sh 复制代码
apt install cmake

构建

sh 复制代码
mkdir build
cd build
cmake ..
make -j 4

查看运行的参数

构建成功以后我们查看一下运行的参数

切换到构建好的二进制程序目录

sh 复制代码
cd /root/ZLMediaKit/release/linux/Debug

查看命令参数

sh 复制代码
➜  Debug git:(master) ./MediaServer -h
2025-03-30 14:25:11.959 I [MediaServer] [3754-MediaServer] Factory.cpp:35 registerPlugin | Load codec: H264
2025-03-30 14:25:11.959 I [MediaServer] [3754-MediaServer] Factory.cpp:35 registerPlugin | Load codec: H265
2025-03-30 14:25:11.959 I [MediaServer] [3754-MediaServer] Factory.cpp:35 registerPlugin | Load codec: JPEG
2025-03-30 14:25:11.959 I [MediaServer] [3754-MediaServer] Factory.cpp:35 registerPlugin | Load codec: mpeg4-generic
2025-03-30 14:25:11.959 I [MediaServer] [3754-MediaServer] Factory.cpp:35 registerPlugin | Load codec: opus
2025-03-30 14:25:11.959 I [MediaServer] [3754-MediaServer] Factory.cpp:35 registerPlugin | Load codec: PCMA
2025-03-30 14:25:11.959 I [MediaServer] [3754-MediaServer] Factory.cpp:35 registerPlugin | Load codec: PCMU
2025-03-30 14:25:11.959 I [MediaServer] [3754-MediaServer] Factory.cpp:35 registerPlugin | Load codec: L16
2025-03-30 14:25:11.959 I [MediaServer] [3754-MediaServer] Factory.cpp:35 registerPlugin | Load codec: MP3
  -h  --help       无参  默认:null                                              选填  打印此信息
  -d  --daemon     无参  默认:null                                              选填  是否以Daemon方式启动
  -l  --level      有参  默认:1                                                 选填  日志等级,LTrace~LError(0~4)
  -m  --max_day    有参  默认:7                                                 选填  日志最多保存天数
  -c  --config     有参  默认:/root/ZLMediaKit/release/linux/Debug/config.ini   选填  配置文件路径
  -s  --ssl        有参  默认:/root/ZLMediaKit/release/linux/Debug/default.pem  选填  ssl证书文件或文件夹,支持p12/pem类型
  -t  --threads    有参  默认:4                                                 选填  启动事件触发线程数
      --affinity   有参  默认:1                                                 选填  是否启动cpu亲和性设置
  -v  --version    无参  默认:null                                              选填  显示版本号
      --log-slice  有参  默认:100                                               选填  最大保存日志切片个数
      --log-size   有参  默认:256                                               选填  单个日志切片最大容量,单位MB
      --log-dir    有参  默认:/root/ZLMediaKit/release/linux/Debug/log/         选填  日志保存文件夹路径

2025-03-30 14:25:11.960 I [MediaServer] [3754-MediaServer] logger.cpp:91 ~Logger | 

启动

以守护进程启动

sh 复制代码
 ./MediaServer -d &

查看下监听的端口

sh 复制代码
➜  Debug git:(master) ss -tunlp
Netid   State    Recv-Q   Send-Q     Local Address:Port       Peer Address:Port   Process                                                  
udp     UNCONN   0        0                0.0.0.0:68              0.0.0.0:*       users:(("dhclient",pid=602,fd=7))                       
udp     UNCONN   0        0                0.0.0.0:68              0.0.0.0:*       users:(("dhclient",pid=549,fd=7))                       
udp     UNCONN   0        0                      *:9000                  *:*       users:(("MediaServer",pid=3850,fd=21))                  
udp     UNCONN   0        0                      *:9000                  *:*       users:(("MediaServer",pid=3850,fd=26))                  
udp     UNCONN   0        0                      *:9000                  *:*       users:(("MediaServer",pid=3850,fd=27))                  
udp     UNCONN   0        0                      *:9000                  *:*       users:(("MediaServer",pid=3850,fd=28))                  
udp     UNCONN   0        0                      *:10000                 *:*       users:(("MediaServer",pid=3850,fd=22))                  
udp     UNCONN   0        0                      *:10000                 *:*       users:(("MediaServer",pid=3850,fd=23))                  
udp     UNCONN   0        0                      *:10000                 *:*       users:(("MediaServer",pid=3850,fd=24))                  
udp     UNCONN   0        0                      *:10000                 *:*       users:(("MediaServer",pid=3850,fd=25))                  
tcp     LISTEN   0        128              0.0.0.0:22              0.0.0.0:*       users:(("sshd",pid=672,fd=3))                           
tcp     LISTEN   0        511              0.0.0.0:6379            0.0.0.0:*       users:(("redis-server",pid=665,fd=6))                   
tcp     LISTEN   0        1024                   *:10000                 *:*       users:(("MediaServer",pid=3850,fd=20))                  
tcp     LISTEN   0        1024                   *:1935                  *:*       users:(("MediaServer",pid=3850,fd=17))                  
tcp     LISTEN   0        4096                   *:4369                  *:*       users:(("epmd",pid=664,fd=3),("systemd",pid=1,fd=57))   
tcp     LISTEN   0        1024                   *:443                   *:*       users:(("MediaServer",pid=3850,fd=19))                  
tcp     LISTEN   0        128                 [::]:22                 [::]:*       users:(("sshd",pid=672,fd=4))                           
tcp     LISTEN   0        1024                   *:80                    *:*       users:(("MediaServer",pid=3850,fd=18))                  
tcp     LISTEN   0        1024                   *:554                   *:*       users:(("MediaServer",pid=3850,fd=16))

测试

使用ffmpeg推流

sh 复制代码
# rtsp推流格式
ffmpeg.exe -re -i .\nana.mp4 -vcodec libx264 -bsf:v h264_mp4toannexb -acodec aac -f rtsp -rtsp_transport tcp rtsp://192.168.0.38/live/test1

# rtmp推流格式
ffmpeg.exe -re -i .\nana.mp4 -vcodec libx264 -bsf:v h264_mp4toannexb -acodec aac -f flv rtmp://192.168.0.38/live/test2

参数说明

  • -re:以原始帧率读取输入文件,适用于实时流媒体。
  • -i .\nana.mp4:指定输入文件为当前目录下的nana.mp4
  • -vcodec libx264:使用libx264编码器对视频进行编码。
  • -bsf:v h264_mp4toannexb:添加一个比特流过滤器(Bitstream Filter),将H.264编码转换为Annex B格式,这是RTSP流媒体常用的格式。
  • -acodec aac:使用AAC编码器对音频进行编码。
  • -f rtsp:指定输出格式为RTSP。
  • -rtsp_transport tcp:指定RTSP传输协议为TCP。
  • rtsp://192.168.0.38/live/test1:RTSP服务器的地址和流媒体路径。

使用vlc播放测试

相关推荐
yu4106212 小时前
Rust 语言使用场景分析
开发语言·后端·rust
细心的莽夫2 小时前
SpringCloud 微服务复习笔记
java·spring boot·笔记·后端·spring·spring cloud·微服务
jack_xu4 小时前
高频面试题:如何保证数据库和es数据一致性
后端·mysql·elasticsearch
pwzs4 小时前
Java 中 String 转 Integer 的方法与底层原理详解
java·后端·基础
Asthenia04124 小时前
InnoDB文件存储结构与Socket技术(从Linux的FD到Java的API)
后端
Asthenia04125 小时前
RocketMQ 消息不丢失与持久化机制详解-生产者与Broker之间的详解
后端
〆、风神5 小时前
Spring Boot 整合 Lock4j + Redisson 实现分布式锁实战
spring boot·分布式·后端
Asthenia04125 小时前
Select、Poll、Epoll 详细分析与面试深度剖析/C代码详解
后端
烛阴5 小时前
Node.js中必备的中间件大全:提升性能、安全与开发效率的秘密武器
javascript·后端·express