设备端 C API 参考
设备端错误码见错误码。
对象总览
| 对象 | 作用 |
|---|---|
tirtc_conn_t | 表示一条设备连接 |
TIRTCCALLBACKS | 定义设备端回调入口 |
TIRTCFRAMEINFO | 描述音频帧、视频帧和流内消息 |
TIRTCOPTION | 定义全局配置项 |
TIRTCCONNECTCALLBACK | 接收异步连接结果 |
TIRTCLOGCALLBACK | 接管 SDK 日志输出 |
通用约束
TIRTCCALLBACKS及其中回调函数的生命周期必须覆盖整个 SDK 运行期。- 所有回调都在 SDK 内部线程执行。回调里只做轻量工作,不做阻塞或耗时操作。
- 回调里的
data指针只在当前回调内有效;需要跨线程使用时,先自行拷贝。 - 不要在回调里直接调用
TiRtcDisconnect();尤其收到on_conn_error后,要切到回调外线程或事件循环再断开。 TiRtcDisconnect()是异步操作。调用返回后就把hconn当成无效;只有当你必须等 SDK 内部彻底释放时,才实现on_disconnected作为同步点。stream_id取值范围是0到15。同一连接内音频和视频不能复用同一个stream_id。- 每路视频流的第一帧必须是关键帧。
- 音频帧的
flags填TIRTCAUDIOSAMPLE;视频帧的flags按位使用TIRTC_FRAME_FLAG_KEY_FRAME。 - 收到
on_conn_error后,这条连接上的收发已不再有效;仍需在回调外调用TiRtcDisconnect()完成释放。
生命周期
| 层级 | 相关接口 | 说明 |
|---|---|---|
| 进程级 | TiRtcInit() / TiRtcUninit() | 初始化和释放 SDK 运行时 |
| 会话级 | TiRtcStart() / TiRtcStop() | 启动和停止设备端服务 |
| 连接级 | on_conn_accepted / TiRtcConnect() / TiRtcDisconnect() | 建立、使用和释放单条连接 |
常见顺序:TiRtcSetOption(TIRTC_OPT_MAX_SEND_BUFFER) -> TiRtcInit() -> 其他 TiRtcSetOption() -> TiRtcStart() -> 连接建立与收发 -> TiRtcStop() -> TiRtcUninit()。
TiRtcGetVersion
const char *TiRtcGetVersion(void);返回 SDK 版本字符串。
TiRtcGetErrorStr
const char *TiRtcGetErrorStr(int error);把错误码转换为可读字符串。
TiRtcInit
int TiRtcInit(void);初始化 SDK。必须在 TiRtcStart() 前调用。
TiRtcUninit
void TiRtcUninit(void);释放 SDK 运行时资源。
TiRtcSetOption
int TiRtcSetOption(TIRTCOPTION opt, const void *data, uint32_t len);设置全局配置项。
| 配置项 | data 类型 | 说明 |
|---|---|---|
TIRTC_OPT_SERVICE_ENDPOINT | const char * | 服务入口地址;不设置时使用默认入口 |
TIRTC_OPT_SECRET_KEY | const char * | 单独设置 device_secret_key;可替代在 license 字符串中明文传入 |
TIRTC_OPT_MAX_CONNECTIONS | int * | 最大连接数;默认 5 |
TIRTC_OPT_NETWORK_TYPE | int * | 联网方式;取值见 TIRTCNETCONN,默认 TIRTC_NETCONN_WIFI |
TIRTC_OPT_ICCID | const char * | 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 开启,默认开启 |
TiRtcStart
int TiRtcStart(const char *license, const TIRTCCALLBACKS *cbs);启动 C SDK 会话。
license == NULL时,只启动客户端能力,不接收入站连接。- 传
"<device_id>"时,先通过TIRTC_OPT_SECRET_KEY设置device_secret_key。 - 也兼容
"<device_id>,<device_secret_key>"形式。 - 返回
0只表示参数校验通过;真正启动完成以on_event(TiEVENT_SYS_STARTED, ...)为准。
TiRtcStop
int TiRtcStop(void);停止 SDK。完成后由 on_event(TiEVENT_SYS_STOPPED, ...) 通知。
核心类型
tirtc_conn_t
typedef struct _tirtc_conn *tirtc_conn_t;表示一条点对点连接。设备端在 on_conn_accepted 中拿到它;on_disconnected 返回后,这个句柄由 SDK 自动释放。
TIRTCNETCONN
| 取值 | 说明 |
|---|---|
TIRTC_NETCONN_WIFI | Wi-Fi |
TIRTC_NETCONN_4G | 运营商数据网络 |
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 视频 |
TIRTCAUDIOSAMPLE
| 取值 | 说明 |
|---|---|
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。同一连接内音频和视频不能共用 |
media | 媒体类型;取值见 TIRTCMEDIA |
flags | 视频帧按位使用 TIRTC_FRAME_FLAG_KEY_FRAME;音频帧填 TIRTCAUDIOSAMPLE |
reserved | 预留字段;当前填 0 |
ts | 主机序时间戳,单位毫秒 |
length | payload 字节长度 |
视频关键帧相关宏:
#define TIRTC_FRAME_FLAG_KEY_FRAME 0x01
#define TIRTC_IS_KEY_FRAME(flags) ((flags) & TIRTC_FRAME_FLAG_KEY_FRAME)TIRTCSYSEVENT
| 取值 | 说明 |
|---|---|
TiEVENT_SYS_STARTED | SDK 已启动 |
TiEVENT_SYS_STOPPED | SDK 已停止 |
TiEVENT_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;| 回调 | 触发时机 |
|---|---|
on_event | SDK 内部事件 |
on_conn_accepted | 收到新的入站连接 |
on_conn_error | 连接出现错误 |
on_disconnected | TiRtcDisconnect() 完成,连接句柄即将释放 |
on_audio | 收到对端音频帧 |
on_video | 收到对端视频帧 |
on_message | 收到对端流内消息 |
on_command | 收到对端命令通道数据 |
on_request_key_frame | 对端请求立即发送关键帧 |
on_subscribe_video | 对端请求开始接收某路视频 |
on_unsubscribe_video | 对端请求停止接收某路视频 |
on_subscribe_audio | 对端请求开始接收某路音频 |
on_unsubscribe_audio | 对端请求停止接收某路音频 |
TIRTCCONNECTCALLBACK
typedef void (*TIRTCCONNECTCALLBACK)(int error, tirtc_conn_t hconn, void *user_data);连接结果回调。设备端在主动建连或 WHIP 场景会用到它。
TIRTCLOGCALLBACK
typedef void (*TIRTCLOGCALLBACK)(const char *log, uint32_t length);日志输出回调。设置后,SDK 不再向控制台或文件输出日志。
连接管理
TiRtcConnect
int TiRtcConnect(const char *remote_id,
const char *token,
TIRTCCONNECTCALLBACK cb,
void *user_data);主动连接到指定 remote_id。
cb不能为空;返回0只表示连接请求已提交,真正结果以后续cb为准。- 首次连接应传入有效
token。这个token是一次性的,不要重复使用。 - 同一个
remote_id在缓存有效期内可传NULL复用连接参数。 - 缓存失效时返回
TIRTC_E_CACHE_EXPIRED,需要重新传入有效token。
TiRtcDisconnect
int TiRtcDisconnect(tirtc_conn_t hconn);主动断开连接。
- 这是异步操作,不会阻塞到 SDK 内部彻底释放完成。
- 调用返回后,不应再继续使用这个
hconn。 - 如果你必须等待 SDK 内部释放完成,再把
on_disconnected当成同步点。
TiRtcGetSendBufferUsed
size_t TiRtcGetSendBufferUsed(tirtc_conn_t hconn);返回当前连接已占用的发送缓冲区字节数。
TiRtcConnSetUserData
int TiRtcConnSetUserData(tirtc_conn_t hconn, void *user_data);给连接绑定业务上下文。
TiRtcConnGetUserData
void *TiRtcConnGetUserData(tirtc_conn_t hconn);取回绑定在连接上的业务上下文。
媒体发送
TiRtcSendMessageStream
int TiRtcSendMessageStream(tirtc_conn_t hconn,
const TIRTCFRAMEINFO *pFi,
const void *frame);通用发送入口,线程安全,支持多线程并发调用。
media == TIRTC_MEDIA_MESSAGE时发送流内消息。media为音频或视频时,按TIRTCFRAMEINFO描述发送媒体帧。- 返回值大于
0表示实际发送字节数;负值为错误码。 - 返回
TIRTC_E_BUSY时,表示发送缓冲区已满;Nano 会对视频流丢弃非关键帧直到下一个关键帧。 - 视频流首帧不是关键帧时,这条视频流会一直等到关键帧到来后再开始发。
- 流内消息可以放在任意
stream_id上,TIRTCFRAMEINFO里除length之外的语义由你的业务自己约定。
TiRtcSendVideoStream
int TiRtcSendVideoStream(tirtc_conn_t hconn,
const TIRTCFRAMEINFO *pFi,
const void *frame);视频发送封装。pFi->media 必须是视频类型。
TiRtcSendAudioStream
int TiRtcSendAudioStream(tirtc_conn_t hconn,
const TIRTCFRAMEINFO *pFi,
const void *frame);音频发送封装。pFi->media 必须是音频类型。
命令与订阅控制
TiRtcSendCommand
int TiRtcSendCommand(tirtc_conn_t hconn,
uint32_t cmdw,
const void *data,
uint32_t length);在命令通道上发送数据。cmdw 必须大于等于 0x2000。
atomic_get_cmd_sn
uint32_t atomic_get_cmd_sn(void);返回下一个命令序号。需要乱序应答时,先取序号,再挂等待项,再发送命令。
命令字辅助宏
#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 TiRtcSendReq(hconn, cmd, data, length) ...
#define TiRtcSendReqWithSn(hconn, sn, cmd, data, length) ...
#define TiRtcSendResp(hconn, cmdw, data, length) ...用于组装命令字、发送请求和发送应答。
需要 sn、请求/响应配对或乱序应答时,再进入对应的高级文档设计业务协议。
TiRtcRequestKeyFrame
int TiRtcRequestKeyFrame(tirtc_conn_t hconn, uint8_t stream_id);请求对端在指定视频流上立即发送关键帧。
TiRtcSubscribeVideo
int TiRtcSubscribeVideo(tirtc_conn_t hconn, uint8_t stream_id);请求对端开始发送指定视频流。
TiRtcUnsubscribeVideo
int TiRtcUnsubscribeVideo(tirtc_conn_t hconn, uint8_t stream_id);请求对端停止发送指定视频流。
TiRtcSubscribeAudio
int TiRtcSubscribeAudio(tirtc_conn_t hconn, uint8_t stream_id);请求对端开始发送指定音频流。
TiRtcUnsubscribeAudio
int TiRtcUnsubscribeAudio(tirtc_conn_t hconn, uint8_t stream_id);请求对端停止发送指定音频流。
日志
TiRtcLogConfig
void TiRtcLogConfig(int bOutputToConsole, const char *path, uint32_t size);配置 SDK 内置文件日志。仅 Linux 平台有效。
TiRtcLogSetLevel
void TiRtcLogSetLevel(int level);设置日志详细程度。
TiRtcLogSetCallback
void TiRtcLogSetCallback(TIRTCLOGCALLBACK cb);把日志输出改为回调方式。
WHIP
TiRtcWhipAccept
int TiRtcWhipAccept(const char *offer,
int offer_len,
TIRTCWHIPSERVERONSDPREADYCB whip_sdp_cb,
TIRTCCONNECTCALLBACK cb,
void *user);设备端接收 WHIP offer,并异步产出 answer SDP。
TiRtcWhipConnect
int TiRtcWhipConnect(const char *service_desc,
const char *token,
TIRTCCONNECTCALLBACK cb,
void *user_data);通过平台信令发起 WHIP 连接。
常见误用
| 误用 | 结果 |
|---|---|
TIRTCCALLBACKS 写在栈上后立即返回 | 回调指针失效 |
| 在回调里做阻塞 I/O 或长时间计算 | 拖住 SDK 内部线程 |
在 on_conn_error 回调里直接调用 TiRtcDisconnect() | 可能卡住 SDK 内部线程;应改到回调外处理 |
把 TiRtcStart() 返回 0 当成已经启动完成 | 启动信号判断错误;应以 TiEVENT_SYS_STARTED 为准 |
TIRTC_OPT_MAX_SEND_BUFFER 在 TiRtcInit() 之后才设置 | 该选项不会生效 |
TIRTC_OPT_NETWORK_TYPE 设成 TIRTC_NETCONN_4G 却没填 TIRTC_OPT_ICCID | 启动参数不完整 |
同一连接内让音频和视频复用同一个 stream_id | 流冲突 |
| 视频首帧不是关键帧 | 这路视频要等到下一个关键帧才会发出 |
音频帧 flags 不填采样规格 | 对端无法按预期解释音频参数 |
TiRtcConnect() 命中 TIRTC_E_CACHE_EXPIRED 后仍继续用旧缓存重试 | 无法重新建连 |
TiRtcSendMessageStream() 返回 TIRTC_E_BUSY 后仍持续堆发送 | 发送缓冲区持续拥塞 |
收到 on_conn_error 后继续发流或发命令 | 调用不再有效 |