WebRTC API 手册#
概述#
libpeer 是一个轻量级 WebRTC 库,用纯 C 语言实现,提供了 PeerConnection 管理、SDP 信令交换、ICE 连接、DataChannel 通信以及音视频数据收发等功能。本文档提供的 API 为 C 语言接口,可在 C 或 C++ 应用中调用,编译成可执行文件后在 k230 开发板上运行。
注意:
1、当前视频编码支持 H.264 和 H.265,VP8 和 MJPEG 尚未实现; 2、当前音频编码支持 G711A(PCMA)、G711U(PCMU)和 OPUS; 3、调用
peer_connection_create前需先调用peer_init初始化 libsrtp 和 SCTP; 4、信令交换需配合peer_signaling模块或自定义信令服务完成; 5、发送视频数据时应传入完整的 NAL 单元,发送音频数据时应传入 G711 或 OPUS 编码帧。
支持的媒体编码#
类型 |
编码格式 |
备注 |
|---|---|---|
视频 |
H.264 |
|
视频 |
H.265 |
|
视频 |
VP8 |
尚未实现 |
视频 |
MJPEG |
尚未实现 |
音频 |
G711A |
PCMA |
音频 |
G711U |
PCMU |
音频 |
OPUS |
参数类型介绍#
SdpType#
【描述】
SdpType 用于标识 SDP(Session Description Protocol)的类型,分为 Offer 和 Answer 两种。
【定义】
typedef enum SdpType {
SDP_TYPE_OFFER = 0,
SDP_TYPE_ANSWER,
} SdpType;
【说明】
枚举值 |
描述 |
|---|---|
SDP_TYPE_OFFER |
SDP Offer,由呼叫方创建 |
SDP_TYPE_ANSWER |
SDP Answer,由应答方创建 |
PeerConnectionState#
【描述】
PeerConnectionState 用于表示 PeerConnection 的 ICE 连接状态。
【定义】
typedef enum PeerConnectionState {
PEER_CONNECTION_CLOSED = 0,
PEER_CONNECTION_NEW,
PEER_CONNECTION_CHECKING,
PEER_CONNECTION_CONNECTED,
PEER_CONNECTION_COMPLETED,
PEER_CONNECTION_FAILED,
PEER_CONNECTION_DISCONNECTED,
} PeerConnectionState;
【说明】
枚举值 |
描述 |
|---|---|
PEER_CONNECTION_CLOSED |
连接已关闭 |
PEER_CONNECTION_NEW |
新建连接,ICE 代理正在收集候选者 |
PEER_CONNECTION_CHECKING |
ICE 代理正在检查候选者对 |
PEER_CONNECTION_CONNECTED |
至少一个候选者对连接成功 |
PEER_CONNECTION_COMPLETED |
ICE 代理检查完成 |
PEER_CONNECTION_FAILED |
ICE 连接失败 |
PEER_CONNECTION_DISCONNECTED |
连接已断开 |
DataChannelType#
【描述】
DataChannelType 用于标识 DataChannel 传输的数据类型。
【定义】
typedef enum DataChannelType {
DATA_CHANNEL_NONE = 0,
DATA_CHANNEL_STRING,
DATA_CHANNEL_BINARY,
} DataChannelType;
【说明】
枚举值 |
描述 |
|---|---|
DATA_CHANNEL_NONE |
无 DataChannel |
DATA_CHANNEL_STRING |
字符串类型数据 |
DATA_CHANNEL_BINARY |
二进制类型数据 |
DecpChannelType#
【描述】
DecpChannelType 用于配置 DataChannel 的可靠性和有序性策略,对应 DCEP(Data Channel Establishment Protocol)中的通道类型。
【定义】
typedef enum DecpChannelType {
DATA_CHANNEL_RELIABLE = 0x00,
DATA_CHANNEL_RELIABLE_UNORDERED = 0x80,
DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT = 0x01,
DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT_UNORDERED = 0x81,
DATA_CHANNEL_PARTIAL_RELIABLE_TIMED = 0x02,
DATA_CHANNEL_PARTIAL_RELIABLE_TIMED_UNORDERED = 0x82,
} DecpChannelType;
【说明】
枚举值 |
描述 |
|---|---|
DATA_CHANNEL_RELIABLE |
可靠有序传输 |
DATA_CHANNEL_RELIABLE_UNORDERED |
可靠无序传输 |
DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT |
部分可靠,按重传次数保证 |
DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT_UNORDERED |
部分可靠无序,按重传次数保证 |
DATA_CHANNEL_PARTIAL_RELIABLE_TIMED |
部分可靠,按超时时间保证 |
DATA_CHANNEL_PARTIAL_RELIABLE_TIMED_UNORDERED |
部分可靠无序,按超时时间保证 |
MediaCodec#
【描述】
MediaCodec 用于配置音视频的编码格式。
【定义】
typedef enum MediaCodec {
CODEC_NONE = 0,
/* Video */
CODEC_H264,
CODEC_H265,
CODEC_VP8, // not implemented yet
CODEC_MJPEG, // not implemented yet
/* Audio */
CODEC_OPUS,
CODEC_PCMA,
CODEC_PCMU,
} MediaCodec;
【说明】
枚举值 |
描述 |
|---|---|
CODEC_NONE |
无编码 |
CODEC_H264 |
H.264 视频编码 |
CODEC_H265 |
H.265 视频编码 |
CODEC_VP8 |
VP8 视频编码(未实现) |
CODEC_MJPEG |
MJPEG 视频编码(未实现) |
CODEC_OPUS |
OPUS 音频编码 |
CODEC_PCMA |
G711A 音频编码 |
CODEC_PCMU |
G711U 音频编码 |
IceServer#
【描述】
IceServer 用于配置 ICE(Interactive Connectivity Establishment)服务器信息,用于 NAT 穿越。
【定义】
typedef struct IceServer {
const char* urls;
const char* username;
const char* credential;
} IceServer;
【参数】
名称 |
类型 |
描述 |
|---|---|---|
urls |
const char* |
ICE 服务器 URL,如 “stun:stun.l.google.com:19302” |
username |
const char* |
TURN 服务器用户名,STUN 服务器可为 NULL |
credential |
const char* |
TURN 服务器凭据,STUN 服务器可为 NULL |
【示例】
IceServer server = {
.urls = "stun:stun.l.google.com:19302",
.username = NULL,
.credential = NULL
};
PeerConfiguration#
【描述】
PeerConfiguration 用于配置 PeerConnection 的参数,包括 ICE 服务器列表、音视频编码格式、DataChannel 类型以及音视频数据回调。
【定义】
typedef struct PeerConfiguration {
IceServer ice_servers[5];
MediaCodec audio_codec;
MediaCodec video_codec;
DataChannelType datachannel;
void (*onaudiotrack)(uint8_t* data, size_t size, void* userdata);
void (*onvideotrack)(uint8_t* data, size_t size, void* userdata);
void (*on_request_keyframe)(void* userdata);
void* user_data;
} PeerConfiguration;
【参数】
名称 |
类型 |
描述 |
|---|---|---|
ice_servers |
IceServer[5] |
ICE 服务器列表,最多 5 个 |
audio_codec |
MediaCodec |
音频编码格式 |
video_codec |
MediaCodec |
视频编码格式 |
datachannel |
DataChannelType |
DataChannel 数据类型 |
onaudiotrack |
函数指针 |
接收远端音频数据的回调函数 |
onvideotrack |
函数指针 |
接收远端视频数据的回调函数 |
on_request_keyframe |
函数指针 |
请求关键帧的回调函数 |
user_data |
void* |
传递给回调函数的用户数据指针 |
【示例】
PeerConfiguration config = {0};
config.ice_servers[0] = (IceServer){ "stun:stun.l.google.com:19302", NULL, NULL };
config.audio_codec = CODEC_PCMU;
config.video_codec = CODEC_H264;
config.datachannel = DATA_CHANNEL_NONE;
config.onaudiotrack = NULL;
config.onvideotrack = NULL;
config.on_request_keyframe = NULL;
config.user_data = NULL;
API 介绍#
peer_init#
【描述】
初始化 WebRTC 库,包括 libsrtp 和 SCTP 协议栈。在使用任何 PeerConnection 相关 API 之前必须调用此函数。
【定义】
int peer_init();
【参数】
无。
【返回值】
返回值 |
描述 |
|---|---|
0 |
成功 |
-1 |
失败,libsrtp 初始化失败 |
【示例】
if (peer_init() != 0) {
printf("WebRTC init failed\n");
return -1;
}
peer_deinit#
【描述】
反初始化 WebRTC 库,释放 libsrtp 和 SCTP 协议栈相关资源。
【定义】
void peer_deinit();
【参数】
无。
【返回值】
无。
【示例】
peer_deinit();
peer_connection_create#
【描述】
创建一个 PeerConnection 实例。
【定义】
PeerConnection* peer_connection_create(PeerConfiguration* config);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
config |
PeerConfiguration* |
PeerConnection 配置 |
【返回值】
返回值 |
描述 |
|---|---|
PeerConnection* |
成功,返回实例指针 |
NULL |
失败 |
【示例】
PeerConnection* pc = peer_connection_create(&config);
if (!pc) {
printf("Create peer connection failed\n");
return -1;
}
peer_connection_destroy#
【描述】
销毁 PeerConnection 实例,释放相关资源。
【定义】
void peer_connection_destroy(PeerConnection* pc);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
【返回值】
无。
【示例】
peer_connection_destroy(pc);
peer_connection_close#
【描述】
关闭 PeerConnection 连接,但不会释放资源。如需释放资源,请调用 peer_connection_destroy。
【定义】
void peer_connection_close(PeerConnection* pc);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
【返回值】
无。
peer_connection_get_state#
【描述】
获取 PeerConnection 的当前连接状态。
【定义】
PeerConnectionState peer_connection_get_state(PeerConnection* pc);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
【返回值】
返回值 |
描述 |
|---|---|
PeerConnectionState |
当前连接状态 |
【示例】
PeerConnectionState state = peer_connection_get_state(pc);
printf("Connection state: %s\n", peer_connection_state_to_string(state));
peer_connection_state_to_string#
【描述】
将 PeerConnectionState 枚举值转换为可读的字符串。
【定义】
const char* peer_connection_state_to_string(PeerConnectionState state);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
state |
PeerConnectionState |
连接状态枚举 |
【返回值】
返回值 |
描述 |
|---|---|
const char* |
状态对应的字符串描述 |
peer_connection_create_offer#
【描述】
创建 SDP Offer,用于发起 WebRTC 连接。通常由呼叫方调用。
【定义】
const char* peer_connection_create_offer(PeerConnection* pc);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
【返回值】
返回值 |
描述 |
|---|---|
const char* |
SDP Offer 字符串 |
NULL |
失败 |
【示例】
const char* offer = peer_connection_create_offer(pc);
if (offer) {
printf("SDP Offer:\n%s\n", offer);
}
peer_connection_create_answer#
【描述】
创建 SDP Answer,用于应答 WebRTC 连接。通常由应答方在收到 Offer 后调用。
【定义】
const char* peer_connection_create_answer(PeerConnection* pc);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
【返回值】
返回值 |
描述 |
|---|---|
const char* |
SDP Answer 字符串 |
NULL |
失败 |
peer_connection_set_local_description#
【描述】
设置本地 SDP 描述。
【定义】
void peer_connection_set_local_description(PeerConnection* pc, const char* sdp, SdpType sdp_type);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
sdp |
const char* |
SDP 字符串 |
sdp_type |
SdpType |
SDP 类型(Offer 或 Answer) |
【返回值】
无。
peer_connection_set_remote_description#
【描述】
设置远端 SDP 描述。
【定义】
void peer_connection_set_remote_description(PeerConnection* pc, const char* sdp, SdpType sdp_type);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
sdp |
const char* |
远端 SDP 字符串 |
sdp_type |
SdpType |
SDP 类型(Offer 或 Answer) |
【返回值】
无。
【示例】
// 应答方收到 Offer 后设置远端描述
peer_connection_set_remote_description(pc, remote_offer_sdp, SDP_TYPE_OFFER);
// 创建 Answer
const char* answer = peer_connection_create_answer(pc);
// 设置本地描述
peer_connection_set_local_description(pc, answer, SDP_TYPE_ANSWER);
peer_connection_add_ice_candidate#
【描述】
添加远端 ICE 候选者到 PeerConnection 中。
【定义】
int peer_connection_add_ice_candidate(PeerConnection* pc, char* ice_candidate);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
ice_candidate |
char* |
ICE 候选者字符串 |
【返回值】
返回值 |
描述 |
|---|---|
0 |
成功 |
-1 |
失败 |
peer_connection_onicecandidate#
【描述】
注册 ICE 候选者事件回调函数。当本地 ICE 候选者被发现时,将触发此回调,回调参数中包含完整的 SDP 文本。
【定义】
void peer_connection_onicecandidate(PeerConnection* pc, void (*onicecandidate)(char* sdp_text, void* userdata));
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
onicecandidate |
函数指针 |
ICE 候选者回调函数 |
回调函数参数:
参数 |
类型 |
描述 |
|---|---|---|
sdp_text |
char* |
包含 ICE 候选者的 SDP 文本 |
peer_connection_oniceconnectionstatechange#
【描述】
注册 ICE 连接状态变化事件回调函数。当 ICE 连接状态发生改变时,将触发此回调。
【定义】
void peer_connection_oniceconnectionstatechange(PeerConnection* pc,
void (*oniceconnectionstatechange)(PeerConnectionState state, void* userdata));
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
oniceconnectionstatechange |
函数指针 |
ICE 连接状态变化回调函数 |
回调函数参数:
参数 |
类型 |
描述 |
|---|---|---|
state |
PeerConnectionState |
当前连接状态 |
【示例】
void on_ice_state_change(PeerConnectionState state, void* userdata) {
printf("ICE state: %s\n", peer_connection_state_to_string(state));
}
peer_connection_oniceconnectionstatechange(pc, on_ice_state_change);
peer_connection_on_receiver_packet_loss#
【描述】
注册 RTCP 接收端丢包率回调函数。当收到 RTCP 接收报告时,将触发此回调。
【定义】
void peer_connection_on_receiver_packet_loss(PeerConnection* pc,
void (*on_receiver_packet_loss)(float fraction_loss, uint32_t total_loss, void* userdata));
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
on_receiver_packet_loss |
函数指针 |
丢包率回调函数 |
回调函数参数:
参数 |
类型 |
描述 |
|---|---|---|
fraction_loss |
float |
丢包率(0.0~1.0) |
total_loss |
uint32_t |
累计丢包数 |
peer_connection_send_video#
【描述】
通过 PeerConnection 发送视频帧数据。
【定义】
int peer_connection_send_video(PeerConnection* pc, const uint8_t* packet, size_t bytes, uint64_t timestamp_us);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
packet |
const uint8_t* |
视频帧数据指针(NAL 单元) |
bytes |
size_t |
视频帧数据大小(字节) |
timestamp_us |
uint64_t |
时间戳(微秒) |
【返回值】
返回值 |
描述 |
|---|---|
0 |
成功 |
-1 |
失败 |
【示例】
peer_connection_send_video(pc, nal_data, nal_size, timestamp_us);
peer_connection_send_audio#
【描述】
通过 PeerConnection 发送音频帧数据。
【定义】
int peer_connection_send_audio(PeerConnection* pc, const uint8_t* packet, size_t bytes, uint64_t timestamp_us);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
packet |
const uint8_t* |
音频帧数据指针(G711 或 OPUS 编码帧) |
bytes |
size_t |
音频帧数据大小(字节) |
timestamp_us |
uint64_t |
时间戳(微秒) |
【返回值】
返回值 |
描述 |
|---|---|
0 |
成功 |
-1 |
失败 |
【示例】
peer_connection_send_audio(pc, g711_frame, frame_size, timestamp_us);
peer_connection_create_datachannel#
【描述】
创建 DataChannel 通道。
【定义】
int peer_connection_create_datachannel(PeerConnection* pc, DecpChannelType channel_type,
uint16_t priority, uint32_t reliability_parameter, char* label, char* protocol);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
channel_type |
DecpChannelType |
通道可靠性和有序性策略 |
priority |
uint16_t |
通道优先级 |
reliability_parameter |
uint32_t |
可靠性参数(重传次数或超时时间,取决于 channel_type) |
label |
char* |
通道标签名称 |
protocol |
char* |
子协议名称,可为空字符串 |
【返回值】
返回值 |
描述 |
|---|---|
0 |
成功 |
-1 |
失败 |
【示例】
// 创建可靠有序的 DataChannel
peer_connection_create_datachannel(pc, DATA_CHANNEL_RELIABLE, 0, 0, "my_channel", "");
peer_connection_create_datachannel_sid#
【描述】
创建指定 Stream ID 的 DataChannel 通道。
【定义】
int peer_connection_create_datachannel_sid(PeerConnection* pc, DecpChannelType channel_type,
uint16_t priority, uint32_t reliability_parameter, char* label, char* protocol, uint16_t sid);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
channel_type |
DecpChannelType |
通道可靠性和有序性策略 |
priority |
uint16_t |
通道优先级 |
reliability_parameter |
uint32_t |
可靠性参数 |
label |
char* |
通道标签名称 |
protocol |
char* |
子协议名称 |
sid |
uint16_t |
指定的 Stream ID |
【返回值】
返回值 |
描述 |
|---|---|
0 |
成功 |
-1 |
失败 |
peer_connection_datachannel_send#
【描述】
通过 DataChannel 发送文本消息。
【定义】
int peer_connection_datachannel_send(PeerConnection* pc, char* message, size_t len);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
message |
char* |
消息内容 |
len |
size_t |
消息长度 |
【返回值】
返回值 |
描述 |
|---|---|
0 |
成功 |
-1 |
失败 |
peer_connection_datachannel_send_sid#
【描述】
通过指定 Stream ID 的 DataChannel 发送文本消息。
【定义】
int peer_connection_datachannel_send_sid(PeerConnection* pc, char* message, size_t len, uint16_t sid);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
message |
char* |
消息内容 |
len |
size_t |
消息长度 |
sid |
uint16_t |
Stream ID |
【返回值】
返回值 |
描述 |
|---|---|
0 |
成功 |
-1 |
失败 |
peer_connection_datachannel_send_binary#
【描述】
通过 DataChannel 发送二进制数据(PPID=53)。
【定义】
int peer_connection_datachannel_send_binary(PeerConnection* pc, const char* data, size_t len);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
data |
const char* |
二进制数据指针 |
len |
size_t |
数据长度 |
【返回值】
返回值 |
描述 |
|---|---|
0 |
成功 |
-1 |
失败 |
peer_connection_datachannel_send_binary_sid#
【描述】
通过指定 Stream ID 的 DataChannel 发送二进制数据(PPID=53)。
【定义】
int peer_connection_datachannel_send_binary_sid(PeerConnection* pc, const char* data, size_t len, uint16_t sid);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
data |
const char* |
二进制数据指针 |
len |
size_t |
数据长度 |
sid |
uint16_t |
Stream ID |
【返回值】
返回值 |
描述 |
|---|---|
0 |
成功 |
-1 |
失败 |
peer_connection_ondatachannel#
【描述】
注册 DataChannel 事件回调函数,包括消息接收、通道打开和通道关闭事件。
【定义】
void peer_connection_ondatachannel(PeerConnection* pc,
void (*onmessage)(char* msg, size_t len, void* userdata, uint16_t sid),
void (*onopen)(void* userdata),
void (*onclose)(void* userdata));
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
onmessage |
函数指针 |
消息接收回调函数 |
onopen |
函数指针 |
通道打开回调函数 |
onclose |
函数指针 |
通道关闭回调函数 |
onmessage 回调参数:
参数 |
类型 |
描述 |
|---|---|---|
msg |
char* |
消息内容 |
len |
size_t |
消息长度 |
sid |
uint16_t |
Stream ID |
【示例】
void on_dc_message(char* msg, size_t len, void* userdata, uint16_t sid) {
printf("DataChannel message (sid=%u): %.*s\n", sid, (int)len, msg);
}
void on_dc_open(void* userdata) {
printf("DataChannel opened\n");
}
void on_dc_close(void* userdata) {
printf("DataChannel closed\n");
}
peer_connection_ondatachannel(pc, on_dc_message, on_dc_open, on_dc_close);
peer_connection_lookup_sid#
【描述】
通过通道标签名称查找对应的 Stream ID。
【定义】
int peer_connection_lookup_sid(PeerConnection* pc, const char* label, uint16_t* sid);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
label |
const char* |
通道标签名称 |
sid |
uint16_t* |
输出:找到的 Stream ID |
【返回值】
返回值 |
描述 |
|---|---|
0 |
成功找到 |
-1 |
未找到 |
peer_connection_lookup_sid_label#
【描述】
通过 Stream ID 查找对应的通道标签名称。
【定义】
char* peer_connection_lookup_sid_label(PeerConnection* pc, uint16_t sid);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
sid |
uint16_t |
Stream ID |
【返回值】
返回值 |
描述 |
|---|---|
char* |
通道标签名称字符串 |
NULL |
未找到 |
peer_connection_loop#
【描述】
运行 PeerConnection 事件循环,处理 ICE、DTLS 等底层事件。通常在单独的线程中循环调用。
【定义】
int peer_connection_loop(PeerConnection* pc);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
【返回值】
返回值 |
描述 |
|---|---|
0 |
正常退出 |
-1 |
错误 |
peer_connection_get_sctp#
【描述】
获取 PeerConnection 关联的 SCTP 实例指针。
【定义】
void* peer_connection_get_sctp(PeerConnection* pc);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
pc |
PeerConnection* |
PeerConnection 实例 |
【返回值】
返回值 |
描述 |
|---|---|
void* |
SCTP 实例指针 |
NULL |
无 SCTP 实例 |
信令 API 介绍#
peer_signaling_connect#
【描述】
连接信令服务器,建立信令通道。支持 HTTP 和 MQTT 两种信令协议。
【定义】
int peer_signaling_connect(const char* url, const char* token, PeerConnection* pc);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
url |
const char* |
信令服务器 URL |
token |
const char* |
认证令牌,可为 NULL |
pc |
PeerConnection* |
关联的 PeerConnection 实例 |
【返回值】
返回值 |
描述 |
|---|---|
0 |
成功 |
-1 |
失败 |
【示例】
int ret = peer_signaling_connect("http://192.168.1.100:8080", NULL, pc);
if (ret != 0) {
printf("Signaling connect failed\n");
}
peer_signaling_disconnect#
【描述】
断开信令服务器连接。
【定义】
void peer_signaling_disconnect();
【参数】
无。
【返回值】
无。
peer_signaling_loop#
【描述】
运行信令事件循环,处理信令消息。通常在单独的线程中循环调用。
【定义】
int peer_signaling_loop();
【参数】
无。
【返回值】
返回值 |
描述 |
|---|---|
0 |
正常退出 |
-1 |
错误 |
peer_signaling_set_custom_rpc_handler#
【描述】
注册自定义 RPC 方法处理回调,用于处理信令层不识别的应用层 RPC 方法。必须在 peer_signaling_connect 之后调用。同一时间只能注册一个处理器,后续调用会替换之前的。
【定义】
void peer_signaling_set_custom_rpc_handler(peer_signaling_custom_rpc_cb cb, void* userdata);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
cb |
peer_signaling_custom_rpc_cb |
自定义 RPC 方法处理回调函数 |
userdata |
void* |
传递给回调函数的用户数据指针 |
回调函数签名:
typedef int (*peer_signaling_custom_rpc_cb)(const char* method, cJSON* params, int id,
cJSON** result, cJSON** error, void* userdata);
回调参数说明:
参数 |
类型 |
描述 |
|---|---|---|
method |
const char* |
RPC 方法名称 |
params |
cJSON* |
请求参数 JSON 对象,可能为 NULL |
id |
int |
JSON-RPC 请求 ID |
result |
cJSON** |
输出:设置结果 JSON 对象(调用方获取所有权) |
error |
cJSON** |
输出:设置错误 JSON 对象(调用方获取所有权) |
userdata |
void* |
用户数据指针 |
回调返回值:
返回值 |
描述 |
|---|---|
0 |
方法已处理(必须设置 result 或 error) |
-1 |
方法未处理(信令层将返回 METHOD_NOT_FOUND) |
peer_signaling_publish#
【描述】
通过信令层的 MQTT 连接向指定主题发布消息。仅在 MQTT 模式(proto == 0)下有效,HTTP 模式或 MQTT 连接未建立时返回 -1。
【定义】
int peer_signaling_publish(const char* topic, const char* message);
【参数】
名称 |
类型 |
描述 |
|---|---|---|
topic |
const char* |
MQTT 主题,如 “/devices/heartbeat” |
message |
const char* |
消息内容(JSON 字符串) |
【返回值】
返回值 |
描述 |
|---|---|
0 |
成功 |
-1 |
失败,HTTP 模式或 MQTT 连接未建立 |
示例#
以下示例使用 C++ 编写,演示了 libpeer C API 在 C++ 项目中的典型用法。事件循环使用 std::thread 运行在独立线程中。
#include "peer.h"
#include "peer_connection.h"
#include "peer_signaling.h"
#include <stdio.h>
#include <string.h>
#include <thread>
static int running = 1;
void on_ice_candidate(char* sdp_text, void* userdata) {
printf("ICE candidate found\n");
}
void on_ice_state_change(PeerConnectionState state, void* userdata) {
printf("ICE state: %s\n", peer_connection_state_to_string(state));
}
void on_dc_message(char* msg, size_t len, void* userdata, uint16_t sid) {
printf("DataChannel message: %.*s\n", (int)len, msg);
}
void on_dc_open(void* userdata) {
printf("DataChannel opened\n");
}
void on_dc_close(void* userdata) {
printf("DataChannel closed\n");
}
int main()
{
// 初始化 WebRTC 库
if (peer_init() != 0) {
printf("WebRTC init failed\n");
return -1;
}
// 配置 PeerConnection
PeerConfiguration config = {0};
config.ice_servers[0] = (IceServer){ "stun:stun.l.google.com:19302", NULL, NULL };
config.audio_codec = CODEC_PCMU;
config.video_codec = CODEC_H264;
config.datachannel = DATA_CHANNEL_STRING;
// 创建 PeerConnection
PeerConnection* pc = peer_connection_create(&config);
if (!pc) {
printf("Create peer connection failed\n");
peer_deinit();
return -1;
}
// 注册回调
peer_connection_onicecandidate(pc, on_ice_candidate);
peer_connection_oniceconnectionstatechange(pc, on_ice_state_change);
peer_connection_ondatachannel(pc, on_dc_message, on_dc_open, on_dc_close);
// 创建 DataChannel
peer_connection_create_datachannel(pc, DATA_CHANNEL_RELIABLE, 0, 0, "chat", "");
// 连接信令服务器
peer_signaling_connect("http://192.168.1.100:8080", NULL, pc);
// 在单独线程中运行事件循环
std::thread loop_thread([&]() {
while (running) {
peer_connection_loop(pc);
peer_signaling_loop();
}
});
// 推流循环
while (running) {
// 获取视频帧数据 video_data, video_size, video_timestamp
peer_connection_send_video(pc, video_data, video_size, video_timestamp_us);
// 获取音频帧数据 audio_data, audio_size, audio_timestamp
peer_connection_send_audio(pc, audio_data, audio_size, audio_timestamp_us);
}
// 清理
running = 0;
loop_thread.join();
peer_signaling_disconnect();
peer_connection_destroy(pc);
peer_deinit();
return 0;
}
上述代码需要在 k230 linux sdk 环境下使用编译工具编译成 elf 可执行文件,然后拷贝到开发板运行。
