C API 参考
这页是 C SDK 的 API 详细使用说明,收录公开类型、回调、函数、宏、参数、返回值和生命周期规则。
调用顺序
| 阶段 | 接口 | 说明 |
|---|---|---|
| 配置 | TiRtcSetOption() | 在 TiRtcStart() 前设置。TIRTC_OPT_MAX_SEND_BUFFER 必须在 TiRtcInit() 前设置才生效。 |
| 初始化 | TiRtcInit() | 初始化进程级 SDK 运行时。 |
| 启动 | TiRtcStart() | 启动 SDK。返回 0 只表示启动请求已提交,真正启动完成以 TIRTC_EVENT_SYS_STARTED 为准。 |
| 使用 | TiRtcConnect() / 回调 / 发送接口 | 连接建立后收发媒体、流内消息和命令。 |
| 停止 | TiRtcStop() | 停止 SDK。完成后通过 TIRTC_EVENT_SYS_STOPPED 通知。 |
| 释放 | TiRtcUninit() | 释放 SDK 运行时资源。 |
典型顺序:
TiRtcSetOption(TIRTC_OPT_MAX_SEND_BUFFER, &max_send_buffer, sizeof(max_send_buffer));
TiRtcInit();
TiRtcSetOption(TIRTC_OPT_DEVICE_SECRET_KEY, device_secret_key, strlen(device_secret_key));
TiRtcStart(device_id, &callbacks);
/* 建连、收发媒体和命令 */
TiRtcStop();
TiRtcUninit();错误码
错误码详情也可见错误码说明。
| 常量 | 值 | 含义 |
|---|---|---|
TIRTC_E_NOT_INITIALIZED | -40001 | 未初始化,需先调用 TiRtcInit() |
TIRTC_E_INVALID_HANDLE | -40002 | 连接无效 |
TIRTC_E_INVALID_PARAMETER | -40003 | 参数无效 |
TIRTC_E_INVALID_LICENSE | -40004 | 设备身份参数无效 |
TIRTC_E_TIMEOUTED | -40005 | 操作超时 |
TIRTC_E_BUSY | -40006 | 网络忙或发送缓冲区满 |
TIRTC_E_CONN_TIMEOUTCLOSE | -40007 | 连接因心跳超时关闭 |
TIRTC_E_CONN_REMOTECLOSE | -40008 | 连接被远端主动关闭 |
TIRTC_E_CONN_OTHER_ERROR | -40009 | 其他连接错误 |
TIRTC_E_LACK_OF_RESOURCE | -40010 | 资源不足,包含内存不足 |
TIRTC_E_CACHE_EXPIRED | -40011 | 连接参数缓存过期,需重新传入有效 token |
TIRTC_E_SERVER_ERROR | -40012 | 服务器端错误 |
TIRTC_E_INTERNAL_ERROR | -40013 | SDK 内部错误 |
TIRTC_E_NO_SECRET_KEY | -40014 | 未设置 device_secret_key |
TIRTC_E_UNEXPECTED_RESPONSE | -40015 | 服务器响应格式非预期 |
基础类型
tirtc_conn_t
typedef struct _tirtc_conn *tirtc_conn_t;表示一条点对点连接。
- 其他端连接到本端时,通过
TIRTCCALLBACKS.on_conn_accepted传出。 - 主动连接通过
TIRTCCONNECTCALLBACK传出。 on_disconnected回调返回后,这个连接对象由 SDK 自动释放。TiRtcDisconnect()返回后,就应把该连接对象视为不可再用;如果你的业务需要等 SDK 内部释放完成,再等on_disconnected回调。
TIRTCNETCONN
typedef enum {
TIRTC_NETCONN_WIFI = 0,
TIRTC_NETCONN_4G
} TIRTCNETCONN;| 取值 | 说明 |
|---|---|
TIRTC_NETCONN_WIFI | Wi-Fi,默认值 |
TIRTC_NETCONN_4G | 运营商数据网络;使用时需要设置 TIRTC_OPT_ICCID |
TIRTCOPTION
TiRtcSetOption() 使用的配置项。如无特别说明,配置项应在 TiRtcStart() 前设置。
| 配置项 | data 类型 | 调用时机与说明 |
|---|---|---|
TIRTC_OPT_SERVICE_ENDPOINT | const char * | 服务入口地址。不设置时使用默认入口。 |
TIRTC_OPT_DEVICE_SECRET_KEY | const char * | 设置 device_secret_key。需要允许其他端连接到本端时,先设置该选项,再用 device_id 启动。不要把 device_secret_key 写进日志、截图或客户端代码。 |
TIRTC_OPT_MAX_CONNECTIONS | int * | 最大连接数,主要用于资源受限的系统。 |
TIRTC_OPT_NETWORK_TYPE | int * | 联网方式,值见 TIRTCNETCONN。默认 TIRTC_NETCONN_WIFI。 |
TIRTC_OPT_ICCID | const char * | 4G SIM 卡 ICCID。TIRTC_OPT_NETWORK_TYPE 为 TIRTC_NETCONN_4G 时必填。 |
TIRTC_OPT_WAKEUP | int * | 是否支持休眠唤醒。0 关闭,1 开启,默认 0。 |
TIRTC_OPT_RESTRICTED_NETWORK | int * | 是否受限网络。0 关闭,1 开启,默认 0。 |
TIRTC_OPT_MAX_SEND_BUFFER | uint32_t * | 发送缓冲区大小,单位字节。必须在 TiRtcInit() 前设置才生效。默认普通版 512 KB,CONFIG_SMALL_MEMORY 下 100 KB。 |
TIRTC_OPT_CONNECT_CACHE | int * | 是否开启连接参数缓存。0 关闭,1 开启,默认 1。 |
开启 TIRTC_OPT_CONNECT_CACHE 后,TiRtcConnect() 成功时会按 remote_id 缓存服务器返回的连接参数。缓存有效期由服务器返回;有效期内再次连接同一 remote_id 时,token 可传 NULL。缓存未命中或过期时,TiRtcConnect() 返回 TIRTC_E_CACHE_EXPIRED。
TIRTCMEDIA
TIRTCFRAMEINFO.media 使用的媒体类型。
typedef enum TIRTCMEDIA {
TIRTC_MEDIA_MESSAGE = 0,
TIRTC_AUDIO_MIN = 1,
TIRTC_AUDIO_PCM = TIRTC_AUDIO_MIN,
TIRTC_AUDIO_ALAW = 2,
TIRTC_AUDIO_AAC = 3,
TIRTC_AUDIO_OPUS = 4,
TIRTC_AUDIO_MAX = 64,
TIRTC_VIDEO_MIN = 65,
TIRTC_VIDEO_JPEG = TIRTC_VIDEO_MIN,
TIRTC_VIDEO_H264 = 66,
TIRTC_VIDEO_H265 = 67,
TIRTC_VIDEO_MAX = 127
} TIRTCMEDIA;| 取值 | 说明 |
|---|---|
TIRTC_MEDIA_MESSAGE | 流内消息 |
TIRTC_AUDIO_PCM | PCM 原始音频 |
TIRTC_AUDIO_ALAW | G.711 A-law |
TIRTC_AUDIO_AAC | AAC 压缩音频 |
TIRTC_AUDIO_OPUS | Opus 压缩音频 |
TIRTC_VIDEO_JPEG | JPEG 图像帧 |
TIRTC_VIDEO_H264 | H.264 视频帧 |
TIRTC_VIDEO_H265 | H.265 视频帧 |
相关宏:
#define TIRTC_IS_AUDIO(mt) ((mt) >= TIRTC_AUDIO_MIN && (mt) <= TIRTC_AUDIO_MAX)
#define TIRTC_IS_VIDEO(mt) ((mt) >= TIRTC_VIDEO_MIN && (mt) <= TIRTC_VIDEO_MAX)TIRTCAUDIOSAMPLE
音频采样规格,填入音频帧的 TIRTCFRAMEINFO.flags。
| 取值 | 说明 |
|---|---|
TIRTC_AUDIOSAMPLE_8K16B1C | 8 kHz、16 bit、单声道 |
TIRTC_AUDIOSAMPLE_16K16B1C | 16 kHz、16 bit、单声道 |
TIRTC_AUDIOSAMPLE_8K16B2C | 8 kHz、16 bit、双声道 |
TIRTC_AUDIOSAMPLE_16K16B2C | 16 kHz、16 bit、双声道 |
TIRTCFRAMEINFO
typedef struct TIRTCFRAMEINFO {
uint8_t stream_id;
uint8_t media;
uint8_t flags;
uint8_t reserved;
uint32_t ts;
uint32_t length;
} TIRTCFRAMEINFO;| 字段 | 说明 |
|---|---|
stream_id | 流 ID。取值 0 到 15,同一连接内音频和视频不能共用同一个 stream_id。 |
media | 媒体类型,取值见 TIRTCMEDIA。 |
flags | 视频帧最低位表示关键帧;音频帧填 TIRTCAUDIOSAMPLE。 |
reserved | 预留字段,当前填 0。 |
ts | 时间戳,单位毫秒。 |
length | 数据长度,单位字节,不含帧头自身。 |
视频关键帧相关宏:
#define TIRTC_FRAME_FLAG_KEY_FRAME 0x01
#define TIRTC_IS_KEY_FRAME(flags) ((flags) & TIRTC_FRAME_FLAG_KEY_FRAME)同一连接内,音频和视频不能复用同一个 stream_id。发送视频时,每路视频流的第一帧必须是关键帧;发送音频时,flags 填 TIRTCAUDIOSAMPLE 取值。
TIRTCSYSEVENT
TIRTCCALLBACKS.on_event 使用的系统事件。
| 取值 | 说明 |
|---|---|
TIRTC_EVENT_SYS_STARTED | SDK 成功启动 |
TIRTC_EVENT_SYS_STOPPED | SDK 已停止 |
TIRTC_EVENT_ACCESS_HIJACKING | HTTP 请求被重定向,可能遭受中间人攻击 |
回调
TIRTCCALLBACKS
typedef struct TIRTCCALLBACKS {
void (*on_event)(int event, const void *data, int len);
void (*on_conn_accepted)(tirtc_conn_t hconn);
void (*on_conn_error)(tirtc_conn_t hconn, int error);
void (*on_disconnected)(tirtc_conn_t hconn);
void (*on_audio)(tirtc_conn_t hconn, const TIRTCFRAMEINFO *pFi, void *data);
void (*on_video)(tirtc_conn_t hconn, const TIRTCFRAMEINFO *pFi, void *data);
void (*on_message)(tirtc_conn_t hconn, const TIRTCFRAMEINFO *pFi, void *data);
void (*on_command)(tirtc_conn_t hconn, uint32_t cmdw, const void *data, uint32_t len);
void (*on_request_key_frame)(tirtc_conn_t hconn, uint8_t stream_id);
int (*on_subscribe_video)(tirtc_conn_t hconn, uint8_t stream_id);
void (*on_unsubscribe_video)(tirtc_conn_t hconn, uint8_t stream_id);
int (*on_subscribe_audio)(tirtc_conn_t hconn, uint8_t stream_id);
void (*on_unsubscribe_audio)(tirtc_conn_t hconn, uint8_t stream_id);
} TIRTCCALLBACKS;C SDK 通过这个结构体向应用通知连接事件、媒体帧、命令和内部事件。
- 所有回调都在 SDK 自己的线程执行。回调里只做轻量处理;如果要写文件、解码、编码、访问网络或等待锁,先把数据复制到业务线程。
TIRTCCALLBACKS结构体和其中的函数指针生命周期必须覆盖整个 SDK 运行期,不能指向临时栈变量。- 回调里的
data指针只在当前回调内有效;需要跨线程使用时,先自行复制。
| 回调 | 触发时机 | 使用约束 |
|---|---|---|
on_event | SDK 内部事件。event 取值见 TIRTCSYSEVENT。 | data 可为 NULL,长度由 len 给出。 |
on_conn_accepted | 其他端已经连接到本端。 | hconn 可立即用于发送媒体或命令。 |
on_conn_error | 连接出现错误。 | 出现后该连接上的收发不再有效;应在回调外调用 TiRtcDisconnect() 释放资源。 |
on_disconnected | TiRtcDisconnect() 内部操作完成。 | 回调返回后连接对象由 SDK 自动释放。只有业务需要等待 SDK 释放完成时才实现它。 |
on_audio | 收到对端音频帧。 | data 回调返回后失效。 |
on_video | 收到对端视频帧。 | data 回调返回后失效。 |
on_message | 收到对端流内消息。 | 对应 media == TIRTC_MEDIA_MESSAGE。 |
on_command | 收到对端命令通道数据。 | cmdw 是原始命令字,格式见命令通道章节。 |
on_request_key_frame | 对端请求在指定流上立即发送关键帧。 | 下一帧应输出关键帧。 |
on_subscribe_video | 对端请求开始发送指定视频流。 | 返回 0 表示接受,非 0 表示拒绝。 |
on_unsubscribe_video | 对端请求停止发送指定视频流。 | 停止对应视频流发送。 |
on_subscribe_audio | 对端请求开始发送指定音频流。 | 返回 0 表示接受,非 0 表示拒绝。 |
on_unsubscribe_audio | 对端请求停止发送指定音频流。 | 停止对应音频流发送。 |
不要在 on_conn_error 中直接调用 TiRtcDisconnect()。把连接对象放入业务线程或事件循环,再在回调外断开。
TIRTCCONNECTCALLBACK
typedef void (*TIRTCCONNECTCALLBACK)(int error, tirtc_conn_t hconn, void *user_data);TiRtcConnect() 和 WHIP 连接接口的异步结果回调。
| 参数 | 说明 |
|---|---|
error | 0 表示连接成功;非 0 为错误码。 |
hconn | 连接成功时为有效连接对象;失败时为 NULL。 |
user_data | 调用连接接口时传入的用户上下文指针。 |
TIRTCLOGCALLBACK
typedef void (*TIRTCLOGCALLBACK)(const char *log, uint32_t length);日志输出回调。log 不是以 \0 结尾的字符串,读取时以 length 为准。
TIRTCWHIPSERVERONSDPREADYCB
typedef void (*TIRTCWHIPSERVERONSDPREADYCB)(const char *sdp, int len, void *user);WHIP 服务端 answer SDP 就绪回调。
| 参数 | 说明 |
|---|---|
sdp | answer SDP 字符串。 |
len | SDP 长度,单位字节。 |
user | TiRtcWhipAccept() 传入的用户数据指针。 |
禁止在此回调中阻塞。
生命周期
TiRtcGetVersion
const char *TiRtcGetVersion(void);返回 SDK 版本字符串。
| 返回值 | 说明 |
|---|---|
const char * | 静态存储的版本字符串,无需释放。 |
TiRtcGetErrorStr
const char *TiRtcGetErrorStr(int error);把错误码转换为可读字符串。
| 参数 | 说明 |
|---|---|
error | TiRTC 错误码,或 0。 |
| 返回值 | 说明 |
|---|---|
const char * | 静态字符串。0 返回 OK,未知错误码返回未知码说明。 |
TiRtcInit
int TiRtcInit(void);初始化 SDK 运行时。必须在 TiRtcStart() 前调用。
| 返回值 | 说明 |
|---|---|
0 | 成功 |
| 负数 | 错误码 |
TIRTC_OPT_MAX_SEND_BUFFER 必须在 TiRtcInit() 前设置才生效。
TiRtcUninit
void TiRtcUninit(void);释放 SDK 运行时资源。通常在 TiRtcStop() 完成后调用。
TiRtcSetOption
int TiRtcSetOption(TIRTCOPTION opt, const void *data, uint32_t len);设置全局配置项。
| 参数 | 说明 |
|---|---|
opt | 配置项,取值见 TIRTCOPTION。 |
data | 配置数据指针,类型与具体配置项有关。 |
len | data 指向的数据长度,单位字节。 |
| 返回值 | 说明 |
|---|---|
0 | 成功 |
TIRTC_E_INVALID_PARAMETER | opt 或 data 非法 |
| 其他负数 | 错误码 |
TiRtcStart
int TiRtcStart(const char *identity, const TIRTCCALLBACKS *cbs);启动 SDK。
| 参数 | 说明 |
|---|---|
identity | 启动身份参数,或 NULL。 |
cbs | 回调结构体指针,生命周期要求见 TIRTCCALLBACKS。 |
启动身份参数支持两种推荐用法:
| 传值 | 作用 |
|---|---|
NULL | 只允许本端主动连接其他端,不允许其他端连接到本端。 |
"<device_id>" | 允许其他端连接到本端。调用前先通过 TiRtcSetOption(TIRTC_OPT_DEVICE_SECRET_KEY, ...) 设置 device_secret_key。 |
| 返回值 | 说明 |
|---|---|
0 | 启动请求已提交;实际启动结果通过 cbs->on_event(TIRTC_EVENT_SYS_STARTED, ...) 通知。 |
| 负数 | 错误码 |
TiRtcStop
int TiRtcStop(void);停止 SDK。
| 返回值 | 说明 |
|---|---|
0 | 停止请求已提交或处理成功。完成后通过 TIRTC_EVENT_SYS_STOPPED 通知。 |
| 负数 | 错误码 |
连接管理
TiRtcConnect
int TiRtcConnect(const char *remote_id,
const char *token,
TIRTCCONNECTCALLBACK cb,
void *user_data);主动发起 P2P 连接。
| 参数 | 说明 |
|---|---|
remote_id | 目标标识。具体取值应和服务端签发 token 时绑定的目标一致;连接某台设备时通常等于目标 device_id。 |
token | 你的业务服务端签发的连接授权凭证。首次连接应传有效 token。 |
cb | 连接结果回调,不能为 NULL。 |
user_data | 原样传给 cb 的用户上下文指针。 |
| 返回值 | 说明 |
|---|---|
0 | 连接请求已提交,最终结果通过 cb 通知。 |
TIRTC_E_CACHE_EXPIRED | 缓存已过期,需重新获取并传入有效 token。 |
| 其他负数 | 错误码 |
token 是一次性的,不要重复使用。开启连接参数缓存后,SDK 会缓存成功连接时服务器返回的连接参数;缓存有效期内再次连接同一 remote_id 时,token 可传 NULL。
TiRtcDisconnect
int TiRtcDisconnect(tirtc_conn_t hconn);主动断开连接。
| 参数 | 说明 |
|---|---|
hconn | 连接对象。 |
| 返回值 | 说明 |
|---|---|
0 | 成功提交断开操作。 |
TIRTC_E_INVALID_HANDLE | 连接对象无效。 |
| 其他负数 | 错误码 |
这是异步操作,不会阻塞到 SDK 内部彻底释放完成。调用返回后即认为 hconn 不再有效,不应再对它执行任何操作。若需与 SDK 内部释放同步,可在 on_disconnected() 回调中处理。
TiRtcGetSendBufferUsed
size_t TiRtcGetSendBufferUsed(tirtc_conn_t hconn);返回连接当前发送缓冲区已使用字节数。可与 TIRTC_OPT_MAX_SEND_BUFFER 设置的上限对比,用于判断是否需要丢帧或限流。
| 参数 | 说明 |
|---|---|
hconn | 连接对象。 |
| 返回值 | 说明 |
|---|---|
size_t | 已使用字节数;hconn 无效时返回 0。 |
TiRtcConnSetUserData
int TiRtcConnSetUserData(tirtc_conn_t hconn, void *user_data);把用户数据指针关联到连接。
| 参数 | 说明 |
|---|---|
hconn | 连接对象。 |
user_data | 用户数据指针,可通过 TiRtcConnGetUserData() 取回。 |
| 返回值 | 说明 |
|---|---|
0 | 成功 |
TIRTC_E_INVALID_HANDLE | 连接对象无效 |
TiRtcConnGetUserData
void *TiRtcConnGetUserData(tirtc_conn_t hconn);取回由 TiRtcConnSetUserData() 关联的用户数据指针。
| 参数 | 说明 |
|---|---|
hconn | 连接对象。 |
| 返回值 | 说明 |
|---|---|
void * | 用户数据指针;hconn 无效时返回 NULL。 |
媒体发送
TiRtcSendMessageStream
int TiRtcSendMessageStream(tirtc_conn_t hconn,
const TIRTCFRAMEINFO *pFi,
const void *frame);通用的音频、视频和流内消息发送接口。线程安全,支持多线程并发调用。
| 参数 | 说明 |
|---|---|
hconn | 连接对象。 |
pFi | 帧信息指针,不能为 NULL。 |
frame | 待发送的数据指针。 |
| 返回值 | 说明 |
|---|---|
> 0 | 发送字节数。 |
TIRTC_E_INVALID_HANDLE | 连接对象无效。 |
TIRTC_E_INVALID_PARAMETER | pFi 为 NULL 或 media 类型非法。 |
TIRTC_E_BUSY | 发送缓冲区已满,视频帧被丢弃。 |
| 其他负数 | 错误码。 |
发送策略:
pFi->media == TIRTC_MEDIA_MESSAGE时发送流内消息。pFi->media为音频或视频类型时,按TIRTCFRAMEINFO描述发送媒体帧。- 发送操作只根据
pFi->media选择传输策略,不检查数据内容。 - 视频流首帧必须是关键帧。如果首帧不是关键帧,这路视频会等到关键帧到来后再开始发送。
- 发送缓冲区满时,SDK 会丢弃后续非关键视频帧,直到下一个关键帧到来。
- 音频帧会直接加入发送队列,不会按视频关键帧规则丢帧。
- 流内消息可以放在任意
stream_id上,除length外的帧头语义由你的业务协议自行解释。
TiRtcSendVideoStream
int TiRtcSendVideoStream(tirtc_conn_t hconn,
const TIRTCFRAMEINFO *pFi,
const void *frame);视频发送封装。内部调用 TiRtcSendMessageStream()。
| 参数 | 说明 |
|---|---|
hconn | 连接对象。 |
pFi | 帧信息指针,pFi->media 必须是视频类型。 |
frame | 视频数据指针。 |
| 返回值 | 说明 |
|---|---|
> 0 | 发送字节数。 |
TIRTC_E_INVALID_PARAMETER | pFi->media 不是视频类型。 |
| 其他 | 同 TiRtcSendMessageStream()。 |
TiRtcSendAudioStream
int TiRtcSendAudioStream(tirtc_conn_t hconn,
const TIRTCFRAMEINFO *pFi,
const void *frame);音频发送封装。内部调用 TiRtcSendMessageStream()。
| 参数 | 说明 |
|---|---|
hconn | 连接对象。 |
pFi | 帧信息指针,pFi->media 必须是音频类型,pFi->flags 填音频采样规格。 |
frame | 音频数据指针。 |
| 返回值 | 说明 |
|---|---|
> 0 | 发送字节数。 |
TIRTC_E_INVALID_PARAMETER | pFi->media 不是音频类型。 |
| 其他 | 同 TiRtcSendMessageStream()。 |
命令通道
命令通道用于传输自定义控制数据,和媒体流相互独立。对端通过 TIRTCCALLBACKS.on_command 收到数据。
TiRtcSendCommand
int TiRtcSendCommand(tirtc_conn_t hconn,
uint32_t cmdw,
const void *data,
uint32_t length);在命令通道上发送数据。
| 参数 | 说明 |
|---|---|
hconn | 连接对象。 |
cmdw | 原始命令字。开发者应用应使用大于等于 0x10000 的值。 |
data | 命令参数数据指针,可为 NULL。 |
length | 命令参数长度,单位字节。 |
| 返回值 | 说明 |
|---|---|
> 0 | 发送字节数。 |
< 0 | 错误码。 |
命令字格式
当你只需要单向控制消息时,可以直接用大于等于 0x10000 的 cmdw。当你需要双向请求、重复请求或乱序应答时,使用 SDK 提供的命令字格式。
| 位域 | 字段 | 说明 |
|---|---|---|
| bit 0 | RESPONSE_BIT | 为 1 表示这是对己方先前请求的应答;为 0 表示请求。 |
| bit 1~15 | cmd | 命令标识。开发者应用使用从 0x4000 开始的值。 |
| bit 16~31 | sn | 命令序号,用于匹配请求和应答。 |
命令字取值范围:
cmdw 范围 | cmd 范围 | 使用者 |
|---|---|---|
0 ~ 0x1fff | 0 ~ 0xfff | SDK 内部使用 |
0x2000 ~ 0xffff | 0x1000 ~ 0x3fff | 预留范围,不用于开发者应用 |
>= 0x10000 | 0x4000 ~ 0x7fff | 开发者应用 |
atomic_get_cmd_sn
uint32_t atomic_get_cmd_sn(void);原子地返回下一个命令序号并自增。返回值低 16 位为有效序号。
需要乱序应答时,使用顺序是:
- 调用
atomic_get_cmd_sn()获取序号。 - 将带有该序号的应答处理器挂入等待队列。
- 发送命令。
必须先挂等待队列再发送命令,否则应答可能在处理器挂入前就已到达。
命令字辅助宏
#define GET_CMD(cmdw) (((cmdw) >> 1) & 0x7fff)
#define GET_SN(cmdw) ((cmdw) >> 16)
#define MAKE_CMDW(cmd, sn) (((uint32_t)(sn)) << 16 | (((cmd) << 1) & 0xffff))
#define IS_RESERVED_CMDW(cmdw) (cmdw < 0x2000)
#define RESPONSE_BIT 0x0001
#define TiRtcSendReq(hconn, cmd, data, length) TiRtcSendCommand(hconn, (cmd)&~RESPONSE_BIT, data, length)
#define TiRtcSendReqWithSn(hconn, sn, cmd, data, length) \
TiRtcSendCommand(hconn, MAKE_CMDW(cmd, sn), data, length)
#define TiRtcSendResp(hconn, cmdw, data, length) TiRtcSendCommand(hconn, (cmdw)|RESPONSE_BIT, data, length)| 宏 | 说明 |
|---|---|
GET_CMD(cmdw) | 从命令字提取命令标识。 |
GET_SN(cmdw) | 从命令字提取命令序号。 |
MAKE_CMDW(cmd, sn) | 用命令标识和序号生成命令字。 |
IS_RESERVED_CMDW(cmdw) | 判断命令字是否落在 SDK 内部使用范围。 |
RESPONSE_BIT | 应答标志位。 |
TiRtcSendReq(...) | 发送请求,清除应答位。 |
TiRtcSendReqWithSn(...) | 发送请求,并自动把 sn 填入高 16 位。 |
TiRtcSendResp(...) | 发送应答,置位应答位。cmdw 直接使用收到的请求命令字。 |
TiRtcRequestKeyFrame
int TiRtcRequestKeyFrame(tirtc_conn_t hconn, uint8_t stream_id);请求对端在指定视频流上立即发送关键帧。对端会收到 on_request_key_frame 回调。
TiRtcSubscribeVideo
int TiRtcSubscribeVideo(tirtc_conn_t hconn, uint8_t stream_id);请求对端开始发送指定视频流。对端会收到 on_subscribe_video 回调。
TiRtcUnsubscribeVideo
int TiRtcUnsubscribeVideo(tirtc_conn_t hconn, uint8_t stream_id);请求对端停止发送指定视频流。对端会收到 on_unsubscribe_video 回调。
TiRtcSubscribeAudio
int TiRtcSubscribeAudio(tirtc_conn_t hconn, uint8_t stream_id);请求对端开始发送指定音频流。对端会收到 on_subscribe_audio 回调。
TiRtcUnsubscribeAudio
int TiRtcUnsubscribeAudio(tirtc_conn_t hconn, uint8_t stream_id);请求对端停止发送指定音频流。对端会收到 on_unsubscribe_audio 回调。
上述订阅和关键帧接口返回 0 表示成功,否则返回错误码。
日志
TiRtcLogConfig
void TiRtcLogConfig(int bOutputToConsole, const char *path, uint32_t size);配置 SDK 内置文件日志,仅 Linux 平台有效。
| 参数 | 说明 |
|---|---|
bOutputToConsole | 非 0 时同时输出到 stdout。 |
path | 日志文件路径。传 NULL 不输出到文件。 |
size | 日志文件最大字节数,超出后滚动覆盖。 |
TiRtcLogSetLevel
void TiRtcLogSetLevel(int level);设置日志详细程度。值越大越详细。level > 10 时,同时将底层 WebRTC 库的日志级别设为 level - 10。
TiRtcLogSetCallback
void TiRtcLogSetCallback(TIRTCLOGCALLBACK cb);设置日志输出回调。
- 设置后,SDK 将所有日志内容通过回调传给应用,不再自行输出到文件或控制台。
- 通常用于无文件系统的小系统。
cb传NULL可清除回调,恢复默认输出行为。
WHIP
TiRtcWhipAccept
int TiRtcWhipAccept(const char *offer,
int offer_len,
TIRTCWHIPSERVERONSDPREADYCB whip_sdp_cb,
TIRTCCONNECTCALLBACK cb,
void *user);WHIP 服务端接口:接收 WHIP offer SDP,并异步生成 answer SDP。
| 参数 | 说明 |
|---|---|
offer | offer SDP 数据,通常来自 HTTP 请求 body。 |
offer_len | offer SDP 长度,单位字节。 |
whip_sdp_cb | answer SDP 就绪回调。应在该回调中向发起 WHIP 请求的一端返回 HTTP 201,body 为 answer SDP。 |
cb | 数据通道全部就绪或出错时触发的连接结果回调。 |
user | 原样传给 whip_sdp_cb 和 cb 的用户数据指针。 |
| 返回值 | 说明 |
|---|---|
0 | 请求已提交。 |
| 负数 | 错误码。 |
TiRtcWhipConnect
int TiRtcWhipConnect(const char *service_desc,
const char *token,
TIRTCCONNECTCALLBACK cb,
void *user_data);WHIP 发起接口:通过平台服务向目标发起连接。
| 参数 | 说明 |
|---|---|
service_desc | 服务描述字符串,不是 remote_id 或 device_id。 |
token | 你的业务服务端签发的连接授权凭证。 |
cb | 连接结果回调。 |
user_data | 原样传给 cb 的用户上下文指针。 |
| 返回值 | 说明 |
|---|---|
0 | 连接请求已提交。HTTP 请求和 ICE 协商在后台执行,最终结果通过 cb 通知。 |
| 负数 | 错误码。 |
常见误用
| 误用 | 结果 | 处理方式 |
|---|---|---|
TIRTCCALLBACKS 写在栈上,函数返回后还继续使用 SDK | 回调指针失效 | 使用静态存储、全局对象或生命周期覆盖 SDK 运行期的对象。 |
| 在回调里写文件、等待锁、sleep 或做长时间计算 | 阻塞 SDK 自己的线程 | 在回调里快速复制数据,再交给业务线程处理。 |
在 on_conn_error 里直接调用 TiRtcDisconnect() | 可能阻塞 SDK 自己的线程 | 设置标志或投递任务,在回调外断开连接。 |
把 TiRtcStart() 返回 0 当成 SDK 已启动 | 启动状态判断错误 | 等待 TIRTC_EVENT_SYS_STARTED。 |
TIRTC_OPT_MAX_SEND_BUFFER 在 TiRtcInit() 之后才设置 | 该选项不会生效 | 在 TiRtcInit() 前设置。 |
设置 TIRTC_NETCONN_4G 但没有设置 TIRTC_OPT_ICCID | 启动参数不完整 | 同时提供 ICCID。 |
同一连接内让音频和视频共用同一个 stream_id | 流冲突 | 为每一路音频或视频分配独立 stream_id。 |
| 视频首帧不是关键帧 | 该路视频要等到下一个关键帧才会发出 | 第一帧设置 TIRTC_FRAME_FLAG_KEY_FRAME。 |
音频帧 flags 未填写采样规格 | 对端无法按预期解释音频参数 | 按 TIRTCAUDIOSAMPLE 填写。 |
TiRtcConnect() 返回 TIRTC_E_CACHE_EXPIRED 后继续用 token == NULL 重试 | 无法重新建连 | 重新获取有效 token 后再连接。 |
TiRtcSendMessageStream() 返回 TIRTC_E_BUSY 后继续堆积发送 | 发送缓冲区持续拥塞 | 丢弃非关键视频帧,按发送缓冲区状态限流。 |
收到 on_conn_error 后继续发流或发命令 | 调用不再有效 | 断开并清理该连接。 |
给 TiRtcSendCommand() 传入小于 0x10000 的开发者命令字 | 可能落入保留范围,导致行为不符合公开约束 | 开发者应用统一使用大于等于 0x10000 的命令字。 |