SDK API 调用流程

最近更新时间:2024-04-18 14:15:01

我的收藏

API 调用流程图





调用步骤建议

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

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

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

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

根据需求,注册控制消息回调、日志回调、连接状态回调、视频链路信息回调、延迟信息回调等函数,处理对应的状态信息和事件。

步骤3:启动视频 SDK 进入托管状态

调用 TrroLinux_start,进入托管状态。此时,SDK 会监听各类请求,自动进行视频采集、视频推流,并处理断网等事件。

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

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

Sample 代码示例

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <thread>
#include "trro_field.h"

//外部输入视频数据
void externalVideoInput(int stream_id) {
int data_width = 1280;
int data_height = 720;
char *data = (char*)malloc(data_width*data_height*3/2);
//YUV420视频数据, sample中使用全0模拟数据(绿图)示意
memset(data, 0, data_size);
while(true) {
TRRO_externalVideoData(stream_id, data, data_width, data_height, 0);
usleep(33 * 1000);
}
free(data);
}

//主线程
int main() {
//注册signal回调
TRRO_registerSignalStateCallback(nullptr, [](void *context, SignalState state) {
if(state == kTrroReady) {
//服务器连接成功,注册回调函数,并启动SDK托管
printf("init success \\n");
TRRO_registerControlDataCallback(nullptr, [](void * context, const char* controlid, const char* msg, int len, int cmd) {
printf("receive control data from %s: %s\\n", controlid, msg);
});
TRRO_registerOnState(nullptr, [](void* context, int stream_id, int state) {
printf("stream_id: %d, state: %d\\n", stream_id, state);
});
TRRO_registerOnErrorEvent(nullptr, [](void* context, int error_code, const char* error_msg) {
printf("error_code %d, error_msg %s\\n", error_code, error_msg);
});
TRRO_registerVideoCaptureCallback(nullptr, [](void *context, const char* data, int width, int height, int type, int stream_id) {});
TRRO_registerLatencyCallback(nullptr, [](void *context, int stream_id, int vcct){
printf("LatencyCallbac context: %p, stream id %d, vcct %d\\n", context, stream_id, vcct);
});
TRRO_registerMediaState(nullptr, [](void* context, int stream_id, int fps, int bps, int rtt, long long lost, long long packets_send, int stun) {
printf("stream %d, fps %d, bps %d, rtt %d, lost %lld, packets_send %lld, stun %d\\n", stream_id, fps, bps, rtt, lost, packets_send, stun);
});
TRRO_registerOperationPermissionRequest(nullptr, [](void* context, const char* remote_devid, int permission) {
printf("remote devid %s permission %d\\n", remote_devid, permission);
});
int ret = TRRO_start();
//init 连接服务成功后, 可以开启 TRRO SDK 托管
if(TRRO_SUCCED == ret) {
printf("start succeed\\n");
} else if (ret == -TRRO_INIT_LICENSE_FILE_ERROR || ret == -TRRO_INIT_LICENSE_CHECK_FAILED) {
printf("start license error, wait for regist or exit error:%d\\n", ret);
} else {
// 需注意配置问题
printf("start config error, please check config it, error:%d\\n", ret);
}
}
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");
}
});

// 建议最后一个参数使用-1,采用非阻塞模式启动,等待信令连接成功回调
// 可按需替换为其他初始化函数,如使用配置字符串初始化
int ret = TRRO_initGwPathWithLicense("./config.json", "./license.txt", -1);
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);
}
}

// 启动外部输入视频数据线程,输入视频数据到流0,需要流0协议为outside
// std::thread t1(externalVideoInput, 0);
// t1.detach();
//防止程序退出
while(true){
sleep(30000);
}
return 0;
}