Skip to content

Repository files navigation

C++ 多协议低延迟直播流媒体学习项目

这是一个学习向、并逐步向工程化演进的 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 网络库,包含 EventLoopChannelTcpConnectionTcpServerBufferEventLoopThreadPool 等组件。
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 构建。

RTMP / HTTP-FLV / HLS 服务

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

WebRTC Echo Peer

依赖 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 侧重点是协议解析和媒体分发,还未实现完整鉴权、限流、录制、分布式转发和运维监控。
  • 错误处理、连接生命周期保护、反压控制、内存限制、指标统计等工程化能力仍可继续完善。

推荐学习顺序

  1. 04_epoll:理解 LT/ET、非阻塞 IO 和事件触发。
  2. 05_reactor:理解 Reactor 的事件分发和回调模型。
  3. 06_net_lib:理解 EventLoopChannelTcpConnectionBuffer 如何组成可复用网络库。
  4. 07_http_server:理解应用层协议如何建立在 TCP 字节流之上。
  5. 09_rtmp_server:跟踪 RTMP Message 到 HTTP-FLV 和 HLS/LL-HLS 的数据路径。
  6. 10_webrtc:学习 SDP、STUN、DTLS-SRTP 和 RTP 在 UDP 上的完整回显链路。

仓库说明

.gitignore 已排除构建产物、运行生成的媒体文件、本地助手配置、第三方压测工具源码和个人学习笔记。仓库主要保留源码、CMake 构建文件、示例、测试和公开文档。

About

C++ 多协议低延迟直播流媒体学习项目

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages