FlashRTC SDK(轻量级 WebRTC 推拉流开发套件)
体验地址:https://download.csdn.net/download/XiBuQiuChong/93082360
一、SDK 概述
FlashRTC SDK 是一套轻量级的 C++ WebRTC 推拉流开发套件,专注于通过 WHIP(WebRTC HTTP Ingestion Protocol)和 WHEP(WebRTC HTTP Egress Protocol)协议实现与 SRS 等流媒体服务器的低延迟音视频通信。
与传统的 libwebrtc 方案相比,FlashRTC SDK 去除了复杂的浏览器兼容层和冗余功能,仅保留 WebRTC 核心的 ICE、DTLS-SRTP、RTP 协议栈,以最小的代码体积实现高效的实时音视频传输。整个 SDK 不依赖 libwebrtc,仅依赖 OpenSSL 和 libsrtp2,编译简单、集成方便、运行高效。
SDK 适用平台:Windows(Winsock2),开发环境:Visual Studio 2019+,语言标准:C++11。
二、核心特性
| 特性 | 说明 |
| WHIP 推流 | 支持通过 HTTP POST 信令向 SRS 推送 H.264 + Opus 音视频流 |
| WHEP 拉流 | 支持通过 HTTP POST 信令从 SRS 拉取 H.264 + Opus 音视频流 |
| ICE 连接建立 | 完整实现 STUN Binding 请求/响应,支持 ICE 连通性检查 |
| DTLS-SRTP 加密 | 基于 OpenSSL 的 DTLS 握手,派生 SRTP 密钥,保障传输安全 |
| RTP 封装/解封 | H.264 FU-A 分片、Opus 封装、RTP 序列号/时间戳管理 |
| UDP / TCP 双模式 | 支持 UDP 传输和 TCP(RFC 4571)传输,适应不同网络环境 |
| 无 libwebrtc 依赖 | 纯 C++ 实现 WebRTC 协议栈,编译简单,体积小 |
| 回调驱动架构 | 拉流端通过回调函数接收音视频帧,灵活集成到业务逻辑 |
| 线程安全设计 | 关键资源使用临界区保护,支持多线程并发访问 |
| SRS 端口复用 | TCP 模式下复用 SRS RTC 端口(如 8000),无需额外端口 |
三、架构设计
FlashRTC SDK 采用分层架构设计,从上到下分为:业务接口层、信令协商层、连接建立层、安全传输层、网络传输层。各层职责清晰,互不耦合。
架构层级:
┌─────────────────────────────────────────────┐
│ 业务接口层 (whip / whep) │ ← 用户直接调用
├─────────────────────────────────────────────┤
│ 信令协商层 (httpclt + sdp) │ ← HTTP 信令 + SDP 协商
├─────────────────────────────────────────────┤
│ 连接建立层 (ice / dtls) │ ← ICE 连通性 + DTLS 握手
├─────────────────────────────────────────────┤
│ 安全传输层 (srtp + rtp) │ ← SRTP 加解密 + RTP 封装
├─────────────────────────────────────────────┤
│ 网络传输层 (udpskt / tcpskt) │ ← UDP / TCP Socket
└─────────────────────────────────────────────┘
推流(WHIP)数据流:
摄像头/麦克风 → H.264/Opus 编码 → RTP 封装 → SRTP 加密 → UDP/TCP 发送 → SRS 服务器
拉流(WHEP)数据流:
SRS 服务器 → UDP/TCP 接收 → SRTP 解密 → RTP 解封 → H.264/Opus 解码 → 回调输出
四、模块详解
FlashRTC SDK 共包含 10 个核心模块,各模块源码位于 FlashRTC/ 目录下,以头文件(.h)和实现文件(.cpp)形式提供。
| 模块 | 源文件 | 功能描述 |
| whip | whip.h / whip.cpp | WHIP 推流类,封装推流全流程 |
| whep | whep.h / whep.cpp | WHEP 拉流类,封装拉流全流程 |
| sdp | sdp.h / sdp.cpp | SDP 会话描述协议解析与生成 |
| httpclt | httpclt.h / httpclt.cpp | HTTP 客户端,用于 WHIP/WHEP 信令 |
| ice | ice.h / ice.cpp | ICE Agent,STUN 协议实现 |
| dtls | dtls.h / dtls.cpp | DTLS 握手,SRTP 密钥派生 |
| srtp | srtp.h / srtp.cpp | SRTP 加解密,基于 libsrtp2 |
| rtp | rtp.h / rtp.cpp | RTP 协议封装/解封,H.264/Opus 打包 |
| udpskt | udpskt.h / udpskt.cpp | UDP Socket 封装 |
| tcpskt | tcpskt.h / tcpskt.cpp | TCP Socket 封装(RFC 4571 帧格式) |
| utils | utils.h / utils.cpp | 工具函数:随机数、Base64、HMAC-SHA1 等 |
五、快速入门
5.1 推流快速接入
以下示例展示如何使用 whip 类将 H.264 + Opus 音视频流推送到 SRS 服务器:
#include "FlashRTC/whip.h"
whip pusher;
// 1.(可选)设置 TCP 传输模式
pusher.SetUseTcp(true);
// 2. 连接 SRS 服务器(WHIP 端点)
std::string url = "http://192.168.1.100:1985/rtc/v1/whip/?app=live&stream=test001";
if (!pusher.Connect(url)) {
printf("连接失败: %s\n", pusher.GetLastError().c_str());
return;
}
// 3. 发送视频帧
// 30fps 时间戳增量 = 3000
pusher.SendVideo(h264_data, h264_len, 3000);
// 4. 发送音频帧(Opus 编码数据)
// 48kHz 时间戳增量 = 960(20ms)
pusher.SendAudio(opus_data, opus_len, 960);
// 5. 结束推流
pusher.Close();
5.2 拉流快速接入
以下示例展示如何使用 whep 类从 SRS 服务器拉取音视频流:
#include "FlashRTC/whep.h"
whep puller;
// 1. 设置视频帧回调(H.264 编码数据)
puller.SetVideoCallback([](uint8_t* data, int len, uint32_t ts, uint16_t seq) {
// 将 H.264 数据送入解码器
decode_video(data, len);
});
// 2. 设置音频帧回调(Opus 编码数据)
puller.SetAudioCallback([](uint8_t* data, int len, uint32_t ts) {
// 将 Opus 数据送入解码器
decode_audio(data, len);
});
// 3.(可选)设置 TCP 传输模式
puller.SetUseTcp(true);
// 4. 连接 SRS 服务器(WHEP 端点)
std::string url = "http://192.168.1.100:1985/rtc/v1/whep/?app=live&stream=test001";
if (!puller.Connect(url)) {
printf("连接失败: %s\n", puller.GetLastError().c_str());
return;
}
// 5. 在独立线程中运行接收循环(阻塞)
puller.Run();
// 6. 结束拉流
puller.Close();
六、API 参考
6.1 whip 类 API
| 方法 | 参数 | 返回值 | 说明 |
| Connect(url) | url: WHIP 推流地址 | bool | 连接服务器,完成信令+ICE+DTLS+SRTP |
| Close() | 无 | void | 断开连接,释放资源,发送 DELETE 请求 |
| SendVideo(data, len, ts_inc) | data: H.264 NAL; len: 长度; ts_inc: 时间戳增量 | bool | 发送视频帧(自动 FU-A 分片) |
| SendAudio(data, len, ts_inc) | data: Opus 数据; len: 长度; ts_inc: 时间戳增量 | bool | 发送音频帧 |
| IsConnected() | 无 | bool | 查询连接状态 |
| GetLastError() | 无 | std::string | 获取最近一次错误信息 |
| SetUseTcp(use_tcp) | use_tcp: true=TCP, false=UDP | void | 设置传输模式(Connect 前调用) |
6.2 whep 类 API
| 方法 | 参数 | 返回值 | 说明 |
| Connect(url) | url: WHEP 拉流地址 | bool | 连接服务器,完成信令+ICE+DTLS+SRTP |
| Run() | 无 | void | 阻塞接收循环(需在线程中调用) |
| Stop() | 无 | void | 停止接收循环 |
| Close() | 无 | void | 断开连接,释放资源 |
| SetVideoCallback(cb) | cb: 视频回调函数 | void | 设置视频帧回调(H.264 NAL) |
| SetAudioCallback(cb) | cb: 音频回调函数 | void | 设置音频帧回调(Opus) |
| IsConnected() | 无 | bool | 查询连接状态 |
| GetLastError() | 无 | std::string | 获取最近一次错误信息 |
| SetUseTcp(use_tcp) | use_tcp: true=TCP, false=UDP | void | 设置传输模式(Connect 前调用) |
七、传输模式
FlashRTC SDK 支持两种网络传输模式,可通过 SetUseTcp() 在连接前切换:
| 对比项 | UDP 模式(默认) | TCP 模式 |
| 传输协议 | RTP over UDP over SRTP | RTP over TCP over SRTP(RFC 4571) |
| 延迟 | 最低(无重传机制) | 略高(TCP 重传机制) |
| 可靠性 | 允许少量丢包 | 保证可靠传输 |
| NAT 穿透 | 支持(STUN) | 无需(主动连接) |
| 适用场景 | 低延迟直播、视频会议 | 弱网环境、防火墙穿透 |
| 端口 | 本地随机端口 | 连接到 SRS RTC 端口 |
| SDP 候选 | host candidate (IP:port:udp) | host candidate (IP:9:tcp) |
| 帧格式 | 直接 UDP 数据报 | 2 字节长度前缀 + RTP 数据 |
选择建议:在公网或存在防火墙的环境中推荐使用 TCP 模式;在局域网或对延迟要求极高的场景使用 UDP 模式。
八、依赖库
| 依赖库 | 版本 | 用途 | 授权协议 |
| OpenSSL | 1.1.x | DTLS 握手、证书生成、HMAC-SHA1、Base64 | Apache-2.0 |
| libsrtp2 | 2.x | SRTP 加解密(RTP/RTCP) | BSD-3-Clause |
| Winsock2 (ws2_32) | 系统内置 | UDP/TCP Socket 网络通信 | — |
SDK 不依赖 libwebrtc、libcurl、boost 等大型第三方库,编译和集成非常轻量。
九、应用场景
| 场景 | 说明 |
| 直播推流 | 通过 WHIP 协议将摄像头画面推送到 SRS,替代传统 RTMP 推流 |
| 直播拉流 | 通过 WHEP 协议从 SRS 拉取直播流,替代传统 RTMP/HLS 拉流 |
| 视频会议 | 低延迟 WebRTC 通信,支持多方音视频交互 |
| 远程监控 | 将 IPC 摄像头画面通过 WebRTC 推送到云端,实现远程实时监控 |
| 在线教育 | 教师端推流、学生端拉流,实现低延迟互动教学 |
| 云游戏 | 游戏画面推流到服务器,玩家端拉流实现远程游戏 |
| 安防监控 | 多路摄像头推流、集中拉流显示 |
| 企业内训 | 企业内部直播、培训、会议 |
十、技术优势
1. 轻量级设计
不依赖 libwebrtc,整个 SDK 仅数千行 C++ 代码,编译后体积小,适合嵌入式和移动端集成。
2. 标准协议实现
完整实现 IETF 标准:WHIP(draft-ietf-wish-whip)、WHEP(draft-ietf-wish-whep)、ICE(RFC 8445)、DTLS 1.0(RFC 6347)、SRTP(RFC 3711)、RTP(RFC 3550)、H.264 RTP 打包(RFC 6184)。
3. 低延迟传输
端到端延迟可低至 200ms 以内(UDP 模式),远优于 RTMP(1-3 秒)和 HLS(5-10 秒)。
4. 双传输模式
同时支持 UDP(低延迟)和 TCP(高可靠)两种传输模式,适应不同网络环境。TCP 模式复用 SRS RTC 端口,无需额外配置。
5. 安全加密
DTLS-SRTP 端到端加密,防止音视频数据被窃听和篡改。证书指纹验证防止中间人攻击。
6. 易于集成
接口简洁(Connect → Send/Callback → Close),只需几行代码即可完成推拉流功能集成。回调驱动架构灵活对接任意解码器。
7. SRS 深度适配
针对 SRS 流媒体服务器深度优化,支持 SRS 的 WHIP/WHEP 端点、TCP 端口复用、Resource URL 管理等特性。
— FlashRTC SDK · 让 WebRTC 推拉流更简单 —
火山引擎视频云技术社区,是面向 AI 音视频开发者的技术交流平台。这里汇聚源自抖音、豆包等亿级 DAU 产品的 RTC、直播、点播、AI 媒体处理、音视频互动技术,提供接入指南、最佳实践、性能调优、场景案例、Demo 代码、开源项目、白皮书和 API 文档。社区汇聚官方工程师与一线开发者,为 AI 视频通话、数字人、AI 视频处理等应用的开发与落地提供技术支持。
更多推荐
所有评论(0)