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