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;}