Kalay1.0标准-升级版PSC

Kalay1.0 升级版PSC


Android API

[TOC]

一、IOTCamera

1.1 初始化接口、静态API

TK_initIOTC

/**
 * IOTC初始化
 * <p>
 * Error:
 * -1004 sdkLicenseKey无效
 * -10000 privateKey无效
 * -10003 privateKey过期
 *
 * @param context       上下文
 * @param privateKey    初始化的Key值
 * @param sdkLicenseKey SDK初始化的Key值
 * @param listener      初始化回调
 */
public synchronized static void TK_initIOTC(Context context, String privateKey, String sdkLicenseKey, TK_Listener listener);
示例:
Camera.TK_initIOTC(context, privateKey, sdkLicensekey, new TK_Listener());
备注:假如app应用使用的Android SDK是大于27(即使用9.0以上的SDK)则需要在AndroidManifest.xml的application里添加参数android:usesCleartextTraffic="true"
否则会初始化不成功;
例如:
<application
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher"
    android:usesCleartextTraffic="true"
    android:theme="@style/AppTheme">
</application>

> 注:调用TK_initIOTC时返回-10000, 是因为privateKey无效导致,遇到该问题时建议:

  • 确认当前项目使用的包名与privateKey是否与TUTK提供的一致,如不一致,请修改为TUTK提供的包名与privateKey重新运行;
  • 如需更改包名与privateKey,请联系商务或者技术支持人员。

TK_unInitIOTC

/**
 * IOTC反初始化
 */
public synchronized static int TK_unInitIOTC();
示例:
Camera.TK_unInitIOTC();

TK_setMasterRegion

/**
 * P2P分区分流
 * <p>
 * 需要在{@link #TK_initIOTC}之前进行调用
 *
 * @param region 0:全部;1:大中华地区;2:欧洲;3:美洲。
 */
public static void TK_setMasterRegion(int region);
示例:
Camera.TK_setMasterRegion(1);

TK_getIOTCameraVersion

/**
 * 获取IOTCamera版本号
 */
public static String TK_getIOTCameraVersion();
示例:
Camera.TK_getIOTCameraVersion();

TK_getIOTCAPIsVerion

/**
 * 返回IOTCAPI的版本号
 */
public static String TK_getIOTCAPIsVerion();
示例:
Camera.TK_getIOTCAPIsVerion();

TK_getAVAPIsVersion

/**
 * 返回AVAPI的版本号
 */
public static String TK_getAVAPIsVersion();
示例:
Camera.TK_getAVAPIsVersion();

TK_LanSearch

/**
 * 本地搜索设备
 *
 * @param timeoutMs 搜索超时时间
 * @return 本地网络下搜索到的设备信息
 */
public static st_LanSearchInfo[] TK_LanSearch(int timeoutMs);
示例:
st_LanSearchInfo[] arrResp = Camera.TK_LanSearch(2000);
if (arrResp != null) {
   for (st_LanSearchInfo info : arrResp) {
      Log.i(TAG, "uid: " + new String(info.UID) + " ip:" + new String(info.IP));
   }
}

TK_setLogEnable

/**
 * 设置log记录
 *
 * @param enable 是否开启log记录
 * @param path   设置path后,log沙盒存储路径为
 *               <path>/yyyy-MM-dd/HH:mm:ss/Console.txt
 *               <path>/yyyy-MM-dd/HH:mm:ss/IOTC.txt
 *               <path>/yyyy-MM-dd/HH:mm:ss/AVAPI.txt
 *               <path>/yyyy-MM-dd/HH:mm:ss/RDT.txt
 *               <path>/yyyy-MM-dd/HH:mm:ss/Global.txt
 * @param level  log等级
 */
public static void TK_setLogEnable(boolean enable, String path, LogLevel level);

1.2 回调接口

1.2.1 P2P回调接口

TK_registerIOTCListener

/**
 * 注册IOTC回调
 */
public boolean TK_registerIOTCListener(InterfaceCtrl.IOTCListener listener);

/**
 * 注销IOTC回调
 */
public boolean TK_unregisterIOTCListener(InterfaceCtrl.IOTCListener listener);
public interface IOTCListener {

   /**
    * nebula绑定信息回调
    * <p>
    * 当调用{@link com.tutk.IOTC.Camera#TK_nebulaBind}后,回调连线结果
    *
    * @param camera
    * @param credential 绑定结果,绑定失败时为null
    * @param resultCode resultCode 绑定结果
    * @param p2pCode    p2p返回值
    */
   void receiveBindInfo(Camera camera, String credential, int resultCode, int p2pCode);

   /**
    * IOTC连线信息回调
    * <p>
    * 1、当调用{@link com.tutk.IOTC.Camera#TK_connect}后,回调连线结果
    * 2、当调用{@link com.tutk.IOTC.Camera#TK_nebulaConnect}后,回调连线结果
    *
    * @param camera
    * @param resultCode 连线结果
    * @param p2pCode    p2p返回值
    */
   void receiveSessionInfo(Camera camera, int resultCode, int p2pCode);

   /**
    * AV通道连线信息回调
    * <p>
    * 当调用{@link com.tutk.IOTC.Camera#TK_start}后,回调连线结果
    *
    * @param camera
    * @param avChannel  av通道
    * @param resultCode 连线结果
    * @param p2pCode    p2p返回值
    */
   void receiveChannelInfo(Camera camera, int avChannel, int resultCode, int p2pCode);

   /**
    * 接收Command信息回调
    * <p>
    * 连线成功之后,当收到设备发过来指令后,回调指令数据
    *
    * @param camera
    * @param avChannel       av通道
    * @param avIOCtrlMsgType 接收到的信息类型
    * @param data            接收到的信息
    */
   void receiveIOCtrlData(Camera camera, int avChannel, int avIOCtrlMsgType, byte[] data);

   /**
    * 对讲是否成功回调
    * <p>
    * 当调用{@link com.tutk.IOTC.Camera#TK_startSoundToDevice}后,回调是否对讲成功
    *
    * @param camera
    * @param avChannel av通道
    * @param success   是否对讲成功
    */
   void receiveSoundToDevice(Camera camera, int avChannel, boolean success);

   /**
    * 监听是否成功回调
    * <p>
    * 当调用{@link com.tutk.IOTC.Camera#TK_startSoundToPhone}后,回调是否监听成功
    *
    * @param camera
    * @param avChannel av通道
    * @param success   是否监听成功
    */
   void receiveSoundToPhone(Camera camera, int avChannel, boolean success);

   /**
    * 发送Command调试信息回调
    * <p>
    * 连线成功之后,当调用{@link com.tutk.IOTC.Camera#TK_sendIOCtrlToChannel}给设备发送指令后,回调发送结果
    *
    * @param camera
    * @param avChannel       av通道
    * @param avIOCtrlMsgType 发送信息的类型
    * @param p2pCode         发送的p2p返回值
    * @param data            发送信息的数据
    */
   void sendIOCtrlData(Camera camera, int avChannel, int avIOCtrlMsgType, int p2pCode, byte[] data);

   /**
    * 发送Command调试信息回调
    * <p>
    * 1、连线成功之后,当调用{@link com.tutk.IOTC.Camera#TK_sendJsonCtrlToChannel}给设备发送指令后,回调发送结果
    * 2、连线成功之后,当调用{@link com.tutk.IOTC.Camera#TK_nebulaSendData}给设备发送指令后,回调发送结果
    *
    * @param camera
    * @param avChannel    av通道
    * @param jsonRequest  发送的json数据
    * @param jsonResponse 设备返回的内容
    * @param p2pCode      发送的p2p返回值
    */
   void sendJsonCtrlData(Camera camera, int avChannel, String jsonRequest, String jsonResponse, int p2pCode);

    /**
    * 文件上传、下载回调
    * <p>
    * 1、连线成功之后,当调用{@link com.tutk.IOTC.Camera#TK_startDownload}开始文件下载后,回调下载进度
    * 2、连线成功之后,当调用{@link com.tutk.IOTC.Camera#TK_startUpload}开始文件上传后,回调上传进度
    *
    * @param camera
    * @param channel  通道号
    * @param filePath 文件完整沙盒路径
    * @param progress 上传/下载进度
    * @param loadType 下载或上传类型 (AVIOCTRLDEFs.FILETransferType_Download/AVIOCTRLDEFs.FILETransferType_Upload)
    * @param p2pCode  p2p返回值
    */
    void downloadUploadOutput(Camera camera, int channel, String filePath, int progress, int loadType, int p2pCode);

}
示例:
Camera camera = new Camera();
camera.TK_registerIOTCListener(new SimpleIOTCListener());
resultCode 连线结果 定义
CONNECTION_STATE_CONNECTING = 1 连线中
CONNECTION_STATE_CONNECTED = 2 连线成功
CONNECTION_STATE_DISCONNECTED = 3 断线
CONNECTION_STATE_UNKNOWN_DEVICE = 4 未知设备
CONNECTION_STATE_WRONG_PASSWORD = 5 密码错误
CONNECTION_STATE_TIMEOUT = 6 连线超时
CONNECTION_STATE_UNSUPPORTED = 7 设备不支持连线
CONNECTION_STATE_CONNECT_FAILED = 8 连线失败
CONNECTION_STATE_UNKNOWN_LICENSE = 9 设备uid未在license中
CONNECTION_STATE_SLEEP = 10 设备睡眠状态
CONNECTION_STATE_DEVICE_MAX_SESSION = 11 超过设备最大连线数
CONNECTION_STATE_POOR_NETWORKSIGNA = 12 网络信号差
CONNECTION_STATE_WRONG_AUTH_KEY = 13 AuthKey错误
CONNECTION_STATE_SELF_DISCONNECT = 14 在连线过程中App主动进行断线

1.2.2 音视频回调接口

TK_registerMediaDataListener

/**
 * 注册音视频数据回调
 */
public boolean TK_registerMediaDataListener(InterfaceCtrl.MediaDataListener listener);

/**
 * 注销音视频数据回调
 */
public boolean TK_unregisterMediaDataListener(InterfaceCtrl.MediaDataListener listener);
public interface MediaDataListener {

   /**
    * 视频解码数据回调
    * <p>
    * 当调用{@link com.tutk.IOTC.Camera#TK_startShow}后,回调视频解码信息
    *
    * @param avFrame          解码当前帧
    * @param isSoftwareDecode 是否是软解码
    * @param decodeAfter      解码后的数据,yuv/rgb/null
    * @param videoWidth       视频宽
    * @param videoHeight      视频高
    */
   void onDecodeVideoData(Camera camera, int avChannel, AVFrame avFrame, byte[] decodeAfter, int videoWidth, int videoHeight, boolean isSoftwareDecode);

   /**
    * 视频接收原始数据回调
    * <p>
    * 当调用{@link com.tutk.IOTC.Camera#TK_startShow}后,回调视频接收信息
    *
    * @param avFrame 接收当前帧
    */
   void onRecvVideoFrame(Camera camera, int avChannel, AVFrame avFrame);

   /**
    * 视频调试信息回调
    * <p>
    * 当调用{@link com.tutk.IOTC.Camera#TK_startShow}后,回调调试信息
    *
    * @param bitRate              1s内音视频的比特率(bps)
    * @param frameRate            1s内视频解码帧率(fps)
    * @param onlineNm             在线人数
    * @param frameCount           接收到的视频帧总数
    * @param incompleteFrameCount 丢失视频帧的总数
    */
   void onRecvVideoInfo(Camera camera, int avChannel, long bitRate,
                   int frameRate, int onlineNm, int frameCount,
                   int incompleteFrameCount);

   /**
    * 音频解码数据回调
    * <p>
    * 当调用{@link com.tutk.IOTC.Camera#TK_startSoundToPhone}后,回调解码信息
    *
    * @param avFrame     解码当前帧
    * @param decodeAfter 解码后的PCM数据
    */
   void onDecodeAudioData(Camera camera, int avChannel, AVFrame avFrame, byte[] decodeAfter);

   /**
    * 音频接收原始数据回调
    * <p>
    * 当调用{@link com.tutk.IOTC.Camera#TK_startSoundToPhone}后,回调音频接收信息
    *
    * @param avChannel av通道 一般为0
    * @param avFrame   接收当前帧
    */
   void onRecvAudioFrame(Camera camera, int avChannel, AVFrame avFrame);

   /**
    * 音频采集原始数据回调
    * <p>
    * 当调用{@link com.tutk.IOTC.Camera#TK_startSoundToDevice}后,回调音频采集信息
    *
    * @param avChannel av通道 一般为0
    * @param avFrame   发送当前帧
    */
   void onSendAudioFrame(Camera camera, int avChannel, AVFrame avFrame);
}
示例:
Camera camera = new Camera();
camera.TK_registerIOTCListener(new SimpleMediaDataListener());

1.3 连线处理

1.3.1 P2P

TK_connect

/**
 * 连线Device
 * <p>
 * 连线结果使用{@link #TK_registerIOTCListener}进行获取
 *
 * @param uid 20位uid序列号
 * @see InterfaceCtrl.IOTCListener#receiveSessionInfo
 */
public abstract void TK_connect(String uid);

/**
 * 连线Device
 * <p>
 * 连线结果使用{@link #TK_registerIOTCListener}进行获取
 *
 * @param uid     20位uid序列号
 * @param authKey 连线认证的authKey
 * @see InterfaceCtrl.IOTCListener#receiveSessionInfo
 */
public abstract void TK_connect(String uid, String authKey);
示例:
Camera camera = new Camera();
camera.TK_connect(uid, authKey);
camera.TK_registerIOTCListener(new InterfaceCtrl.SimpleIOTCListener() {
   @Override
   public void receiveSessionInfo(Camera camera, int resultCode) {
      if (resultCode == Camera.CONNECTION_STATE_CONNECTED) {
         //连线成功
      }
   }
});

1.3.2 Nebula

TK_nebulaStartBind

/**
 * Nebula开始绑定设备
 * <p>
 * 使用 {@link #TK_registerIOTCListener} 获取绑定结果
 *
 * @param udid     40位uid序列号
 * @param bindType 绑定方式 PIN_CODE(0), CREDENTIAL(1), AP(2);
 * @param bindKey  与绑定方式相关,填入值分别为 pin code, credential, password
 * @see InterfaceCtrl.IOTCListener#receiveBindInfo
 */
void TK_nebulaStartBind(String udid, Camera.BindType bindType, String bindKey);
示例:
camera.TK_nebulaStartBind(udid, Camera.BindType.PIN_CODE, "123456");
camera.TK_registerIOTCListener(new InterfaceCtrl.SimpleIOTCListener(){
   @Override
   public void receiveBindInfo(Camera camera, String credential, int resultCode, int p2pCode) {
      if(resultCode == Camera.CONNECTION_STATE_CONNECTED){
         //nebula bind success
      }
   }
});

TK_nebulaStopBind

/**
 * Nebula停止绑定设备
 */
void TK_nebulaStopBind();

TK_nebulaConnect

/**
 * Nebula连线设备
 * <p>
 * 使用 {@link #TK_registerIOTCListener} 获取连线结果
 *
 * @param udid       40位uid序列号
 * @param credential 设备绑定后产生的credential
 * @param avToken    连线所需要的token,由am server提供
 * @param realm      需要与设备一致
 * @see InterfaceCtrl.IOTCListener#receiveSessionInfo
 */
void TK_nebulaConnect(String udid, String credential, String avToken, String realm);

/**
 * Nebula连线设备
 * <p>
 * 使用 {@link #TK_registerIOTCListener} 获取连线结果
 *
 * @param udid         40位uid序列号
 * @param credential   设备绑定后产生的credential
 * @param avToken      连线所需要的token,由am server提供
 * @param realm        需要与设备一致
 * @param isWakeup     是否进行唤醒
 * @param isNebulaOnly 是否仅进行nebula连线,不进行iotc连线
 * @see InterfaceCtrl.IOTCListener#receiveSessionInfo
 */
void TK_nebulaConnect(String udid, String credential, String avToken, String realm, boolean isWakeup, boolean isNebulaOnly);
示例:
camera.TK_nebulaBind(udid, Camera.BindType.PIN_CODE, "123456");
camera.TK_registerIOTCListener(new InterfaceCtrl.SimpleIOTCListener(){
   @Override
   public void receiveBindInfo(Camera camera, String credential, int resultCode, int p2pCode) {
      if(resultCode == Camera.CONNECTION_STATE_CONNECTED){
         //nebula bind success
         camera.TK_nebulaConnect(udid, credential, avToken, realm, true, false);
      }
   }

   @Override
   public void receiveSessionInfo(Camera camera, int resultCode, int p2pCode) {
      if(resultCode == Camera.CONNECTION_STATE_CONNECTED){
         //nebula connect success
      }
   }
});

TK_nebulaLanSearch

/**
 * Nebula AP模式添加时,搜索本地udid列表
 * <p>
 * 仅用于AP模式添加流程
 *
 * @param timeoutMs 超时时间
 * @return udid列表
 */
public static st_UDIDInfo[] TK_nebulaLanSearch(int timeoutMs)
示例:
st_UDIDInfo[] lanSearch = Camera.TK_nebulaLanSearch(5 * 1000);
if (lanSearch != null && lanSearch.length > 0) {
   String udid = new String(lanSearch[0].UDID);
} else {
   Log.e(TAG, "TK_nebulaLanSearch lanSearch = null");
}

TK_nebulaSsidListReq

/**
 * Nebula AP模式添加时,发送本地指令,获取设备wifi列表
 * <p>
 * 需要先调用 {@link #TK_nebulaStartBind} 进行AP模式绑定
 *
 * @return wifi列表
 */
List<NebulaWiFiConfig.NebulaIOCtrlMsgSSIDListResp> TK_nebulaSsidListReq();

TK_nebulaSetWifiReq

/**
 * Nebula AP模式添加时,发送本地指令,给设备设置wifi
 * <p>
 * 需要先调用 {@link #TK_nebulaSsidListReq} 获取wifi信息
 *
 * @param wifi     wifi信息
 * @param password 设备密码
 * @return 设置结果
 */
NebulaWiFiConfig.NebulaIOCtrlMsgSetWifiResp TK_nebulaSetWifiReq(NebulaWiFiConfig.NebulaIOCtrlMsgSSIDListResp wifi, String password);

TK_nebulaSetRegionReq

/**
 * Nebula AP模式添加时,发送本地指令,给设备设置P2P分区分流
 * <p>
 * 需要先调用 {@link #TK_nebulaStartBind} 进行AP模式绑定
 *
 * @param region 0:全部;1:大中华地区;2:欧洲;3:美洲。
 * @return 设置结果
 */
NebulaWiFiConfig.NebulaIOCtrlMsgSetRegionResp TK_nebulaSetRegionReq(TUTKRegion region);

1.3.3 共有

TK_disconnect

/**
 * 断线Device,同时断开内部所有AV通道
 */
public abstract void TK_disconnect();
示例:
camera.TK_disconnect();

TK_start

/**
 * 连线AV通道
 * <p>
 * 1、SecurityMode加密模式会优先使用上次连线成功后的方式,默认为AUTO(2)
 * 2、AuthType认证方式默认为PASSWORD(0)方式
 * <p>
 * 1、需要先调用{@link #TK_connect}
 * 2、连线结果使用{@link #TK_registerIOTCListener}进行获取
 *
 * @param avChannel 一般为0
 * @param password  密码
 * @see InterfaceCtrl.IOTCListener#receiveChannelInfo
 */
public abstract void TK_start(int avChannel, String password);

/**
 * 连线AV通道
 * <p>
 * 1、需要先调用{@link #TK_connect}
 * 2、连线结果使用{@link #TK_registerIOTCListener}进行获取
 *
 * @param avChannel 一般为0
 * @param password  密码
 * @param account   账户,一般为admin
 * @param type      认证方式 PASSWORD(0), TOKEN(1);
 * @param mode      加密模式 SIMPLE(0), DTLS(1), AUTO(2);
 * @see InterfaceCtrl.IOTCListener#receiveChannelInfo
 */
public abstract void TK_start(int avChannel, String password, String account, Camera.AuthType type, Camera.SecurityMode mode);
示例:
Camera camera = new Camera();
camera.TK_connect(uid, authKey);
camera.TK_start(Camera.DEFAULT_AV_CHANNEL, password, "admin", Camera.AuthType.PASSWORD, Camera.SecurityMode.AUTO);
cameraTK_registerIOTCListener(new InterfaceCtrl.SimpleIOTCListener() {
   @Override
   public void receiveSessionInfo(Camera camera, int resultCode) {
      if (resultCode == Camera.CONNECTION_STATE_CONNECTED) {
         //连线成功
      }
   }

   @Override
   public void receiveChannelInfo(Camera camera, int avChannel, int resultCode) {
      if (resultCode == Camera.CONNECTION_STATE_CONNECTED) {
         //连线av通道成功
      }
   }
});

TK_stop

/**
 * 断线AV通道
 *
 * @param avChannel 一般为0
 */
public abstract void TK_stop(int avChannel);
示例:
camera.TK_stop(Camera.DEFAULT_AV_CHANNEL);

TK_changeAuthKey

/**
 * 修改AuthKey,返回修改后的AuthKey
 * <p>
 * 需要在{@link #TK_start}成功后进行调用
 *
 * @param avChannel 一般为0
 */
public abstract String TK_changeAuthKey(int avChannel);
示例:
Camera camera = new Camera();
camera.TK_connect(uid, authKey);
camera.TK_start(Camera.DEFAULT_AV_CHANNEL, password, "admin", Camera.AuthType.PASSWORD, Camera.SecurityMode.AUTO);
cameraTK_registerIOTCListener(new InterfaceCtrl.SimpleIOTCListener() {
   @Override
   public void receiveSessionInfo(Camera camera, int resultCode) {
      if (resultCode == Camera.CONNECTION_STATE_CONNECTED) {
         //连线成功
      }
   }

   @Override
   public void receiveChannelInfo(Camera camera, int avChannel, int resultCode) {
      if (resultCode == Camera.CONNECTION_STATE_CONNECTED) {
         //连线av通道成功,修改authKey
         camera.TK_changeAuthKey(avChannel);
      }
   }
});

TK_isSessionConnected

/**
 * Device是否连线
 *
 */
public abstract boolean TK_isSessionConnected();
示例:
camera.TK_isSessionConnected();

TK_isChannelConnected

/**
 * AV通道是否连线
 *
 * @param avChannel 一般为0
 */
public abstract boolean TK_isChannelConnected(int avChannel);
示例:
camera.TK_isChannelConnected();

TK_getAVChannelCount

/**
 * 获取已经开启的AV通道数
 */
public abstract int TK_getAVChannelCount();
示例:
camera.TK_getAVChannelCount();

TK_getServiceTypeOfChannel

/**
 * 获取相应通道ServiceTYpe
 *
 * @param avChannel 一般为0
 * @return 返回ServiceTYpe
 */
public abstract long TK_getServiceTypeOfChannel(int avChannel);
示例:
camera.TK_getServiceTypeOfChannel(Camera.DEFAULT_AV_CHANNEL);

1.4 视频处理接口

TK_startShow

/**
 * 开启视频接收、解码、播放
 * <p>
 * 默认硬解码,不丢P帧,输出数据为空
 * <p>
 * 使用 {@link #TK_registerMediaDataListener} 获取视频数据
 *
 * @param avChannel 一般为0
 * @param isDecodeAndRender 默认硬解码
 * @param runSoftwareDecode 默认硬解码
 * @param isDropFrame       默认不丢掉P帧
 * @param type              默认输入解码数据类型为空
 * @see InterfaceCtrl.MediaDataListener#onDecodeVideoData
 * @see InterfaceCtrl.MediaDataListener#onRecvVideoFrame
 * @see InterfaceCtrl.MediaDataListener#onRecvVideoInfo
 */
public abstract void TK_startShow(int avChannel);

/**
 * 开启视频接收、解码、播放
 * <p>
 * 使用 {@link #TK_registerMediaDataListener} 获取视频数据
 * <p>
 * 输出数据类型如下:
 * {@link com.tutk.IOTC.Camera.RenderType#OUTPUT_NULL}//仅接收、解码、渲染,输出数据为空
 * {@link com.tutk.IOTC.Camera.RenderType#OUTPUT_YUV}//接收、解码、渲染,并输出yuv数据(耗时)
 * {@link com.tutk.IOTC.Camera.RenderType#OUTPUT_YUV_NV12}//接收、解码、渲染,并输出nv12数据(耗时)
 * {@link com.tutk.IOTC.Camera.RenderType#OUTPUT_RGB_8888}//接收、解码、渲染,并输出RGB_8888数据(耗时)
 * {@link com.tutk.IOTC.Camera.RenderType#OUTPUT_RGB_565}//接收、解码、渲染,并输出RGB_565数据(耗时)
 *
 * @param avChannel         一般为0
 * @param isDecodeAndRender 是否进行解码并渲染,当为false时,不再进行解码、渲染以及不再进行解码数据输出
 * @param runSoftwareDecode 是否软解码,当硬解码不支援时会自动切换至软解码,具体当前是哪种解码方式,以onDecodeVideoData输出结果为准
 * @param isDropFrame       是否丢掉P帧,仅接收I帧
 * @param sendStartCommand       是否发送command
 * @param type              输出解码数据类型
 * @see InterfaceCtrl.MediaDataListener#onDecodeVideoData
 * @see InterfaceCtrl.MediaDataListener#onRecvVideoFrame
 * @see InterfaceCtrl.MediaDataListener#onRecvVideoInfo
 */
public abstract void TK_startShow(int avChannel, boolean isDecodeAndRender, boolean runSoftwareDecode, boolean isDropFrame, boolean sendStartCommand
, Camera.RenderType type);
示例:
camera.TK_startShow(Camera.DEFAULT_AV_CHANNEL, true, false, false, Camera.RenderType.OUTPUT_NULL);
camera.TK_registerMediaDataListener(new InterfaceCtrl.SimpleMediaDataListener() {
      @Override
      public void onDecodeVideoData(Camera camera, int avChannel, AVFrame avFrame, byte[] decodeAfter, int videoWidth, int videoHeight, boolean isSoftwareDecode) {
         //视频解码数据回调
      }

      @Override
      public void onRecvVideoInfo(Camera camera, int avChannel, long bitRate, int frameRate, int onlineNm, int frameCount, int incompleteFrameCount) {
         //视频调试信息回调
      }

      @Override
      public void onRecvVideoFrame(Camera camera, int avChannel, AVFrame avFrame) {
         //视频接收原始数据回调
      }
   });
}

TK_stopShow

/**
 * 停止所有AV通道的视频接收、解码、播放
 */
public abstract void TK_stopShow();

/**
 * 停止指令通道的视频接收、解码、播放
 *
 * @param avChannel 需要停止的Channel
 * @param sendStopCommand 是否发送command
 */
public abstract void TK_stopShow(int avChannel,  boolean sendStopCommand);
示例:
camera.TK_stopShow();

TK_getVideoCodecId

/**
 * 获取当前视频格式
 * <p>
 * 在出图后,可使用本Api获取视频格式
 * <p>
 * 对应格式如下:
 * {@link com.tutk.IOTC.AVFrame#VIDEO_CODEC_MPEG4} 76
 * {@link com.tutk.IOTC.AVFrame#VIDEO_CODEC_H263} 77
 * {@link com.tutk.IOTC.AVFrame#VIDEO_CODEC_H264} 78
 * {@link com.tutk.IOTC.AVFrame#VIDEO_CODEC_MJPEG} 79
 * {@link com.tutk.IOTC.AVFrame#VIDEO_CODEC_HEVC} 80
 * {@link com.tutk.IOTC.AVFrame#VIDEO_CODEC_VP8} 81
 * {@link com.tutk.IOTC.AVFrame#VIDEO_CODEC_VP9} 82
 *
 * @param channel 一般为0
 * @return 返回视频格式
 */
int TK_getVideoCodecId(int channel);
示例:
camera.TK_getVideoCodecId(Camera.DEFAULT_AV_CHANNEL);

TK_setAVFilter

/**
 * 是否开启解码滤镜
 * <p>
 * 在出图后,可使用用本Api开/关滤镜
 * <p>
 * 当解码类型为硬解码,并且RenderType为OUTPUT_NULL时,不支持滤镜
 *
 * @param avChannel     一般为0
 * @param cmd           滤镜命令 (例:eq=contrast=0.9:brightness=0.1:saturation=1 )
 *                      contrast 对比度-2.0-2.0间的浮点数,默认为0
 *                      brightness 亮度-1.0-1.0间的浮点数,默认为0
 *                      saturation 饱和度0-3.0间的浮点数,默认为1
 *                      gamma         0.1-10.0间的浮点数,默认为1
 *                      gamma_r   红色值必须是一个0.1-10.0间的浮点数,默认为1
 *                      gamma_g   绿色值必须是一个0.1-10.0间的浮点数,默认为1
 *                      gamma_b   蓝色值必须是一个0.1-10.0间的浮点数,默认为1
 *                      gamma_weight 设置gamma权重表达式.它可以用来减少高伽马值在明亮的图像区域影响,例如只是普通的白色放大,而其它保持不变。
 *                      值必须是一个在0.0到1.0范围的浮点数。值为0.0时把伽马校正效果最强,为1.0没有效果。默认设置是“1”
 * @param isStartFilter 是否开启滤镜
 */
public abstract void TK_setAVFilter(int avChannel, String cmd, boolean isStartFilter);
示例:
boolean decodeSuucess = false;

camera.TK_startShow(Camera.DEFAULT_AV_CHANNEL, false, false, Camera.RenderType.OUTPUT_NULL);
camera.TK_registerMediaDataListener(new InterfaceCtrl.SimpleMediaDataListener() {
      @Override
      public void onDecodeVideoData(Camera camera, int avChannel, AVFrame avFrame, byte[] decodeAfter, int videoWidth, int videoHeight, boolean isSoftwareDecode) {
         //视频解码数据回调
         decodeSuucess = true;
      }
   });
}

btn.setOnclickListener(new View.OnClickListener{v->
    if(decodeSuucess){
        camera.TK_setAVFilter(Camera.DEFAULT_AV_CHANNEL, "eq=contrast=0.9:brightness=0.1:saturation=1", true);
    }
});

TK_setDecodeDelayTime

/**
 * 设置解码最大延时,调整解码每帧时间间隔
 * <p>
 *
 * @param channel      一般为0
 * @param delayTime    最大延迟时间(ms)
 * @param durationTime 解码时间间隔(ms) 0 ~ 30
 * @see InterfaceCtrl.IRegisterVideoDataListener#onRecvVideoFrame
 */
public abstract void TK_setDecodeDelayTime(int channel, long delayTime, long durationTime);
示例:
Camera camera = new Camera();
camera.TK_connect(uid, authKey);
camera.TK_start(Camera.DEFAULT_AV_CHANNEL, password, "admin", Camera.AuthType.PASSWORD, Camera.SecurityMode.AUTO);
cameraTK_registerIOTCListener(new InterfaceCtrl.SimpleIOTCListener() {

   @Override
   public void receiveChannelInfo(Camera camera, int avChannel, int resultCode) {
      if (resultCode == Camera.CONNECTION_STATE_CONNECTED) {
         //连线av通道成功
          camera.TK_setDecodeDelayTime(Camera.DEFAULT_AV_CHANNEL, 1500, 15);
      }
   }
});

1.5 音频处理接口

TK_startSoundToDevice

/**
 * 开始音频采集、编码、发送
 * <p>
 * 1、使用 {@link #TK_registerMediaDataListener} 获取音频数据
 * 2、使用 {@link #TK_registerIOTCListener} 获取是否音频对讲成功
 * 3、在音频对讲开始后,会发送{@link com.tutk.IOTC.Camera#ACTION_START_SOUND_TO_DEVICE}广播
 * 4、在音频对讲结束后,会发送{@link com.tutk.IOTC.Camera#ACTION_STOP_SOUND_TO_DEVICE}广播
 *
 * @param channel 一般为0
 * @see InterfaceCtrl.MediaDataListener#onSendAudioFrame
 * @see InterfaceCtrl.IOTCListener#receiveSoundToDevice
 */
void TK_startSoundToDevice(int channel);

/**
 * 开始音频采集、编码、发送
 * <p>
 * 1、使用 {@link #TK_registerMediaDataListener} 获取音频数据
 * 2、使用 {@link #TK_registerIOTCListener} 获取是否音频对讲成功
 * 3、在音频对讲开始后,会发送{@link com.tutk.IOTC.Camera#ACTION_START_SOUND_TO_DEVICE}广播
 * 4、在音频对讲结束后,会发送{@link com.tutk.IOTC.Camera#ACTION_STOP_SOUND_TO_DEVICE}广播
 *
 * @param channel     一般为0
 * @param isResend    是否开启Resend机制
 * @param captureSize 手机端采集音频的大小
 * @see InterfaceCtrl.MediaDataListener#onSendAudioFrame
 * @see InterfaceCtrl.IOTCListener#receiveSoundToDevice
 */
void TK_startSoundToDevice(int channel, boolean isResend, int captureSize);
示例:
camera.TK_startSoundToDevice(Camera.DEFAULT_AV_CHANNEL);
camera.TK_registerMediaDataListener(new InterfaceCtrl.SimpleMediaDataListener(){
   @Override
   public void onSendAudioFrame(Camera camera, int avChannel, AVFrame avFrame) {
      //音频采集原始数据回调
   }
});

TK_stopSoundToDevice

/**
 * 停止音频采集、编码、发送
 *
 * @param avChannel 一般为0
 */
public abstract void TK_stopSoundToDevice(int avChannel);
示例:
camera.TK_stopSoundToDevice(Camera.DEFAULT_AV_CHANNEL);

TK_startSoundToPhone

/**
 * 开始音频接收、解码、播放
 * <p>
 * 1、使用 {@link #TK_registerMediaDataListener} 获取音频数据
 * 2、使用 {@link #TK_registerIOTCListener} 获取是否音频播放成功
 * 3、在音频播放开始后,会发送{@link com.tutk.IOTC.Camera#ACTION_START_SOUND_TO_PHONE}广播
 * 4、在音频播放结束后,会发送{@link com.tutk.IOTC.Camera#ACTION_STOP_SOUND_TO_PHONE}广播
 *
 * @param channel 一般为0
 * @see InterfaceCtrl.MediaDataListener#onRecvAudioFrame
 * @see InterfaceCtrl.MediaDataListener#onDecodeAudioData
 * @see InterfaceCtrl.IOTCListener#receiveSoundToPhone
 */
void TK_startSoundToPhone(int channel);

/**
 * 开始音频接收、解码、播放
 * <p>
 * 1、使用 {@link #TK_registerMediaDataListener} 获取音频数据
 * 2、使用 {@link #TK_registerIOTCListener} 获取是否音频播放成功
 * 3、在音频播放开始后,会发送{@link com.tutk.IOTC.Camera#ACTION_START_SOUND_TO_PHONE}广播
 * 4、在音频播放结束后,会发送{@link com.tutk.IOTC.Camera#ACTION_STOP_SOUND_TO_PHONE}广播
 *
 * @param channel         一般为0
 * @param isDecodeAndPlay 是否进行解码播放
 * @see InterfaceCtrl.MediaDataListener#onRecvAudioFrame
 * @see InterfaceCtrl.MediaDataListener#onDecodeAudioData
 * @see InterfaceCtrl.IOTCListener#receiveSoundToPhone
 */
void TK_startSoundToPhone(int channel, boolean isDecodeAndPlay);
示例:
camera.TK_startSoundToPhone(Camera.DEFAULT_AV_CHANNEL);
camera.TK_registerMediaDataListener(new InterfaceCtrl.SimpleMediaDataListener(){
   @Override
   public void onDecodeAudioData(Camera camera, int avChannel, AVFrame avFrame, byte[] decodeAfter) {
      //音频解码数据回调
   }

   @Override
   public void onRecvAudioFrame(Camera camera, int avChannel, AVFrame avFrame) {
      //音频接收原始数据回调
   }
});

TK_stopSoundToPhone

/**
 * 停止音频接收、解码、播放
 *
 * @param avChannel 一般为0
 */
public abstract void TK_stopSoundToPhone(int avChannel);
示例:
camera.TK_stopSoundToPhone(Camera.DEFAULT_AV_CHANNEL);

TK_setAudioCustom

/**
 * 是否需要自行播放或发送音频,一般用于第三方回音消除功能
 * <p>
 * 1、使用 本Api 告知底层不进行音频播放、不进行音频编码以及发送
 * 2、使用 {@link #TK_startSoundToPhone} 开启音频接收、解码(内部不再进行播放)
 * 3、使用 {@link #TK_startSoundToDevice} 开启音频采集(内部不再进行编码以及发送)
 * 4、使用 {@link #TK_registerMediaDataListener} 获取解码后的音频数据、获取采集到的音频数据
 * 5、使用 {@link #TK_playAudio} 播放回音消除后的音频数据
 * 6、使用 {@link #TK_sendAudio} 发送回音消除后的音频数据
 *
 * @param customPlay 设置为true后底层仅做音频接收、解码,不再进行播放
 * @param customSend 设置为true后底层仅做音频采集,不再进行编码以及发送
 */
public abstract void TK_setAudioCustom(int avChannel, boolean customPlay, boolean customSend);
示例:
camera.TK_setAudioCustom(Camera.DEFAULT_AV_CHANNEL, true, true);
camera.TK_startSoundToPhone(Camera.DEFAULT_AV_CHANNEL);
camera.TK_stopSoundToDevice(Camera.DEFAULT_AV_CHANNEL);
camera.TK_registerMediaDataListener(new InterfaceCtrl.SimpleMediaDataListener(){

   @Override
   public void onRecvAudioFrame(Camera camera, int avChannel, AVFrame avFrame) {
      //音频接收原始数据回调,获取后自行进行回音消除逻辑
      byte[] audioData = test1(avFrame.frmData);
      //自行播放,或使用此Api进行播放
      mCamera.TK_playAudio(avChannel, audioData, audioData.length, (int)System.currentTimeMillis());
   }

   @Override
   public void onSendAudioFrame(Camera camera, int avChannel, AVFrame avFrame) {
      //音频采集原始数据回调,获取后自行进行回音消除逻辑
      byte[] audioData = test2(avFrame.frmData);
      //进行发送
      mCamera.TK_sendAudio(avChannel, audioData, audioData.length);
   }
});

TK_playAudio

/**
 * 播放回音消除后的音频数据,一般用于第三方回音消除功能
 * <p>
 * 1、使用 {@link #TK_setAudioCustom} 告知底层不进行音频播放
 * 2、使用 {@link #TK_startSoundToPhone} 开启音频接收、解码(不再进行播放)
 * 3、使用 {@link #TK_registerMediaDataListener} 获取解码后的音频数据
 * 4、使用 本Api 播放回音消除后的音频数据
 *
 * @param bytes   audio数据
 * @param length  audio数据长度
 * @param channel 通道号
 * @param timestamp 相对时间戳
 * @see InterfaceCtrl.MediaDataListener#onRecvAudioFrame
 */
public abstract void TK_playAudio(int channel, byte[] bytes, int length, int timestamp);
示例:与TK_setAudioCustom示例一致

TK_sendAudio

/**
 * 发送回音消除后的音频数据,一般用于第三方回音消除功能
 * <p>
 * 1、使用 {@link #TK_setAudioCustom} 告知底层不进行音频编码以及发送
 * 2、使用 {@link #TK_startSoundToDevice} 开启音频采集(不再进行编码以及发送)
 * 3、使用 {@link #TK_registerMediaDataListener} 获取采集到的数据
 * 4、使用 本Api 发送回音消除后的音频数据
 *
 * @param avChannel 通道号
 * @param bytes     audio数据
 * @param length    audio数据长度
 * @see InterfaceCtrl.MediaDataListener#onSendAudioFrame
 */
public abstract void TK_sendAudio(int avChannel, byte[] bytes, int length);
示例:与TK_setAudioCustom示例一致

TK_setSoundToDeviceFormats

/**
 * 设置音频对讲格式、采样率等
 * <p>
 * 使用 {@link #TK_startSoundToDevice} 将采用本Api的配置
 *
 * @param channel         一般为0
 * @param audioSpeakCodec 音频编码格式
 *                        {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_AAC_RAW} 134
 *                        {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_AAC_ADTS} 135
 *                        {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_AAC_LATM} 136
 *                        {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_G711U} 137
 *                        {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_G711A} 138
 *                        {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_ADPCM} 139
 *                        {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_PCM} 140
 *                        {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_SPEEX} 141
 *                        {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_MP3} 142
 *                        {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_G726} 143
 * @param audioSampleRate 采样率
 *                        {@link com.tutk.IOTC.AVFrame#AUDIO_SAMPLE_8K} 8000
 *                        {@link com.tutk.IOTC.AVFrame#AUDIO_SAMPLE_16K} 16000
 * @param channelConfig   音频通道配置
 *                        {@link com.tutk.IOTC.AVFrame#AUDIO_CHANNEL_MONO} 0
 *                        {@link com.tutk.IOTC.AVFrame#AUDIO_CHANNEL_STERO} 1
 * @param audioDataBits   PCM数据位
 *                        {@link com.tutk.IOTC.AVFrame#AUDIO_DATABITS_8} 0
 *                        {@link com.tutk.IOTC.AVFrame#AUDIO_DATABITS_16} 1
 */
void TK_setSoundToDeviceFormats(int channel, int audioSpeakCodec, int audioSampleRate, int channelConfig, int audioDataBits);
示例:
camera.TK_setSoundToDeviceFormats(Camera.DEFAULT_AV_CHANNEL, AVFrame.AUDIO_CODEC_G711A, AVFrame.AUDIO_SAMPLE_8K, AVFrame.AUDIO_CHANNEL_MONO, AVFrame.AUDIO_DATABITS_16);

TK_getSoundToDeviceCodecId

/**
 * 获取音频对讲格式
 * <p>
 * 对应格式如下:
 * {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_AAC_RAW} 134
 * {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_AAC_ADTS} 135
 * {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_AAC_LATM} 136
 * {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_G711U} 137
 * {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_G711A} 138
 * {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_ADPCM} 139
 * {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_PCM} 140
 *
 * @param channel 一般为0
 * @return 返回音频格式
 */
int TK_getSoundToDeviceCodecId(int channel);
示例:
camera.TK_getSoundToDeviceCodecId(Camera.DEFAULT_AV_CHANNEL);

TK_getSoundToPhoneCodecId

/**
 * 获取音频监听格式
 * <p>
 * 对应格式如下:
 * {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_AAC_RAW} 134
 * {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_AAC_ADTS} 135
 * {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_AAC_LATM} 136
 * {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_G711U} 137
 * {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_G711A} 138
 * {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_ADPCM} 139
 * {@link com.tutk.IOTC.AVFrame#AUDIO_CODEC_PCM} 140
 *
 * @param channel 一般为0
 * @return 返回音频格式
 */
int TK_getSoundToPhoneCodecId(int channel);
示例:
camera.TK_getSoundToPhoneCodecId(Camera.DEFAULT_AV_CHANNEL);

TK_setSoundToDeviceCaptureSource

[android耳机适配示例.zip](https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=907628412187644f64f49a3363c1649d "[android耳机适配示例.zip")

/**
 * 设置音频对讲的采集源及采集音频增益,可以用来适配耳机功能(参考<android耳机适配示例>)
 * <p>
 * 使用 {@link #TK_startSoundToDevice} 将采用本Api的配置
 *
 * @param audioSource    音频采集源,默认为VOICE_COMMUNICATION
 *                       {@link android.media.MediaRecorder.AudioSource#MIC}
 *                       {@link android.media.MediaRecorder.AudioSource#VOICE_UPLINK}
 *                       {@link android.media.MediaRecorder.AudioSource#VOICE_DOWNLINK}
 *                       {@link android.media.MediaRecorder.AudioSource#VOICE_CALL}
 *                       {@link android.media.MediaRecorder.AudioSource#CAMCORDER}
 *                       {@link android.media.MediaRecorder.AudioSource#VOICE_RECOGNITION}
 *                       {@link android.media.MediaRecorder.AudioSource#VOICE_COMMUNICATION}
 * @param audioSpeakGain 音频增益,默认为2f
 */
public static void TK_setSoundToDeviceCaptureSource(int audioSource, float audioSpeakGain);
示例:
camera.TK_setSoundToDeviceCaptureSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION, 2f);

TK_setSoundToPhonePlaySource

[android耳机适配示例.zip](https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=907628412187644f64f49a3363c1649d "[android耳机适配示例.zip")

/**
 * 设置音频监听的播放源,可以用来适配耳机功能(参考<android耳机适配示例>)
 * <p>
 * 使用 {@link #TK_startSoundToPhone} 将采用本Api的配置
 *
 * @param audioStreamType 音频播放源,默认为STREAM_VOICE_CALL
 *                        {@link android.media.AudioManager#STREAM_VOICE_CALL}
 *                        {@link android.media.AudioManager#STREAM_SYSTEM}
 *                        {@link android.media.AudioManager#STREAM_RING}
 *                        {@link android.media.AudioManager#STREAM_MUSIC}
 *                        {@link android.media.AudioManager#STREAM_ALARM}
 *                        {@link android.media.AudioManager#STREAM_NOTIFICATION}
 */
public static void TK_setSoundToPhonePlaySource(int audioStreamType);
示例:
camera.TK_setSoundToPhonePlaySource(AudioManager.STREAM_VOICE_CALL);

1.6 录像与截图

TK_startRecording

/**
 * 开始录像
 * <p>
 * 会卡ui,请放子线程操作
 *
 * @param channel 一般为0
 * @param path    录像保存地址
 */
public abstract boolean TK_startRecording(int channel, String path);
示例:
camera.TK_startRecording(Camera.DEFAULT_AV_CHANNEL, path);

TK_stopRecording

/**
 * 停止录像
 */
public abstract boolean TK_stopRecording(int channel);
示例:
camera.TK_stopRecording(Camera.DEFAULT_AV_CHANNEL);

TK_snapshot

/**
 * 视频截图
 * <p>
 * 会卡ui,请放子线程操作
 *
 * @param channel      通道号
 * @param filePath     截图保存地址
 * @param bitmapPixels 图片像素最大值,0即代表默认最大值Long.MAX_VALUE
 * @return 是否截图成功
 */
public abstract boolean TK_snapshot(int channel, String filePath, long bitmapPixels);
示例:
camera.TK_snapshot(Camera.DEFAULT_AV_CHANNEL, path, 0);

1.7 指令发送

1.7.1 P2P

TK_sendIOCtrlToChannel

/**
 * 发送命令到Device
 *
 * @param avChannel 一般为0
 * @param type      command 类型
 * @param data      command 数据
 */
public abstract void TK_sendIOCtrlToChannel(int avChannel, int type, byte[] data);
示例:
camera.TK_sendIOCtrlToChannel(Camera.DEFAULT_AV_CHANNEL, 0x1ff, new byte[]{0, 0, 0, 0});

TK_sendJsonCtrlToChannel

/**
 * 发送json字串命令给设备
 *
 * @param avChannel    通道:一般为0
 * @param jsonRequest  发送的json字串
 * @param jsonResponse 设备回复的字串
 * @param timeoutSec   超时时间
 */
public abstract void TK_sendJsonCtrlToChannel(int avChannel, String jsonRequest, int timeoutSec);
示例:
camera.TK_sendJsonCtrlToChannel(Camera.DEFAULT_AV_CHANNEL, jsonRequest, 2);

TK_removeAllCmd

/**
 * 清除command队列
 */
public abstract void TK_removeAllCmd();
示例:
camera.TK_removeAllCmd();

1.7.2 Nebula

TK_nebulaSendData

/**
 * Nebula发送json command
 * <p>
 * 使用 {@link #TK_registerIOTCListener} 获取发送结果
 *
 * @param jsonRequest 发送的json字串
 * @param timeoutMs   超时时间
 * @see InterfaceCtrl.IOTCListener#sendJsonCtrlData
 */
void TK_nebulaSendData(String jsonRequest, int timeoutMs);
示例:
JSONObject jsonObject = new JSONObject();
try {
   JSONObject args = new JSONObject();
   args.put("value", true);
   jsonObject.put("func", "startVideo");
   jsonObject.put("args", args);
} catch (JSONException e) {
   e.printStackTrace();
}
camera.TK_nebulaSendData(jsonObject.toString(), 1000);

1.8 文件上传、下载

TK_startDownload

/**
 * 开始文件下载
 * <p>
 * 使用 {@link #TK_registerIOTCListener} 获取下载进度
 *
 * @param type    传输方式
 * @param dirPath 沙盒目录
 * @param channel 通道
 * @see InterfaceCtrl.IOTCListener#downloadUploadOutput
 */
void TK_startDownload(Camera.TKTransferType type, String dirPath, int channel);
示例:
//发送command获取设备文件名列表
TK_commandGetFileList(channel, startTime, endTime, fileType, new CommandListener<CommandGetListFile>() {
   @Override
   public void onResponse(@Nullable CommandGetListFile command) {
      //发送command获取设备下载通道列表
      TK_commandDownloadFile(command.list, new CommandListener<CommandDownloadFile>() {
         @Override
         public void onResponse(@Nullable CommandDownloadFile command) {

            //开始文件下载
            String dirPath = "/sdcard/Android/data/com.tutk.kalay/file";
            for (Integer channel : command.list) {
               camera.TK_startDownload(TKTransferType.valueOf(String.valueOf(command.type)), dirPath, channel);
            }
         }
      });
   }
});

TK_stopDownload

/**
 * 停止文件下载
 *
 * @param type    传输方式
 * @param channel 通道
 */
void TK_stopDownload(Camera.TKTransferType type, int channel);

TK_startUpload

/**
 * 开始文件上传
 * <p>
 * 使用 {@link #TK_registerIOTCListener} 获取上传进度
 *
 * @param type     传输方式
 * @param filePath 文件完整沙盒路径
 * @param channel  通道
 * @see InterfaceCtrl.IOTCListener#downloadUploadOutput
 */
void TK_startUpload(Camera.TKTransferType type, String filePath, int channel);
示例:
//文件上传list
ArrayList<String> filePathList = new ArrayList();
filePathList.add("/sdcard/Android/data/com.tutk.kalay/file1.mp4");
filePathList.add("/sdcard/Android/data/com.tutk.kalay/file2.jpg");
filePathList.add("/sdcard/Android/data/com.tutk.kalay/file3.zip");
filePathList.add("/sdcard/Android/data/com.tutk.kalay/file4.mp3");
//获取设备上传通道列表
TK_commandUploadFile(filePathList, new CommandListener<CommandUploadFile>() {
   @Override
   public void onResponse(@Nullable CommandUploadFile command) {
      //开始文件上传
      int index = -1;
      for (Integer channel : command.list) {
         index++;
         if (index >= command.list.size()) {
            index = 0;
         }
         TK_startUpload(TKTransferType.valueOf(String.valueOf(command.type)), filePathList.get(index), channel);
      }
   }
});

TK_stopUpload

/**
 * 停止文件上传
 *
 * @param type    传输方式
 * @param channel 通道
 */
void TK_stopUpload(Camera.TKTransferType type, int channel);

二、KalayCameraControl(指令封装)

2.1 TK_commandSetRecord

/**
 * 设定设备SD卡录像模式
 *
 * @param channel    Camera Index
 * @param recordType 参考{@link AVIOCTRLDEFs#AVIOTC_RECORDTYPE_OFF}
 */
public void TK_commandSetRecord(int channel, int recordType, CommandListener<CommandSetRecord> listener)

2.2 TK_commandGetRecord

/**
 * 获取设备目前SD卡录像模式
 *
 * @param channel Camera Index
 */
public void TK_commandGetRecord(int channel, CommandListener<CommandGetRecordMode> listener)

2.3 TK_commandListEvent

/**
 * 获取设备事件列表
 *
 * @param channel   Camera Index
 * @param startTime 搜寻事件的起始时间 ms
 * @param endTime   搜寻事件的结束时间 ms
 * @param event     事件类型,参考参考{@link AVIOCTRLDEFs#AVIOCTRL_EVENT_ALL}
 */
public void TK_commandListEvent(int channel, long startTime, long endTime, int event, CommandListener<CommandListEvent> listener)

2.4 TK_commandRecordPlayControl

/**
 * 事件回播控制播放
 *
 * @param channel      Camera Index
 * @param command      播放记录指令,参考{@link AVIOCTRLDEFs#AVIOCTRL_RECORD_PLAY_PAUSE}
 * @param param        指令参数,由用户自定义。no use for Nebula
 * @param time         事件列表起始时间。no use for Nebula
 * @param endflag      0 app, 事件播放完毕; 1 web, 当此事件播放完毕时继续播下一个事件。no use for Nebula
 * @param downloadFlag 0 回放模式, 1 下载模式。no use for Nebula
 * @param fileName     文件名。no use for AvApi
 */
public void TK_commandRecordPlayControl(int channel, int command, int param, long time, int endflag, int downloadFlag, String fileName, CommandListener<CommandRecordPlayControl> listener)

2.5 TK_commandSetStreamCtrl

/**
 * 设置设备解析度
 *
 * @param channel Camera Index
 * @param quality 参考{@link AVIOCTRLDEFs#AVIOCTRL_QUALITY_MAX}
 */
public void TK_commandSetStreamCtrl(int channel, int quality, CommandListener<CommandSetStreamCtrl> listener)

2.6 TK_commandGetStreamCtrl

/**
 * 获取设备目前解析度
 *
 * @param channel Camera Index
 */
public void TK_commandGetStreamCtrl(int channel, CommandListener<CommandGetStreamCtrl> listener)

2.7 TK_commandSetMotionDetect

/**
 * 设置设备位移侦测之灵敏度
 *
 * @param channel     Camera Index
 * @param sensitivity 0 (禁用) ~ 100(嘴大):
 *                    Index in App. 灵敏度值
 *                    0              0(关闭)
 *                    1              25(低)
 *                    2              50(中)
 *                    3              75(高)
 *                    4              100(最高)
 */
public void TK_commandSetMotionDetect(int channel, int sensitivity, CommandListener<CommandSetMotionDetect> listener)

2.8 TK_commandGetMotionDetect

/**
 * 获取设备目前位移侦测之灵敏度
 *
 * @param channel Camera Index
 */
public void TK_commandGetMotionDetect(int channel, CommandListener<CommandGetMotionDetect> listener)

2.9 TK_commandGetSupportStream

/**
 * 获取目前设备通道数
 */
public void TK_commandGetSupportStream(CommandListener<CommandGetSupportStream> listener)

2.10 TK_commandGetAudioOutFormat

/**
 * 获取设备音讯格式
 *
 * @param channel Camera Index
 */
public void TK_commandGetAudioOutFormat(int channel, CommandListener<CommandGetAudioOutFormat> listener)

2.11 TK_commandSetPassword

/**
 * 变更设备密码
 *
 * @param oldPwd 旧密码
 * @param newPwd 新密码
 */
public void TK_commandSetPassword(String oldPwd, String newPwd, CommandListener<CommandSetPassword> listener)

2.12 TK_commandGetRecordDuration

/**
 * 获取sd卡事件总时长
 *
 * @param channel   Camera Index
 * @param eventTime 事件时间
 */
public void TK_commandGetRecordDuration(int channel, long eventTime, CommandListener<CommandGetRecordDuration> listener)

2.13 TK_commandSetRecordProgress

/**
 * 设置回放事件进度
 *
 * @param channel   Camera Index
 * @param eventTime 事件时间
 */
public void TK_commandSetRecordProgress(int channel, long eventTime, int progressTime, CommandListener<CommandSetRecordProgress> listener)

2.14 TK_commandListWifiAp

/**
 * 获取设备周围Wifi列表
 */
public void TK_commandListWifiAp(CommandListener<CommandListWifiAp> listener)

2.15 TK_commandSetWifi

/**
 * 设定设备的Wifi网络
 *
 * @param ssid     WiFi SSID
 * @param password WiFi密码
 * @param mode     参考 {@link AVIOCTRLDEFs#AVIOTC_WIFIAPMODE_NULL}
 * @param enctype  参考 {@link AVIOCTRLDEFs#AVIOTC_WIFIAPENC_INVALID}
 */
public void TK_commandSetWifi(String ssid, String password, int mode, int enctype, CommandListener<CommandSetWifi> listener)

2.16 TK_commandGetWifi

/**
 * 获取设备目前所设置的WiFi
 */
public void TK_commandGetWifi(CommandListener<CommandGetWifi> listener)

2.17 TK_commandSetVideoMode

/**
 * 设置画面镜像/翻转状态
 *
 * @param channel Camera Index
 * @param mode    参考{@link AVIOCTRLDEFs#AVIOCTRL_VIDEOMODE_NORMAL}
 */
public void TK_commandSetVideoMode(int channel, int mode, CommandListener<CommandSetVideoMode> listener)

2.18 TK_commandGetVideoMode

/**
 * 获取画面镜像/翻转设置状态
 */
public void TK_commandGetVideoMode(int channel, CommandListener<CommandGetVideoMode> listener)

2.19 TK_commandFormatExtStorage

/**
 * 格式化SD卡
 *
 * @param Storage index(例如sdcard插槽= 0,内部闪存= 1,...)
 */
public void TK_commandFormatExtStorage(int Storage, CommandListener<CommandFormatExtStorage> listener)

2.20 TK_commandGetChannelName

/**
 * 获取所有通道名称
 */
public void TK_commandGetChannelName(CommandListener<CommandGetChannelName> listener)

2.21 TK_commandSetChannelName

/**
 * 设置通道名称
 *
 * @param channel Camera Index
 * @param name    名称
 */
public void TK_commandSetChannelName(int channel, String name, CommandListener<CommandSetChannelName> listener)

2.22 TK_commandXmCall

/**
 * 门铃接听,当收到设备门铃呼叫command,使用此api进行回复
 *
 * @param channel Camera Index
 * @param answer  0:挂断;1:接听
 */
public void TK_commandXmCall(int channel, int answer, CommandListener<CommandXmCall> listener)

2.23 TK_commandSetName

/**
 * 设置设备名称
 *
 * @param channel Camera Index
 * @param name    名称
 */
public void TK_commandSetName(int channel, String name, CommandListener<CommandSetName> listener)

2.24 TK_commandSetTimeSync

/**
 * 同步手机时间给设备
 *
 * @param isSupportSync 1 支持; 0 不支持
 * @param gmtOffset     GMT之间的偏移量(以秒为单位)
 */
public void TK_commandSetTimeSync(int year, int month, int day, int hour, int minute, int second, int isSupportSync, int gmtOffset, CommandListener<CommandSetTimeSync> listener)

2.25 TK_commandSetPtz

/**
 * 云台控制
 *
 * @param channel Camera Index
 * @param control 参考{@link AVIOCTRLDEFs#AVIOCTRL_PTZ_UP}
 * @param speed   云台转动的速度
 */
public void TK_commandSetPtz(int channel, int control, int speed, CommandListener<CommandPtz> listener)

2.26 TK_commandOta

/**
 * OTA升级
 *
 * @param url          下载固件url链接
 * @param fileChecksum MD5校验码
 * @param fileSize     固件包大小
 */
public void TK_commandOta(String url, String fileChecksum, int fileSize, CommandListener<CommandOta> listener)

2.27 TK_commandDeviceInfo

/**
 * 获取设备信息
 */
public void TK_commandDeviceInfo(CommandListener<CommandDeviceInfo> listener)

2.28 TK_commandDeviceSupportOta

/**
 * 获取设备是否支持OTA升级
 */
public void TK_commandDeviceSupportOta(CommandListener<CommandDeviceSupportOta> listener)

2.29 TK_commandDeviceSupportCloud

/**
 * 获取设备是否支持云存储
 */
public void TK_commandDeviceSupportCloud(CommandListener<CommandDeviceSupportCloud> listener)

2.30 TK_commandDeviceSetCloud

/**
 * 设置设备云存储录像状态
 *
 * @param channel Camera Index
 * @param isOn    1 开启, 0 关闭
 */
public void TK_commandDeviceSetCloud(int channel, int isOn, CommandListener<CommandDeviceSetCloud> listener)

2.31 TK_commandDeviceGetCloud

/**
 * 获取设备云存储录像状态
 *
 * @param channel Camera Index
 */
public void TK_commandDeviceGetCloud(int channel, CommandListener<CommandDeviceGetCloud> listener)

2.32 TK_commandGetEventDate

/**
 * 获取有SD卡事件的日期
 *
 * @param channel   Camera Index
 * @param eventType 查询的事件类型,0:全部,1:移动侦测;2:全时录像,默认是0
 * @param startTime 开始时间 ms
 * @param endTime   结束时间 ms
 */
public void TK_commandGetEventDate(int channel, int eventType, long startTime, long endTime, CommandListener<CommandGetEventDate> listener)

2.33 TK_commandGetHumanDetection

/**
 * 获取设备人形侦测开关
 */
public void TK_commandGetHumanDetection(CommandListener<CommandGetHumanDetection> listener)

2.34 TK_commandSetHumanDetection

/**
 * 设置设备人形侦测开关
 *
 * @param isOn 1 开启, 0 关闭
 */
public void TK_commandSetHumanDetection(int isOn, CommandListener<CommandSetHumanDetection> listener)

2.35 TK_commandGetNightVision

/**
 * 获取设备夜视开关
 */
public void TK_commandGetNightVision(CommandListener<CommandGetNightVision> listener)

2.36 TK_commandSetNightVision

/**
 * 设置设备夜视开关
 *
 * @param isOn 1 开启, 0 关闭
 */
public void TK_commandSetNightVision(int isOn, CommandListener<CommandSetNightVision> listener)

2.37 TK_commandGetSummerTime

/**
 * 获取设备夏令时开关
 */
public void TK_commandGetSummerTime(CommandListener<CommandGetSummerTime> listener)

2.38 TK_commandSetSummerTime

/**
 * 设置设备夏令时开关
 *
 * @param isOn 1 开启, 0 关闭
 */
public void TK_commandSetSummerTime(int isOn, CommandListener<CommandSetSummerTime> listener)

三、Command使用以及封装示例

3.1 定义Command及结构体

APP发送Command获取灯控开关状态:IOTYPE_GET_LED_REQ = 0x30000001
  typedef struct
  {
  unsigned int channel;       //当前通道号
  unsigned char reserved[4];
  }SMsgAVIoctrlGetLedReq;
设备端回复灯控开关状态:IOTYPE_GET_LED_RESP = 0x30000002
  typedef struct
  {
  int result;        //0:成功,  其他失败
  unsigned char isOnOff;        // 0:开启; 1:关闭
  unsigned char reserved[3];
  }SMsgAVIoctrlGetLedResp;

3.2 将结构体封装成byte[]数据进行发送

//在结构体SMsgAVIoctrlGetLedReq中,因为int占4个字节,char占一个字节,所以发送出去的bytes大小为4 + 1*4 = 8
byte[] request = new byte[8];
//将int类型的channel数据转换为byte并复制数据到request数组中
byte[] channelBytes = Packet.intToByteArray_Little(channel);
System.arraycopy(channelBytes, 0, request, 0, 4);
//将封装好的byte[]数据通过api发送给设备
camera.TK_sendIOCtrlToChannel(Camera.DEFAULT_AV_CHANNEL, IOTYPE_GET_LED_REQ, request);

3.3 通过回调接收到设备回复的数据,进行解析

camera.TK_registerIOTCListener(new InterfaceCtrl.SimpleIOTCListener() {

   @Override
  public void receiveIOCtrlData(Camera camera, int avChannel, int avIOCtrlMsgType, byte[] data) {
      if (avIOCtrlMsgType == IOTYPE_GET_LED_RESP) {
        //在结构体SMsgAVIoctrlGetLedResp中,因为int占4个字节,char占一个字节,所以接收到的bytes大小为4 + 1 + 1*3 = 8
        //其中,前面4个字节代表设备回复的result信息,第五个字节代表设备回复的isOnOff信息,后面三个字节代表保留位无需解析
        //1、解析result信息
        int result = Packet.byteArrayToInt(data, 0);
        //2、解析isOnOff信息
        int isOnOff = (int)data[4];
      }
   }
});

3.4 byte[]数据类型转换Api

参考Android Psc的AVIOCTRLDEF模块,com.tutk.IOTC.Packet类包含各种数据转换Api

四、VideoMonitor(播放器)

4.1 Method

TK_attachCamera

/**
 * 为播放器绑定Camera实例
 *
 * @param camera    Camera实例
 * @param avChannel 一般为0
 */
public void TK_attachCamera(Camera camera, int avChannel)
示例:
videoMonitor.TK_attachCamera(camera, Camera.DEFAULT_AV_CHANNEL);

TK_deattachCamera

/**
 * 播放器解绑Camera
 */
public void TK_deattachCamera()
示例:
videoMonitor.TK_deattachCamera();

setScaleType

/**
 * 选择控件自动缩放方式,默认为SCALE_ASPECT
 *
 * @see ScaleType#SCALE_ASPECT,视频画面保持宽高比
 * @see ScaleType#SCALE_ASPECT_FILL,视频画面铺满屏幕
 */
public void setScaleType(ScaleType scaleType)
示例:
videoMonitor.setScaleType(ScaleType.SCALE_ASPECT);

4.2 回调接口

TK_setMonitorListener

/**
 * 播放器状态监听
 */
public void TK_setMonitorListener(InterfaceCtrl.MonitorListener listener)
public interface MonitorListener {

   /**
    * 播放器的点击事件
    */
   void onClick();

   /**
    * 播放器已准备好出图
    *
    * @param channel          一般为0
    * @param isSoftwareDecode 是否软解码
    */
   void onReady(int channel, boolean isSoftwareDecode);

   /**
    * 播放器缩放的倍数传递给UI层
    *
    * @param scaleLevel 缩放的倍数
    */
   void onScale(float scaleLevel);

}
示例:
videoMonitor.TK_setMonitorListener(new InterfaceCtrl.SimpleMonitorListener());

五、连线Demo

布局代码

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.tutk.IOTC.VideoMonitor
        android:id="@+id/videoMonitor"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

java代码

public class TestActivity extends Activity {

   private final Camera camera = new Camera();

   private VideoMonitor videoMonitor;

   @Override
   protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_test);

      //绑定camera
      videoMonitor = (VideoMonitor) findViewById(R.id.videoMonitor);
      videoMonitor.TK_attachCamera(camera, Camera.DEFAULT_AV_CHANNEL);

      //IOTC初始化
      Camera.TK_initIOTC(this, privateKey, sdkLicenseKey, new TK_Listener() {
         @Override
         public void success() {
            //连线Device
            camera.TK_connect(uid);
            camera.TK_registerIOTCListener(mListener);
         }

         @Override
         public void failure(int Error) {

         }

         @Override
         public void doInBackground() {

         }
      });
   }

   @Override
   protected void onDestroy() {
      super.onDestroy();
      //解绑
      videoMonitor.TK_deattachCamera();
      //移除回调
      camera.TK_unregisterIOTCListener(mListener);
      //断线
      camera.TK_disconnect();
      //反初始化
      Camera.TK_unInitIOTC();
   }

   private final InterfaceCtrl.IOTCListener mListener = new InterfaceCtrl.SimpleIOTCListener() {
      @Override
      public void receiveSessionInfo(Camera camera, int resultCode) {
         if (resultCode == Camera.CONNECTION_STATE_CONNECTED) {
            //连线AV通道
            camera.TK_start(Camera.DEFAULT_AV_CHANNEL, password);
         }
      }

      @Override
      public void receiveChannelInfo(Camera camera, int avChannel, int resultCode) {
         if (resultCode == Camera.CONNECTION_STATE_CONNECTED) {
            //开始视频流
            camera.TK_startShow(Camera.DEFAULT_AV_CHANNEL);
         }
      }
   };
}

页面列表

ITEM_HTML