这是一个学习向、并逐步向工程化演进的 C++ 流媒体项目。项目从 Linux 网络编程基础开始,逐步实现 epoll/Reactor 网络库,并在其上构建 RTMP 推流、HTTP-FLV 拉流、HLS/LL-HLS 切片输出以及 WebRTC Echo Peer 实验模块。
本仓库不定位为可直接商用的完整流媒体服务器,而是用于系统学习音视频流媒体底层链路:网络模型、协议状态机、封装格式、时间戳处理、媒体数据分发以及 WebRTC 基础协商流程。
- 从 socket、
epoll、Reactor、Buffer、多线程模型开始,理解 Linux 高并发网络编程。 - 实现一个可复用的 C++ Reactor 网络库,作为上层协议的基础。
- 打通 RTMP 推流、HTTP-FLV 低延迟拉流、HLS/LL-HLS 输出和 WebRTC Echo 的核心流程。
- 通过代码理解 RTMP Chunk、AMF0、FLV Tag、MPEG-TS、PES、90kHz 时间戳、SDP、STUN、DTLS-SRTP、RTP 等关键概念。
- 在保持代码可读性的前提下,逐步补充更工程化的模块边界、测试和运行验证方式。
+----------------------+
| FFmpeg / OBS 推流 |
+----------+-----------+
|
| RTMP
v
+----------------+ +---------------+ +----------------+
| 06_net_lib | --> | RTMP Server | ---> | Media Message |
| epoll/Reactor | | Handshake | | Dispatch |
| TcpConnection | | Chunk / AMF0 | +-------+--------+
+----------------+ +---------------+ |
|
+----------------------------------------+-------------------+
| | |
v v v
+---------------+ +---------------+ +----------------+
| HTTP-FLV | | HLS / LL-HLS | | WebRTC Echo |
| FLV Tag | | MPEG-TS | | SDP / STUN |
| HTTP stream | | m3u8 / part | | DTLS-SRTP/RTP |
+---------------+ +---------------+ +----------------+
| 目录 | 说明 |
|---|---|
03_concurrency |
线程创建、互斥锁、条件变量、线程池等并发基础练习。 |
04_epoll |
epoll 基础示例,包括 LT/ET 模式、echo server、多客户端测试。 |
05_reactor |
Reactor 模型分阶段练习,从单线程 Reactor 到多线程 Reactor。 |
06_net_lib |
自研 C++ Reactor 网络库,包含 EventLoop、Channel、TcpConnection、TcpServer、Buffer、EventLoopThreadPool 等组件。 |
07_http_server |
基于自研网络库实现的 HTTP/1.1 静态文件服务器。 |
08_log_system |
异步日志系统实验。 |
09_rtmp_server |
主流媒体服务器模块,实现 RTMP 推流接入、HTTP-FLV 输出、HLS/LL-HLS 切片、时间戳归一化和 ABR 实验入口。 |
10_webrtc |
极简 C++ WebRTC Echo Peer,实现 SDP Answer、STUN 响应、DTLS-SRTP 和 SRTP RTP 回显。 |
av_basics |
音视频基础实验,包括 NALU 格式转换等。 |
- 基于非阻塞 socket 和
epoll实现 Reactor 网络库。 - 实现 RTMP 握手、Chunk 解析、AMF0 命令处理、Session 状态管理和媒体消息回调。
- 实现 HTTP-FLV 输出链路,将 RTMP 音视频消息封装为 FLV Tag,并通过 HTTP 长连接输出。
- 实现 HLS/LL-HLS 输出链路,包括 MPEG-TS 写入、PAT/PMT、PES 打包、分片/Part 生成、m3u8 窗口更新、Blocking Reload 和时间戳归一化。
- 实现 WebRTC Echo Peer:浏览器通过 SDP 与 C++ 服务端协商,服务端处理 STUN、完成 DTLS-SRTP、解密 SRTP RTP、改写 SSRC 后重新加密回传。
- 为时间戳归一化逻辑补充基础单元测试。
项目按子目录组织,每个主要模块可以独立使用 CMake 构建。
cd 09_rtmp_server
mkdir -p build
cd build
cmake ..
make -j
./streaming_server服务启动后默认输出:
RTMP : rtmp://127.0.0.1:1935/live/stream1
FLV : http://127.0.0.1:8080/live/stream1.flv
HLS : http://127.0.0.1:8090/live/stream1/playlist.m3u8
ABR : http://127.0.0.1:8090/live/stream1/master.m3u8
使用 FFmpeg 推流:
ffmpeg -re -i test.flv -c copy -f flv rtmp://127.0.0.1:1935/live/stream1播放 HTTP-FLV / HLS:
ffplay http://127.0.0.1:8080/live/stream1.flv
ffplay http://127.0.0.1:8090/live/stream1/playlist.m3u8依赖 OpenSSL 和 libsrtp2。
cd 10_webrtc
mkdir -p build
cd build
cmake ..
make -j
./webrtc_echo_server <公网IP> 5000浏览器访问:
http://<公网IP>:8080/
点击 Start Echo 后,浏览器会将摄像头视频通过 WebRTC 发送到 C++ 服务端,服务端解密 SRTP RTP 后重新加密回传,浏览器右侧窗口显示回显画面。
时间戳归一化测试:
cd 09_rtmp_server/build
ctest --output-on-failure这是一个学习到工程化过渡阶段的项目,部分实现有意保持简化:
- WebRTC 模块是 Echo Peer,不是完整 SFU,也不是商用 WebRTC 服务器。
- ICE 当前主要验证简单 host candidate 链路,未完整实现 TURN、Trickle ICE、ICE Restart 等生产能力。
- HLS/LL-HLS 已覆盖分片、playlist、part 和 blocking reload 的核心概念,但还缺少生产级存储、清理、CDN 对接、监控和容灾能力。
- RTMP/HTTP-FLV 侧重点是协议解析和媒体分发,还未实现完整鉴权、限流、录制、分布式转发和运维监控。
- 错误处理、连接生命周期保护、反压控制、内存限制、指标统计等工程化能力仍可继续完善。
04_epoll:理解 LT/ET、非阻塞 IO 和事件触发。05_reactor:理解 Reactor 的事件分发和回调模型。06_net_lib:理解EventLoop、Channel、TcpConnection、Buffer如何组成可复用网络库。07_http_server:理解应用层协议如何建立在 TCP 字节流之上。09_rtmp_server:跟踪 RTMP Message 到 HTTP-FLV 和 HLS/LL-HLS 的数据路径。10_webrtc:学习 SDP、STUN、DTLS-SRTP 和 RTP 在 UDP 上的完整回显链路。
.gitignore 已排除构建产物、运行生成的媒体文件、本地助手配置、第三方压测工具源码和个人学习笔记。仓库主要保留源码、CMake 构建文件、示例、测试和公开文档。