体验地址: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 推拉流更简单 —

Logo

火山引擎视频云技术社区,是面向 AI 音视频开发者的技术交流平台。这里汇聚源自抖音、豆包等亿级 DAU 产品的 RTC、直播、点播、AI 媒体处理、音视频互动技术,提供接入指南、最佳实践、性能调优、场景案例、Demo 代码、开源项目、白皮书和 API 文档。社区汇聚官方工程师与一线开发者,为 AI 视频通话、数字人、AI 视频处理等应用的开发与落地提供技术支持。

更多推荐