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[4] = {0,1,2,3};//连接现场设备1的4个视频流0-3, 使用视频接收句柄 0-3TRRO_connect("field_deviceId1", "", stream_num , &stream_indexs[0], &confds[0]);//连接现场设备2的4个视频流0-3,使用视频接收句柄 4-7TRRO_connect("field_deviceId2", "", stream_num , &stream_indexs[0], &confds[4]);//等待退出while(true){sleep(3000);//断开视频流TRRO_disconnectAll();//退出SDK,释放资源TRRO_destroy();break;}return 0;}