SDK API 调用流程

最近更新时间:2024-03-29 17:10:21

我的收藏

SDK API 调用流程





调用步骤建议

注意:
signalStae 信令回调注册需要在初始化函数之前调用,其他回调函数可以在初始化之后注册。

步骤1:加载配置文件初始化

注册 signalState 信令回调接口,通过 Json 文件加载或输入 Json 字符串加载等方式,调用 Init 接口初始化 SDK。

步骤2:注册所需的回调函数

注册所需的回调函数。根据需求注册控制消息回调、延迟信息回调、日志回调、连接状态回调、远端设备视频链路信息回调、现场设备链路信息回调、原始视频数据回调接口等函数,处理对应的状态信息和事件。

步骤3:设置视频流渲染窗口

如果使用内置渲染,调用设置渲染窗口接口,绑定视频接收器 fd 和要渲染的视频窗口句柄。

步骤4:连接视频流

调用 connect 接口,连接指定现场设备 ID 的指定编号视频流 。当需要切换或断开视频时,可调用 disconnect 接口或 connect 接口。

步骤5:按需调用发送函数

当有外部二进制数据发送需求时,在所需发送时刻,调用对应的发送接口输入要发送的二进制控制数据。

步骤6:按需退出

当程序退出时,调用销毁接口销毁 SDK,C# 退出需要主动调用销毁接口。

Sample 代码示意

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "trro_remote.h"

//该代码sample未包含UI渲染部分,仅用于视频连接过程参考
int main() {
//注册signal回调
TRRO_registerSignalStateCallback(nullptr, [](void *context, SignalState state) {
if(state == kTrroReady) {
//服务器连接成功
printf("init success \\n");
}
if (state == kTrroAuthFailed) {
//鉴权失败
printf("device_id or password is incorrect\\n");
}
if (state == kTrroKickout) {
//被其他用户剔除
printf("the device is kicked by server, may be there is another device using the same device id\\n");
}
});

// 可按需替换为其他初始化函数,如使用配置字符串初始化
int ret = TRRO_initJsonPath("./config.json");
if(TRRO_SUCCED != ret) {
if (ret == -TRRO_SIGNAL_CONNECT_OUTTIME) {
printf("init process: wait for connecting\\n");
} else {
printf("init fail ret %d\\n", ret);
}
}
//按需注册回调
//注册视频连接状态回调
TRRO_registerOnState(this, [](void* context, const char* gwid, int stream_id, int conn_fd, int state) {
printf("###### onstate gwid %s, streamid %d conn_fd %d state %d\\n", gwid, stream_id, conn_fd, state);
});
//注册媒体传输状态回调
TRRO_registerOnMediaState(this, [](void* context, int windows_id, int fps, int bps, int rtt, long long decd, int jitter,
long long packets_lost, long long packets_received, int stun) {
printf("onMediaState window id %d fps %d bps %d rtt %d decd %lld rb %d lost %lld rec %lld stun %d\\n",windows_id, fps, bps, rtt, decd, jitter, packets_lost, packets_received, stun);
});
//注册延迟信息回调
TRRO_registerAllLatencyCallback(this, [](void* context, const char* gwid, int windows_id, long long latency1, long long latency2, long long gateway_time, int vcct) {
printf("allLatency %s, %d, latency1 %lld latency2 %lld video time %lld, vcct %d\\n", gwid, windows_id, latency1, latency2, gateway_time, vcct);
});
//注册原始视频数据回调,可用于外部渲染
TRRO_registerRemoteFrameCallback(this, [](void * context, const char * gwid, int stream_id, int conn_id, const char* data, int width, int height, long long videotime) {
//可以在这里调用渲染函数播放视频数据,但不要阻塞处理,处理延迟大请异步调用其他线程处理,否会导致视频卡顿
//showMyVideo(gwid, conn_id, (unsigned char*)data, width, height);
});

//视频接收句柄数组
int confds[8] = {0,1,2,3,4,5,6,7};
//渲染窗口句柄数组
WindowIdType window_hwnds[8] = { nullptr};
//SDK内部渲染设置目标渲染窗口win32 HWND窗口句柄即可,外部渲染可设置空窗口句柄(nullptr),通过实现showMyVideo进行渲染
TRRO_setWindows(confds, window_hwnds, 8);
//连接视频流, 假设每个现场设备需要连接4个视频流
int stream_num = 4;
int stream_indexs = [0,1,2,3];
//连接现场设备1的4个视频流0-3, 使用视频接收句柄 0-3
TRRO_connect("field_deviceId1", "", stream_num , &stream_indexs[0], &confds[0]);
//连接现场设备2的4个视频流0-3,使用视频接收句柄 4-7
TRRO_connect("field_deviceId2", "", stream_num , &stream_indexs[0], &confds[4]);
//等待退出
while(true){
sleep(3000);
//断开视频流
TRRO_disconnectAll();
//退出SDK,释放资源
TRRO_destroy();
break;
}
return 0;
}