注意

这是最新开发分支配套的文档,可能包含已发布版本中尚未提供的功能。如果您要查看特定版本的文档,请使用左侧的下拉菜单并选择所需要的版本。

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 可执行文件,然后拷贝到开发板运行。

评论列表
条评论
登录