Android API
<p>[TOC]</p>
<h1>一、IOTCamera</h1>
<h2>1.1 初始化接口、静态API</h2>
<h3>TK_initIOTC</h3>
<pre><code class="language-java">/**
* IOTC初始化
* &lt;p&gt;
* 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);</code></pre>
<pre><code class="language-java">TK_Listener#Response对象说明
public class Response {
/**
* 1、当访问privateKey检查服务Domain失败时,返回http response string
* 2、当访问成功时,返回response string中的msg字段
* 3、当P2P初始化失败时,返回P2P失败msg
*/
@Nullable
public String msg;
/**
* privateKey检查服务Domain的实际IP
*/
@Nullable
public String ip;
/**
* 1、当访问privateKey检查服务Domain失败时,返回http error code
* 2、当访问成功时,返回response string中的code字段,ex:-10000(privateKey无效)、10001(privateKey永久)、10002(privateKey有效期内)、-10003(privateKey过期)、
* 3、当P2P初始化失败时,返回P2P失败code,ex:-1004(sdkkey无效)、-1005(sdkkey无效)、-3(重复初始化)、-20031(重复初始化)、-40032(重复初始化)
*/
public int code;
@Override
public String toString() {
return &quot;code = &quot; + code + &quot;, ip = &quot; + ip + &quot;, msg = &quot; + msg;
}
}</code></pre>
<pre><code class="language-java">示例:
Camera.TK_initIOTC(context, privateKey, sdkLicensekey, new TK_Listener() {
@Override
public void success(Response response) {
//success
}
@Override
public void failure(Response response) {
//error
}
@Override
public void doInBackground() {
}
});</code></pre>
<pre><code>备注:假如app应用使用的Android SDK是大于27(即使用9.0以上的SDK)则需要在AndroidManifest.xml的application里添加参数android:usesCleartextTraffic=&quot;true&quot;
否则会初始化不成功;
例如:
&lt;application
android:icon=&quot;@mipmap/ic_launcher&quot;
android:label=&quot;@string/app_name&quot;
android:roundIcon=&quot;@mipmap/ic_launcher&quot;
android:usesCleartextTraffic=&quot;true&quot;
android:theme=&quot;@style/AppTheme&quot;&gt;
&lt;/application&gt;</code></pre>
<p>> 注:调用TK_initIOTC时返回-10000, 是因为privateKey无效导致,遇到该问题时建议:</p>
<ul>
<li>确认当前项目使用的包名与privateKey是否与TUTK提供的一致,如不一致,请修改为TUTK提供的包名与privateKey重新运行;</li>
<li>如需更改包名与privateKey,请联系商务或者技术支持人员。</li>
</ul>
<h3>TK_unInitIOTC</h3>
<pre><code class="language-java">/**
* IOTC反初始化
*/
public synchronized static int TK_unInitIOTC();</code></pre>
<pre><code class="language-java">示例:
Camera.TK_unInitIOTC();</code></pre>
<h3>TK_setMasterRegion</h3>
<pre><code class="language-java">/**
* P2P分区分流
* &lt;p&gt;
* 需要在{@link #TK_initIOTC}之前进行调用
*
* @param region 0:全部;1:大中华地区;2:欧洲;3:美洲。
*/
public static void TK_setMasterRegion(int region);</code></pre>
<pre><code class="language-java">示例:
Camera.TK_setMasterRegion(1);</code></pre>
<h3>TK_getIOTCameraVersion</h3>
<pre><code class="language-java">/**
* 获取IOTCamera版本号
*/
public static String TK_getIOTCameraVersion();</code></pre>
<pre><code class="language-java">示例:
Camera.TK_getIOTCameraVersion();</code></pre>
<h3>TK_getIOTCAPIsVerion</h3>
<pre><code class="language-java">/**
* 返回IOTCAPI的版本号
*/
public static String TK_getIOTCAPIsVerion();</code></pre>
<pre><code class="language-java">示例:
Camera.TK_getIOTCAPIsVerion();</code></pre>
<h3>TK_getAVAPIsVersion</h3>
<pre><code class="language-java">/**
* 返回AVAPI的版本号
*/
public static String TK_getAVAPIsVersion();</code></pre>
<pre><code class="language-java">示例:
Camera.TK_getAVAPIsVersion();</code></pre>
<h3>TK_LanSearch</h3>
<pre><code class="language-java">/**
* 本地搜索设备
*
* @param timeoutMs 搜索超时时间
* @return 本地网络下搜索到的设备信息
*/
public static st_LanSearchInfo[] TK_LanSearch(int timeoutMs);</code></pre>
<pre><code class="language-java">示例:
st_LanSearchInfo[] arrResp = Camera.TK_LanSearch(2000);
if (arrResp != null) {
for (st_LanSearchInfo info : arrResp) {
Log.i(TAG, &quot;uid: &quot; + new String(info.UID) + &quot; ip:&quot; + new String(info.IP));
}
}</code></pre>
<h3>TK_setLogEnable</h3>
<pre><code class="language-java">/**
* 设置log记录
*
* @param enable 是否开启log记录
* @param path 设置path后,log沙盒存储路径为
* &lt;path&gt;/yyyy-MM-dd/HH:mm:ss/Console.txt
* &lt;path&gt;/yyyy-MM-dd/HH:mm:ss/IOTC.txt
* &lt;path&gt;/yyyy-MM-dd/HH:mm:ss/AVAPI.txt
* &lt;path&gt;/yyyy-MM-dd/HH:mm:ss/RDT.txt
* &lt;path&gt;/yyyy-MM-dd/HH:mm:ss/Global.txt
* @param level log等级
*/
public static void TK_setLogEnable(boolean enable, String path, LogLevel level);
</code></pre>
<h2>1.2 回调接口</h2>
<h3>1.2.1 P2P回调接口</h3>
<h4>TK_registerIOTCListener</h4>
<pre><code class="language-java">/**
* 注册IOTC回调
*/
public boolean TK_registerIOTCListener(InterfaceCtrl.IOTCListener listener);
/**
* 注销IOTC回调
*/
public boolean TK_unregisterIOTCListener(InterfaceCtrl.IOTCListener listener);</code></pre>
<pre><code class="language-java">public interface IOTCListener {
/**
* nebula绑定信息回调
* &lt;p&gt;
* 当调用{@link com.tutk.IOTC.Camera#TK_nebulaStartBind}后,回调连线结果
*
* @param camera
* @param credential 绑定结果,绑定失败时为null
* @param resultCode resultCode 绑定结果
* @param p2pCode p2p返回值
*/
void receiveBindInfo(Camera camera, String credential, int resultCode, int p2pCode);
/**
* IOTC连线信息回调
* &lt;p&gt;
* 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通道连线信息回调
* &lt;p&gt;
* 当调用{@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);
/**
* 对讲是否成功回调
* &lt;p&gt;
* 当调用{@link com.tutk.IOTC.Camera#TK_startSoundToDevice}后,回调是否对讲成功
*
* @param camera
* @param avChannel av通道
* @param avIndex 对讲的avIndex
* @param success 是否对讲成功
*/
void receiveSoundToDevice(Camera camera, int avChannel, int avIndex, boolean success);
/**
* 视频发送是否成功回调
* &lt;p&gt;
* 当调用{@link com.tutk.IOTC.Camera#TK_client_startSendVideo}后,回调是否发送成功
*
* @param camera
* @param avChannel av通道
* @param avIndex 发送的avIndex
* @param success 是否发送成功
*/
void receiveVideoToDevice(Camera camera, int avChannel, int avIndex, boolean success);
/**
* 监听是否成功回调
* &lt;p&gt;
* 当调用{@link com.tutk.IOTC.Camera#TK_startSoundToPhone}后,回调是否监听成功
*
* @param camera
* @param avChannel av通道
* @param success 是否监听成功
*/
void receiveSoundToPhone(Camera camera, int avChannel, boolean success);
/**
* 接收Command信息回调
* &lt;p&gt;
* 连线成功之后,当收到设备发过来指令后,回调指令数据
*
* @param camera
* @param avChannel av通道
* @param avIOCtrlMsgType 接收到的信息类型
* @param data 接收到的信息
*/
void receiveIOCtrlData(Camera camera, int avChannel, int avIOCtrlMsgType, byte[] data);
/**
* 发送Command调试信息回调
* &lt;p&gt;
* 连线成功之后,当调用{@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调试信息回调
* &lt;p&gt;
* 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);
/**
* 文件上传、下载回调
* &lt;p&gt;
* 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);
}</code></pre>
<pre><code class="language-java">示例:
Camera camera = new Camera();
camera.TK_registerIOTCListener(new SimpleIOTCListener());</code></pre>
<table>
<thead>
<tr>
<th>resultCode 连线结果</th>
<th>定义</th>
</tr>
</thead>
<tbody>
<tr>
<td>CONNECTION_STATE_CONNECTING = 1</td>
<td>连线中</td>
</tr>
<tr>
<td>CONNECTION_STATE_CONNECTED = 2</td>
<td>连线成功</td>
</tr>
<tr>
<td>CONNECTION_STATE_DISCONNECTED = 3</td>
<td>断线</td>
</tr>
<tr>
<td>CONNECTION_STATE_UNKNOWN_DEVICE = 4</td>
<td>未知设备</td>
</tr>
<tr>
<td>CONNECTION_STATE_WRONG_PASSWORD = 5</td>
<td>密码错误</td>
</tr>
<tr>
<td>CONNECTION_STATE_TIMEOUT = 6</td>
<td>连线超时</td>
</tr>
<tr>
<td>CONNECTION_STATE_UNSUPPORTED = 7</td>
<td>设备不支持连线</td>
</tr>
<tr>
<td>CONNECTION_STATE_CONNECT_FAILED = 8</td>
<td>连线失败</td>
</tr>
<tr>
<td>CONNECTION_STATE_UNKNOWN_LICENSE = 9</td>
<td>设备uid未在license中</td>
</tr>
<tr>
<td>CONNECTION_STATE_SLEEP = 10</td>
<td>设备睡眠状态</td>
</tr>
<tr>
<td>CONNECTION_STATE_DEVICE_MAX_SESSION = 11</td>
<td>超过设备最大连线数</td>
</tr>
<tr>
<td>CONNECTION_STATE_POOR_NETWORKSIGNA = 12</td>
<td>网络信号差</td>
</tr>
<tr>
<td>CONNECTION_STATE_WRONG_AUTH_KEY = 13</td>
<td>AuthKey错误</td>
</tr>
<tr>
<td>CONNECTION_STATE_SELF_DISCONNECT = 14</td>
<td>在连线过程中App主动进行断线</td>
</tr>
</tbody>
</table>
<h3>1.2.2 音视频回调接口</h3>
<h4>TK_registerMediaDataListener</h4>
<pre><code class="language-java">/**
* 注册音视频数据回调
*/
public boolean TK_registerMediaDataListener(InterfaceCtrl.MediaDataListener listener);
/**
* 注销音视频数据回调
*/
public boolean TK_unregisterMediaDataListener(InterfaceCtrl.MediaDataListener listener);</code></pre>
<pre><code class="language-java">public interface MediaDataListener {
/**
* 视频解码数据回调
* &lt;p&gt;
* 当调用{@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);
/**
* 视频接收原始数据回调
* &lt;p&gt;
* 当调用{@link com.tutk.IOTC.Camera#TK_startShow}后,回调视频接收信息
*
* @param avFrame 接收当前帧
*/
void onRecvVideoFrame(Camera camera, int avChannel, AVFrame avFrame);
/**
* 视频调试信息回调
* &lt;p&gt;
* 当调用{@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);
/**
* 视频发送数据回调
* &lt;p&gt;
* 当调用{@link com.tutk.IOTC.Camera#TK_client_startSendVideo}后,回调视频编码后发送的数据
*
* @param avChannel av通道 一般为0
* @param avFrame 发送当前帧
*/
void onSendVideoFrame(Camera camera, int avChannel, AVFrame avFrame);
/**
* 音频解码数据回调
* &lt;p&gt;
* 当调用{@link com.tutk.IOTC.Camera#TK_startSoundToPhone}后,回调解码信息
*
* @param avFrame 解码当前帧
* @param decodeAfter 解码后的PCM数据
*/
void onDecodeAudioData(Camera camera, int avChannel, AVFrame avFrame, byte[] decodeAfter);
/**
* 音频接收原始数据回调
* &lt;p&gt;
* 当调用{@link com.tutk.IOTC.Camera#TK_startSoundToPhone}后,回调音频接收信息
*
* @param avChannel av通道 一般为0
* @param avFrame 接收当前帧
*/
void onRecvAudioFrame(Camera camera, int avChannel, AVFrame avFrame);
/**
* 音频采集原始数据回调
* &lt;p&gt;
* 当调用{@link com.tutk.IOTC.Camera#TK_startSoundToDevice}后,回调音频采集信息
*
* @param avChannel av通道 一般为0
* @param avFrame 发送当前帧
*/
void onSendAudioFrame(Camera camera, int avChannel, AVFrame avFrame);
}</code></pre>
<pre><code class="language-java">示例:
Camera camera = new Camera();
camera.TK_registerIOTCListener(new SimpleMediaDataListener());</code></pre>
<h2>1.3 连线处理</h2>
<h3>1.3.1 P2P</h3>
<h4>TK_connect</h4>
<pre><code class="language-java">/**
* 连线Device
* &lt;p&gt;
* 连线结果使用{@link #TK_registerIOTCListener}进行获取
*
* @param uid 20位uid序列号
* @see InterfaceCtrl.IOTCListener#receiveSessionInfo
*/
public abstract void TK_connect(String uid);
/**
* 连线Device
* &lt;p&gt;
* 连线结果使用{@link #TK_registerIOTCListener}进行获取
*
* @param uid 20位uid序列号
* @param authKey 连线认证的authKey
* @see InterfaceCtrl.IOTCListener#receiveSessionInfo
*/
public abstract void TK_connect(String uid, String authKey);</code></pre>
<pre><code class="language-java">示例:
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) {
//连线成功
}
}
});</code></pre>
<h3>1.3.2 Nebula</h3>
<h4>TK_nebulaStartBind</h4>
<pre><code class="language-java">/**
* Nebula开始绑定设备
* &lt;p&gt;
* 使用 {@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);</code></pre>
<pre><code class="language-java">示例:
camera.TK_nebulaStartBind(udid, Camera.BindType.PIN_CODE, &quot;123456&quot;);
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
}
}
});</code></pre>
<h4>TK_nebulaStopBind</h4>
<pre><code class="language-java">/**
* Nebula停止绑定设备
*/
void TK_nebulaStopBind();</code></pre>
<h4>TK_nebulaConnect</h4>
<pre><code class="language-java">/**
* Nebula连线设备
* &lt;p&gt;
* 使用 {@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连线设备
* &lt;p&gt;
* 使用 {@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);</code></pre>
<pre><code class="language-java">示例:
camera.TK_nebulaBind(udid, Camera.BindType.PIN_CODE, &quot;123456&quot;);
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
}
}
});</code></pre>
<h4>TK_nebulaLanSearch</h4>
<pre><code class="language-java">/**
* Nebula AP模式添加时,搜索本地udid列表
* &lt;p&gt;
* 仅用于AP模式添加流程
*
* @param timeoutMs 超时时间
* @return udid列表
*/
public static st_UDIDInfo[] TK_nebulaLanSearch(int timeoutMs)</code></pre>
<pre><code class="language-java">示例:
st_UDIDInfo[] lanSearch = Camera.TK_nebulaLanSearch(5 * 1000);
if (lanSearch != null &amp;&amp; lanSearch.length &gt; 0) {
String udid = new String(lanSearch[0].UDID);
} else {
Log.e(TAG, &quot;TK_nebulaLanSearch lanSearch = null&quot;);
}</code></pre>
<h4>TK_nebulaSsidListReq</h4>
<pre><code class="language-java">/**
* Nebula AP模式添加时,发送本地指令,获取设备wifi列表
* &lt;p&gt;
* 需要先调用 {@link #TK_nebulaStartBind} 进行AP模式绑定
*
* @return wifi列表
*/
List&lt;NebulaWiFiConfig.NebulaIOCtrlMsgSSIDListResp&gt; TK_nebulaSsidListReq();</code></pre>
<h4>TK_nebulaSetWifiReq</h4>
<pre><code class="language-java">/**
* Nebula AP模式添加时,发送本地指令,给设备设置wifi
* &lt;p&gt;
* 需要先调用 {@link #TK_nebulaSsidListReq} 获取wifi信息
*
* @param wifi wifi信息
* @param password 设备密码
* @return 设置结果
*/
NebulaWiFiConfig.NebulaIOCtrlMsgSetWifiResp TK_nebulaSetWifiReq(NebulaWiFiConfig.NebulaIOCtrlMsgSSIDListResp wifi, String password);</code></pre>
<h4>TK_nebulaSetRegionReq</h4>
<pre><code class="language-java">/**
* Nebula AP模式添加时,发送本地指令,给设备设置P2P分区分流
* &lt;p&gt;
* 需要先调用 {@link #TK_nebulaStartBind} 进行AP模式绑定
*
* @param region 0:全部;1:大中华地区;2:欧洲;3:美洲。
* @return 设置结果
*/
NebulaWiFiConfig.NebulaIOCtrlMsgSetRegionResp TK_nebulaSetRegionReq(TUTKRegion region);</code></pre>
<h3>1.3.3 共有</h3>
<h4>TK_disconnect</h4>
<pre><code class="language-java">/**
* 断线Device,同时断开内部所有AV通道
*/
public abstract void TK_disconnect();</code></pre>
<pre><code class="language-java">示例:
camera.TK_disconnect();</code></pre>
<h4>TK_start</h4>
<pre><code class="language-java">/**
* 连线AV通道
* &lt;p&gt;
* 1、SecurityMode加密模式会优先使用上次连线成功后的方式,默认为AUTO(2)
* 2、AuthType认证方式默认为PASSWORD(0)方式
* &lt;p&gt;
* 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通道
* &lt;p&gt;
* 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);</code></pre>
<pre><code class="language-java">示例:
Camera camera = new Camera();
camera.TK_connect(uid, authKey);
camera.TK_start(Camera.DEFAULT_AV_CHANNEL, password, &quot;admin&quot;, 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通道成功
}
}
});</code></pre>
<h4>TK_stop</h4>
<pre><code class="language-java">/**
* 断线AV通道
*
* @param avChannel 一般为0
*/
public abstract void TK_stop(int avChannel);</code></pre>
<pre><code class="language-java">示例:
camera.TK_stop(Camera.DEFAULT_AV_CHANNEL);</code></pre>
<h4>TK_changeAuthKey</h4>
<pre><code class="language-java">/**
* 修改AuthKey,返回修改后的AuthKey
* &lt;p&gt;
* 需要在{@link #TK_start}成功后进行调用
*
* @param avChannel 一般为0
*/
public abstract String TK_changeAuthKey(int avChannel);</code></pre>
<pre><code class="language-java">示例:
Camera camera = new Camera();
camera.TK_connect(uid, authKey);
camera.TK_start(Camera.DEFAULT_AV_CHANNEL, password, &quot;admin&quot;, 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);
}
}
});</code></pre>
<h4>TK_isSessionConnected</h4>
<pre><code class="language-java">/**
* Device是否连线
*
*/
public abstract boolean TK_isSessionConnected();</code></pre>
<pre><code class="language-java">示例:
camera.TK_isSessionConnected();</code></pre>
<h4>TK_isChannelConnected</h4>
<pre><code class="language-java">/**
* AV通道是否连线
*
* @param avChannel 一般为0
*/
public abstract boolean TK_isChannelConnected(int avChannel);</code></pre>
<pre><code class="language-java">示例:
camera.TK_isChannelConnected();</code></pre>
<h4>TK_getAVChannelCount</h4>
<pre><code class="language-java">/**
* 获取已经开启的AV通道数
*/
public abstract int TK_getAVChannelCount();</code></pre>
<pre><code class="language-java">示例:
camera.TK_getAVChannelCount();</code></pre>
<h4>TK_getServiceTypeOfChannel</h4>
<pre><code class="language-java">/**
* 获取相应通道ServiceTYpe
*
* @param avChannel 一般为0
* @return 返回ServiceTYpe
*/
public abstract long TK_getServiceTypeOfChannel(int avChannel);</code></pre>
<pre><code class="language-java">示例:
camera.TK_getServiceTypeOfChannel(Camera.DEFAULT_AV_CHANNEL);</code></pre>
<h2>1.4 视频处理接口</h2>
<h3>TK_startShow</h3>
<pre><code class="language-java">/**
* 开启视频接收、解码、播放
* &lt;p&gt;
* 默认硬解码,不丢P帧,输出数据为空
* &lt;p&gt;
* 使用 {@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);
/**
* 开启视频接收、解码、播放
* &lt;p&gt;
* 使用 {@link #TK_registerMediaDataListener} 获取视频数据
* &lt;p&gt;
* 输出数据类型如下:
* {@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);</code></pre>
<pre><code class="language-java">示例:
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) {
//视频接收原始数据回调
}
});
}</code></pre>
<h3>TK_stopShow</h3>
<pre><code class="language-java">/**
* 停止所有AV通道的视频接收、解码、播放
*/
public abstract void TK_stopShow();
/**
* 停止指令通道的视频接收、解码、播放
*
* @param avChannel 需要停止的Channel
* @param sendStopCommand 是否发送command
*/
public abstract void TK_stopShow(int avChannel, boolean sendStopCommand);</code></pre>
<pre><code class="language-java">示例:
camera.TK_stopShow();</code></pre>
<h3>TK_getVideoCodecId</h3>
<pre><code class="language-java">/**
* 获取当前视频格式
* &lt;p&gt;
* 在出图后,可使用本Api获取视频格式
* &lt;p&gt;
* 对应格式如下:
* {@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);</code></pre>
<pre><code class="language-java">示例:
camera.TK_getVideoCodecId(Camera.DEFAULT_AV_CHANNEL);</code></pre>
<h3>TK_setAVFilter</h3>
<pre><code class="language-java">/**
* 是否开启解码滤镜
* &lt;p&gt;
* 在出图后,可使用用本Api开/关滤镜
* &lt;p&gt;
* 当解码类型为硬解码,并且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);</code></pre>
<pre><code class="language-java">示例:
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-&gt;
if(decodeSuucess){
camera.TK_setAVFilter(Camera.DEFAULT_AV_CHANNEL, &quot;eq=contrast=0.9:brightness=0.1:saturation=1&quot;, true);
}
});</code></pre>
<h3>TK_setDecodeDelayTime</h3>
<pre><code class="language-java">/**
* 设置解码最大延时,调整解码每帧时间间隔
* &lt;p&gt;
*
* @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);</code></pre>
<pre><code class="language-java">示例:
Camera camera = new Camera();
camera.TK_connect(uid, authKey);
camera.TK_start(Camera.DEFAULT_AV_CHANNEL, password, &quot;admin&quot;, 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);
}
}
});</code></pre>
<h3>TK_startVideoToDevice</h3>
<pre><code class="language-java">/**
* 开始视频采集、编码、发送
* &lt;p&gt;
* 1、使用 {@link #TK_registerMediaDataListener} 获取视频发送yuv420p数据
* 2、使用 {@link #TK_registerIOTCListener} 获取是否视频发送成功
*
* @param lifecycleOwner activity生命周期
* @param previewView 预览展示的view
* @param format 预览参数
* @param channel 一般为0
* @see InterfaceCtrl.MediaDataListener#onSendVideoFrame
* @see InterfaceCtrl.IOTCListener#receiveVideoToDevice
*/
void TK_startVideoToDevice(int channel, LifecycleOwner lifecycleOwner, PreviewView previewView, PreviewFormat format);</code></pre>
<pre><code class="language-java">public class PreviewFormat {
/**
* 前后摄像头
*/
public int lensFacing = CameraSelector.LENS_FACING_FRONT;
/**
* 视频宽
*/
public int width = 640;
/**
* 视频高
*/
public int height = 480;
/**
* 1s内的帧率
*/
public int fps = 30;
/**
* 多少秒一个i帧
*/
public int gop = 1;
/**
* 编码格式
*/
public String encodeType = VideoDecode.VIDEO_FORMAT_H264;
/**
* 1s内的码率
*/
public int bitrate = (int) (width * height * fps * 0.3);
}</code></pre>
<p>特别注意,需要添加依赖,需要在layout中添加预览控件PreviewView</p>
<pre><code class="language-java">def camerax_version = &quot;1.3.1&quot;
// CameraX Camera2 extensions
api &quot;androidx.camera:camera-camera2:$camerax_version&quot;
// CameraX Lifecycle library
api &quot;androidx.camera:camera-lifecycle:$camerax_version&quot;
// CameraX View class
api &quot;androidx.camera:camera-view:$camerax_version&quot;</code></pre>
<pre><code class="language-java">示例:
Camera camera = new Camera();
camera.TK_connect(uid, authKey);
camera.TK_start(Camera.DEFAULT_AV_CHANNEL, password, &quot;admin&quot;, 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_startVideoToDevice(Camera.DEFAULT_AV_CHANNEL, lifecycleOwner, previewView, format);
//手势放大
setPreviewViewConfig(previewView, camera.TK_preview_getCamera(liveviewChannel));
}
}
});
/**
* 设置PreviewView手势放大
*/
@SuppressLint(&quot;ClickableViewAccessibility&quot;)
private void setPreviewViewConfig(PreviewView previewView, androidx.camera.core.Camera camera) {
if (camera == null) {
return;
}
ScaleGestureDetector.SimpleOnScaleGestureListener listener = new ScaleGestureDetector.SimpleOnScaleGestureListener() {
@Override
public boolean onScale(ScaleGestureDetector detector) {
ZoomState zoomState = camera.getCameraInfo().getZoomState().getValue();
if (zoomState == null) {
return false;
}
float maxZoomRatio = zoomState.getMaxZoomRatio();
float minZoomRatio = zoomState.getMinZoomRatio();
float currentZoomRatio = zoomState.getZoomRatio();
float scaleFactor = detector.getScaleFactor();
currentZoomRatio *= scaleFactor;
currentZoomRatio = Math.max(minZoomRatio, Math.min(currentZoomRatio, maxZoomRatio));
camera.getCameraControl().setZoomRatio(currentZoomRatio);
return true;
}
};
ScaleGestureDetector scaleGestureDetector = new ScaleGestureDetector(previewView.getContext(), listener);
previewView.setOnTouchListener((v, event) -&gt; {
scaleGestureDetector.onTouchEvent(event);
return true;
});
}</code></pre>
<h3>TK_stopVideoToDevice</h3>
<pre><code class="language-java">/**
* 停止采集视频数据
*
* @param channel 一般为0
*/
void TK_stopVideoToDevice(int channel);</code></pre>
<pre><code class="language-java">示例:
camera.TK_stopVideoToDevice(Camera.DEFAULT_AV_CHANNEL);</code></pre>
<h3>TK_sendVideo</h3>
<pre><code class="language-java">/**
* 发送处理后的视频数据,一般用于视频采集经第三方处理后进行发送
* &lt;p&gt;
* 1、使用 {@link #TK_setVideoCustom} 告知底层不进行视频编码以及发送
* 2、使用 {@link #TK_startVideoToDevice} 开启视频预览采集(内部不再进行编码以及发送)
* 3、使用 {@link #TK_registerMediaDataListener} 获取采集后的yuv420p视频数据
* 4、使用 本api 发送处理并自行编码后的视频数据
*
* @param channel 通道号
* @param bytes h264/h265数据
* @param timestamp 相对时间戳
* @param isIFrame 是否i帧
*/
void TK_sendVideo(int channel, byte[] bytes, long timestamp, boolean isIFrame);</code></pre>
<pre><code class="language-java">示例:
camera.TK_setVideoCustom(Camera.DEFAULT_AV_CHANNEL, true);
camera.TK_startVideoToDevice(Camera.DEFAULT_AV_CHANNEL);
camera.TK_registerMediaDataListener(new InterfaceCtrl.SimpleMediaDataListener(){
@Override
public void onSendVideoFrame(Camera camera, int avChannel, AVFrame avFrame) {
//视频发送数据回调,此时AVFrame中的frameData为yuv420p数据,获取后自行编码处理
byte[] newH264Data = test1(avFrame.frmData);
//或使用此Api进行发送
mCamera.TK_sendVideo(avChannel, newYuvData, (int)System.currentTimeMillis(), isIFrame);
}
});</code></pre>
<h3>TK_setVideoCustom</h3>
<pre><code class="language-java">/**
* 是否需要发送视频,一般用于视频采集经第三方处理后进行发送
* &lt;p&gt;
* 1、使用 本Api 告知底层不进行视频编码以及发送
* 2、使用 {@link #TK_startVideoToDevice} 开启视频预览采集(内部不再进行编码以及发送)
* 3、使用 {@link #TK_registerMediaDataListener} 获取采集后的yuv420p视频数据
* 4、使用 {@link #TK_sendVideo} 发送处理并自行编码后的视频数据
*
* @param customSend 设置为true后底层仅做视频采集,不再进行编码以及发送
* @see InterfaceCtrl.MediaDataListener#onSendVideoFrame
*/
void TK_setVideoCustom(int channel, boolean customSend);</code></pre>
<h3>TK_preview_switchCamera</h3>
<pre><code class="language-java">/**
* 切换前后摄像头
*
* @param channel 一般为0
* @param lensFacing {@link androidx.camera.core.CameraSelector#LENS_FACING_FRONT}
*/
void TK_preview_switchCamera(int channel, int lensFacing);</code></pre>
<h3>TK_preview_getCamera</h3>
<pre><code class="language-java">/**
* 获取手机预览摄像头对象
*/
androidx.camera.core.Camera TK_preview_getCamera(int channel);</code></pre>
<h3>TK_preview_changePreviewFormat</h3>
<pre><code class="language-java">/**
* 更改视频质量
*/
void TK_preview_changePreviewFormat(PreviewFormat format);</code></pre>
<h2>1.5 音频处理接口</h2>
<h3>TK_startSoundToDevice</h3>
<pre><code class="language-java">/**
* 开始音频采集、编码、发送
* &lt;p&gt;
* 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);
/**
* 开始音频采集、编码、发送
* &lt;p&gt;
* 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);</code></pre>
<pre><code class="language-java">示例:
camera.TK_startSoundToDevice(Camera.DEFAULT_AV_CHANNEL);
camera.TK_registerMediaDataListener(new InterfaceCtrl.SimpleMediaDataListener(){
@Override
public void onSendAudioFrame(Camera camera, int avChannel, AVFrame avFrame) {
//音频采集原始数据回调
}
});</code></pre>
<h3>TK_stopSoundToDevice</h3>
<pre><code class="language-java">/**
* 停止音频采集、编码、发送
*
* @param avChannel 一般为0
*/
public abstract void TK_stopSoundToDevice(int avChannel);</code></pre>
<pre><code class="language-java">示例:
camera.TK_stopSoundToDevice(Camera.DEFAULT_AV_CHANNEL);</code></pre>
<h3>TK_startSoundToPhone</h3>
<pre><code class="language-java">/**
* 开始音频接收、解码、播放
* &lt;p&gt;
* 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);
/**
* 开始音频接收、解码、播放
* &lt;p&gt;
* 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);</code></pre>
<pre><code class="language-java">示例:
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) {
//音频接收原始数据回调
}
});</code></pre>
<h3>TK_stopSoundToPhone</h3>
<pre><code class="language-java">/**
* 停止音频接收、解码、播放
*
* @param avChannel 一般为0
*/
public abstract void TK_stopSoundToPhone(int avChannel);</code></pre>
<pre><code class="language-java">示例:
camera.TK_stopSoundToPhone(Camera.DEFAULT_AV_CHANNEL);</code></pre>
<h3>TK_setAudioCustom</h3>
<pre><code class="language-java">/**
* 是否需要自行播放或发送音频,一般用于第三方回音消除功能
* &lt;p&gt;
* 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);</code></pre>
<pre><code class="language-java">示例:
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);
}
});</code></pre>
<h3>TK_playAudio</h3>
<pre><code class="language-java">/**
* 播放回音消除后的音频数据,一般用于第三方回音消除功能
* &lt;p&gt;
* 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);</code></pre>
<pre><code class="language-java">示例:与TK_setAudioCustom示例一致</code></pre>
<h3>TK_sendAudio</h3>
<pre><code class="language-java">/**
* 发送回音消除后的音频数据,一般用于第三方回音消除功能
* &lt;p&gt;
* 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);</code></pre>
<pre><code class="language-java">示例:与TK_setAudioCustom示例一致</code></pre>
<h3>TK_setSoundToDeviceFormats</h3>
<pre><code class="language-java">/**
* 设置音频对讲格式、采样率等
* &lt;p&gt;
* 使用 {@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);</code></pre>
<pre><code class="language-java">示例:
camera.TK_setSoundToDeviceFormats(Camera.DEFAULT_AV_CHANNEL, AVFrame.AUDIO_CODEC_G711A, AVFrame.AUDIO_SAMPLE_8K, AVFrame.AUDIO_CHANNEL_MONO, AVFrame.AUDIO_DATABITS_16);</code></pre>
<h3>TK_getSoundToDeviceCodecId</h3>
<pre><code class="language-java">/**
* 获取音频对讲格式
* &lt;p&gt;
* 对应格式如下:
* {@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);</code></pre>
<pre><code class="language-java">示例:
camera.TK_getSoundToDeviceCodecId(Camera.DEFAULT_AV_CHANNEL);</code></pre>
<h3>TK_getSoundToPhoneCodecId</h3>
<pre><code class="language-java">/**
* 获取音频监听格式
* &lt;p&gt;
* 对应格式如下:
* {@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);</code></pre>
<pre><code class="language-java">示例:
camera.TK_getSoundToPhoneCodecId(Camera.DEFAULT_AV_CHANNEL);</code></pre>
<h3>TK_setSoundToDeviceCaptureSource</h3>
<p>[android耳机适配示例.zip](<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=907628412187644f64f49a3363c1649d">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=907628412187644f64f49a3363c1649d</a> "[android耳机适配示例.zip")</p>
<pre><code class="language-java">/**
* 设置音频对讲的采集源及采集音频增益,可以用来适配耳机功能(参考&lt;android耳机适配示例&gt;)
* &lt;p&gt;
* 使用 {@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);</code></pre>
<pre><code class="language-java">示例:
camera.TK_setSoundToDeviceCaptureSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION, 2f);</code></pre>
<h3>TK_setSoundToPhonePlaySource</h3>
<p>[android耳机适配示例.zip](<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=907628412187644f64f49a3363c1649d">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=907628412187644f64f49a3363c1649d</a> "[android耳机适配示例.zip")</p>
<pre><code class="language-java">/**
* 设置音频监听的播放源,可以用来适配耳机功能(参考&lt;android耳机适配示例&gt;)
* &lt;p&gt;
* 使用 {@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);</code></pre>
<pre><code class="language-java">示例:
camera.TK_setSoundToPhonePlaySource(AudioManager.STREAM_VOICE_CALL);</code></pre>
<h2>1.6 录像与截图</h2>
<h3>TK_startRecording</h3>
<pre><code class="language-java">/**
* 开始录像
* &lt;p&gt;
* 会卡ui,请放子线程操作
*
* @param channel 一般为0
* @param path 录像保存地址
*/
public abstract boolean TK_startRecording(int channel, String path);</code></pre>
<pre><code class="language-java">示例:
camera.TK_startRecording(Camera.DEFAULT_AV_CHANNEL, path);</code></pre>
<h3>TK_stopRecording</h3>
<pre><code class="language-java">/**
* 停止录像
*/
public abstract boolean TK_stopRecording(int channel);</code></pre>
<pre><code class="language-java">示例:
camera.TK_stopRecording(Camera.DEFAULT_AV_CHANNEL);</code></pre>
<h3>TK_snapshot</h3>
<pre><code class="language-java">/**
* 视频截图
* &lt;p&gt;
* 会卡ui,请放子线程操作
*
* @param channel 通道号
* @param filePath 截图保存地址
* @param bitmapPixels 图片像素最大值,0即代表默认最大值Long.MAX_VALUE
* @return 是否截图成功
*/
public abstract boolean TK_snapshot(int channel, String filePath, long bitmapPixels);</code></pre>
<pre><code class="language-java">示例:
camera.TK_snapshot(Camera.DEFAULT_AV_CHANNEL, path, 0);</code></pre>
<h2>1.7 指令发送</h2>
<h3>1.7.1 P2P</h3>
<h4>TK_sendIOCtrlToChannel</h4>
<pre><code class="language-java">/**
* 发送命令到Device
*
* @param avChannel 一般为0
* @param type command 类型
* @param data command 数据
*/
public abstract void TK_sendIOCtrlToChannel(int avChannel, int type, byte[] data);</code></pre>
<pre><code class="language-java">示例:
camera.TK_sendIOCtrlToChannel(Camera.DEFAULT_AV_CHANNEL, 0x1ff, new byte[]{0, 0, 0, 0});</code></pre>
<h4>TK_sendJsonCtrlToChannel</h4>
<pre><code class="language-java">/**
* 发送json字串命令给设备
*
* @param avChannel 通道:一般为0
* @param jsonRequest 发送的json字串
* @param jsonResponse 设备回复的字串
* @param timeoutSec 超时时间
*/
public abstract void TK_sendJsonCtrlToChannel(int avChannel, String jsonRequest, int timeoutSec);</code></pre>
<pre><code class="language-java">示例:
camera.TK_sendJsonCtrlToChannel(Camera.DEFAULT_AV_CHANNEL, jsonRequest, 2);</code></pre>
<h4>TK_removeAllCmd</h4>
<pre><code class="language-java">/**
* 清除command队列
*/
public abstract void TK_removeAllCmd();</code></pre>
<pre><code class="language-java">示例:
camera.TK_removeAllCmd();</code></pre>
<h3>1.7.2 Nebula</h3>
<h4>TK_nebulaSendData</h4>
<pre><code class="language-java">/**
* Nebula发送json command
* &lt;p&gt;
* 使用 {@link #TK_registerIOTCListener} 获取发送结果
*
* @param jsonRequest 发送的json字串
* @param timeoutMs 超时时间
* @see InterfaceCtrl.IOTCListener#sendJsonCtrlData
*/
void TK_nebulaSendData(String jsonRequest, int timeoutMs);</code></pre>
<pre><code class="language-java">示例:
JSONObject jsonObject = new JSONObject();
try {
JSONObject args = new JSONObject();
args.put(&quot;value&quot;, true);
jsonObject.put(&quot;func&quot;, &quot;startVideo&quot;);
jsonObject.put(&quot;args&quot;, args);
} catch (JSONException e) {
e.printStackTrace();
}
camera.TK_nebulaSendData(jsonObject.toString(), 1000);</code></pre>
<h2>1.8 文件上传、下载</h2>
<h3>TK_startDownload</h3>
<pre><code class="language-java">/**
* 开始文件下载
* &lt;p&gt;
* 使用 {@link #TK_registerIOTCListener} 获取下载进度
*
* @param type 传输方式
* @param dirPath 沙盒目录
* @param channel 通道
* @see InterfaceCtrl.IOTCListener#downloadUploadOutput
*/
void TK_startDownload(Camera.TKTransferType type, String dirPath, int channel);</code></pre>
<pre><code class="language-java">示例:
//发送command获取设备文件名列表
TK_commandGetFileList(channel, startTime, endTime, fileType, new CommandListener&lt;CommandGetListFile&gt;() {
@Override
public void onResponse(@Nullable CommandGetListFile command) {
//发送command获取设备下载通道列表
TK_commandDownloadFile(command.list, new CommandListener&lt;CommandDownloadFile&gt;() {
@Override
public void onResponse(@Nullable CommandDownloadFile command) {
//开始文件下载
String dirPath = &quot;/sdcard/Android/data/com.tutk.kalay/file&quot;;
for (Integer channel : command.list) {
camera.TK_startDownload(TKTransferType.valueOf(String.valueOf(command.type)), dirPath, channel);
}
}
});
}
});</code></pre>
<h3>TK_stopDownload</h3>
<pre><code class="language-java">/**
* 停止文件下载
*
* @param type 传输方式
* @param channel 通道
*/
void TK_stopDownload(Camera.TKTransferType type, int channel);</code></pre>
<h3>TK_startUpload</h3>
<pre><code class="language-java">/**
* 开始文件上传
* &lt;p&gt;
* 使用 {@link #TK_registerIOTCListener} 获取上传进度
*
* @param type 传输方式
* @param filePath 文件完整沙盒路径
* @param channel 通道
* @see InterfaceCtrl.IOTCListener#downloadUploadOutput
*/
void TK_startUpload(Camera.TKTransferType type, String filePath, int channel);</code></pre>
<pre><code class="language-java">示例:
//文件上传list
ArrayList&lt;String&gt; filePathList = new ArrayList();
filePathList.add(&quot;/sdcard/Android/data/com.tutk.kalay/file1.mp4&quot;);
filePathList.add(&quot;/sdcard/Android/data/com.tutk.kalay/file2.jpg&quot;);
filePathList.add(&quot;/sdcard/Android/data/com.tutk.kalay/file3.zip&quot;);
filePathList.add(&quot;/sdcard/Android/data/com.tutk.kalay/file4.mp3&quot;);
//获取设备上传通道列表
TK_commandUploadFile(filePathList, new CommandListener&lt;CommandUploadFile&gt;() {
@Override
public void onResponse(@Nullable CommandUploadFile command) {
//开始文件上传
int index = -1;
for (Integer channel : command.list) {
index++;
if (index &gt;= command.list.size()) {
index = 0;
}
TK_startUpload(TKTransferType.valueOf(String.valueOf(command.type)), filePathList.get(index), channel);
}
}
});</code></pre>
<h3>TK_stopUpload</h3>
<pre><code class="language-java">/**
* 停止文件上传
*
* @param type 传输方式
* @param channel 通道
*/
void TK_stopUpload(Camera.TKTransferType type, int channel);</code></pre>
<h1>二、KalayCameraControl(指令封装)</h1>
<h2>2.1 TK_commandSetRecord</h2>
<pre><code class="language-java">/**
* 设定设备SD卡录像模式
*
* @param channel Camera Index
* @param recordType 参考{@link AVIOCTRLDEFs#AVIOTC_RECORDTYPE_OFF}
*/
public void TK_commandSetRecord(int channel, int recordType, CommandListener&lt;CommandSetRecord&gt; listener)</code></pre>
<h2>2.2 TK_commandGetRecord</h2>
<pre><code class="language-java">/**
* 获取设备目前SD卡录像模式
*
* @param channel Camera Index
*/
public void TK_commandGetRecord(int channel, CommandListener&lt;CommandGetRecordMode&gt; listener)</code></pre>
<h2>2.3 TK_commandListEvent</h2>
<pre><code class="language-java">/**
* 获取设备事件列表
*
* @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&lt;CommandListEvent&gt; listener)</code></pre>
<h2>2.4 TK_commandRecordPlayControl</h2>
<pre><code class="language-java">/**
* 事件回播控制播放
*
* @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&lt;CommandRecordPlayControl&gt; listener)</code></pre>
<h2>2.5 TK_commandSetStreamCtrl</h2>
<pre><code class="language-java">/**
* 设置设备解析度
*
* @param channel Camera Index
* @param quality 参考{@link AVIOCTRLDEFs#AVIOCTRL_QUALITY_MAX}
*/
public void TK_commandSetStreamCtrl(int channel, int quality, CommandListener&lt;CommandSetStreamCtrl&gt; listener)</code></pre>
<h2>2.6 TK_commandGetStreamCtrl</h2>
<pre><code class="language-java">/**
* 获取设备目前解析度
*
* @param channel Camera Index
*/
public void TK_commandGetStreamCtrl(int channel, CommandListener&lt;CommandGetStreamCtrl&gt; listener)</code></pre>
<h2>2.7 TK_commandSetMotionDetect</h2>
<pre><code class="language-java">/**
* 设置设备位移侦测之灵敏度
*
* @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&lt;CommandSetMotionDetect&gt; listener)</code></pre>
<h2>2.8 TK_commandGetMotionDetect</h2>
<pre><code class="language-java">/**
* 获取设备目前位移侦测之灵敏度
*
* @param channel Camera Index
*/
public void TK_commandGetMotionDetect(int channel, CommandListener&lt;CommandGetMotionDetect&gt; listener)</code></pre>
<h2>2.9 TK_commandGetSupportStream</h2>
<pre><code class="language-java">/**
* 获取目前设备通道数
*/
public void TK_commandGetSupportStream(CommandListener&lt;CommandGetSupportStream&gt; listener)</code></pre>
<h2>2.10 TK_commandGetAudioOutFormat</h2>
<pre><code class="language-java">/**
* 获取设备音讯格式
*
* @param channel Camera Index
*/
public void TK_commandGetAudioOutFormat(int channel, CommandListener&lt;CommandGetAudioOutFormat&gt; listener)</code></pre>
<h2>2.11 TK_commandSetPassword</h2>
<pre><code class="language-java">/**
* 变更设备密码
*
* @param oldPwd 旧密码
* @param newPwd 新密码
*/
public void TK_commandSetPassword(String oldPwd, String newPwd, CommandListener&lt;CommandSetPassword&gt; listener)</code></pre>
<h2>2.12 TK_commandGetRecordDuration</h2>
<pre><code class="language-java">/**
* 获取sd卡事件总时长
*
* @param channel Camera Index
* @param eventTime 事件时间
*/
public void TK_commandGetRecordDuration(int channel, long eventTime, CommandListener&lt;CommandGetRecordDuration&gt; listener)</code></pre>
<h2>2.13 TK_commandSetRecordProgress</h2>
<pre><code class="language-java">/**
* 设置回放事件进度
*
* @param channel Camera Index
* @param eventTime 事件时间
*/
public void TK_commandSetRecordProgress(int channel, long eventTime, int progressTime, CommandListener&lt;CommandSetRecordProgress&gt; listener)</code></pre>
<h2>2.14 TK_commandListWifiAp</h2>
<pre><code class="language-java">/**
* 获取设备周围Wifi列表
*/
public void TK_commandListWifiAp(CommandListener&lt;CommandListWifiAp&gt; listener)</code></pre>
<h2>2.15 TK_commandSetWifi</h2>
<pre><code class="language-java">/**
* 设定设备的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&lt;CommandSetWifi&gt; listener)</code></pre>
<h2>2.16 TK_commandGetWifi</h2>
<pre><code class="language-java">/**
* 获取设备目前所设置的WiFi
*/
public void TK_commandGetWifi(CommandListener&lt;CommandGetWifi&gt; listener)</code></pre>
<h2>2.17 TK_commandSetVideoMode</h2>
<pre><code class="language-java">/**
* 设置画面镜像/翻转状态
*
* @param channel Camera Index
* @param mode 参考{@link AVIOCTRLDEFs#AVIOCTRL_VIDEOMODE_NORMAL}
*/
public void TK_commandSetVideoMode(int channel, int mode, CommandListener&lt;CommandSetVideoMode&gt; listener)</code></pre>
<h2>2.18 TK_commandGetVideoMode</h2>
<pre><code class="language-java">/**
* 获取画面镜像/翻转设置状态
*/
public void TK_commandGetVideoMode(int channel, CommandListener&lt;CommandGetVideoMode&gt; listener)</code></pre>
<h2>2.19 TK_commandFormatExtStorage</h2>
<pre><code class="language-java">/**
* 格式化SD卡
*
* @param Storage index(例如sdcard插槽= 0,内部闪存= 1,...)
*/
public void TK_commandFormatExtStorage(int Storage, CommandListener&lt;CommandFormatExtStorage&gt; listener)</code></pre>
<h2>2.20 TK_commandGetChannelName</h2>
<pre><code class="language-java">/**
* 获取所有通道名称
*/
public void TK_commandGetChannelName(CommandListener&lt;CommandGetChannelName&gt; listener)</code></pre>
<h2>2.21 TK_commandSetChannelName</h2>
<pre><code class="language-java">/**
* 设置通道名称
*
* @param channel Camera Index
* @param name 名称
*/
public void TK_commandSetChannelName(int channel, String name, CommandListener&lt;CommandSetChannelName&gt; listener)</code></pre>
<h2>2.22 TK_commandXmCall</h2>
<pre><code class="language-java">/**
* 门铃接听,当收到设备门铃呼叫command,使用此api进行回复
*
* @param channel Camera Index
* @param answer 0:挂断;1:接听
*/
public void TK_commandXmCall(int channel, int answer, CommandListener&lt;CommandXmCall&gt; listener)</code></pre>
<h2>2.23 TK_commandSetName</h2>
<pre><code class="language-java">/**
* 设置设备名称
*
* @param channel Camera Index
* @param name 名称
*/
public void TK_commandSetName(int channel, String name, CommandListener&lt;CommandSetName&gt; listener)</code></pre>
<h2>2.24 TK_commandSetTimeSync</h2>
<pre><code class="language-java">/**
* 同步手机时间给设备
*
* @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&lt;CommandSetTimeSync&gt; listener)</code></pre>
<h2>2.25 TK_commandSetPtz</h2>
<pre><code class="language-java">/**
* 云台控制
*
* @param channel Camera Index
* @param control 参考{@link AVIOCTRLDEFs#AVIOCTRL_PTZ_UP}
* @param speed 云台转动的速度
*/
public void TK_commandSetPtz(int channel, int control, int speed, CommandListener&lt;CommandPtz&gt; listener)</code></pre>
<h2>2.26 TK_commandOta</h2>
<pre><code class="language-java">/**
* OTA升级
*
* @param url 下载固件url链接
* @param fileChecksum MD5校验码
* @param fileSize 固件包大小
*/
public void TK_commandOta(String url, String fileChecksum, int fileSize, CommandListener&lt;CommandOta&gt; listener)</code></pre>
<h2>2.27 TK_commandDeviceInfo</h2>
<pre><code class="language-java">/**
* 获取设备信息
*/
public void TK_commandDeviceInfo(CommandListener&lt;CommandDeviceInfo&gt; listener)</code></pre>
<h2>2.28 TK_commandDeviceSupportOta</h2>
<pre><code class="language-java">/**
* 获取设备是否支持OTA升级
*/
public void TK_commandDeviceSupportOta(CommandListener&lt;CommandDeviceSupportOta&gt; listener)</code></pre>
<h2>2.29 TK_commandDeviceSupportCloud</h2>
<pre><code class="language-java">/**
* 获取设备是否支持云存储
*/
public void TK_commandDeviceSupportCloud(CommandListener&lt;CommandDeviceSupportCloud&gt; listener)</code></pre>
<h2>2.30 TK_commandDeviceSetCloud</h2>
<pre><code class="language-java">/**
* 设置设备云存储录像状态
*
* @param channel Camera Index
* @param isOn 1 开启, 0 关闭
*/
public void TK_commandDeviceSetCloud(int channel, int isOn, CommandListener&lt;CommandDeviceSetCloud&gt; listener)</code></pre>
<h2>2.31 TK_commandDeviceGetCloud</h2>
<pre><code class="language-java">/**
* 获取设备云存储录像状态
*
* @param channel Camera Index
*/
public void TK_commandDeviceGetCloud(int channel, CommandListener&lt;CommandDeviceGetCloud&gt; listener)</code></pre>
<h2>2.32 TK_commandGetEventDate</h2>
<pre><code class="language-java">/**
* 获取有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&lt;CommandGetEventDate&gt; listener)</code></pre>
<h2>2.33 TK_commandGetHumanDetection</h2>
<pre><code class="language-java">/**
* 获取设备人形侦测开关
*/
public void TK_commandGetHumanDetection(CommandListener&lt;CommandGetHumanDetection&gt; listener)</code></pre>
<h2>2.34 TK_commandSetHumanDetection</h2>
<pre><code class="language-java">/**
* 设置设备人形侦测开关
*
* @param isOn 1 开启, 0 关闭
*/
public void TK_commandSetHumanDetection(int isOn, CommandListener&lt;CommandSetHumanDetection&gt; listener)</code></pre>
<h2>2.35 TK_commandGetNightVision</h2>
<pre><code class="language-java">/**
* 获取设备夜视开关
*/
public void TK_commandGetNightVision(CommandListener&lt;CommandGetNightVision&gt; listener)</code></pre>
<h2>2.36 TK_commandSetNightVision</h2>
<pre><code class="language-java">/**
* 设置设备夜视开关
*
* @param isOn 1 开启, 0 关闭
*/
public void TK_commandSetNightVision(int isOn, CommandListener&lt;CommandSetNightVision&gt; listener)</code></pre>
<h2>2.37 TK_commandGetSummerTime</h2>
<pre><code class="language-java">/**
* 获取设备夏令时开关
*/
public void TK_commandGetSummerTime(CommandListener&lt;CommandGetSummerTime&gt; listener)</code></pre>
<h2>2.38 TK_commandSetSummerTime</h2>
<pre><code class="language-java">/**
* 设置设备夏令时开关
*
* @param isOn 1 开启, 0 关闭
*/
public void TK_commandSetSummerTime(int isOn, CommandListener&lt;CommandSetSummerTime&gt; listener)</code></pre>
<h1>三、Command使用以及封装示例</h1>
<h2>3.1 定义Command及结构体</h2>
<pre><code class="language-java">APP发送Command获取灯控开关状态:IOTYPE_GET_LED_REQ = 0x30000001
typedef struct
{
unsigned int channel; //当前通道号
unsigned char reserved[4];
}SMsgAVIoctrlGetLedReq;</code></pre>
<pre><code class="language-java">设备端回复灯控开关状态:IOTYPE_GET_LED_RESP = 0x30000002
typedef struct
{
int result; //0:成功, 其他失败
unsigned char isOnOff; // 0:开启; 1:关闭
unsigned char reserved[3];
}SMsgAVIoctrlGetLedResp;</code></pre>
<h2>3.2 将结构体封装成byte[]数据进行发送</h2>
<pre><code class="language-java">//在结构体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);</code></pre>
<h2>3.3 通过回调接收到设备回复的数据,进行解析</h2>
<pre><code class="language-java">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];
}
}
});</code></pre>
<h2>3.4 byte[]数据类型转换Api</h2>
<pre><code class="language-java">参考Android Psc的AVIOCTRLDEF模块,com.tutk.IOTC.Packet类包含各种数据转换Api</code></pre>
<h1>四、VideoMonitor(播放器)</h1>
<h2>4.1 Method</h2>
<h3>TK_attachCamera</h3>
<pre><code class="language-java">/**
* 为播放器绑定Camera实例
*
* @param camera Camera实例
* @param avChannel 一般为0
*/
public void TK_attachCamera(Camera camera, int avChannel)</code></pre>
<pre><code class="language-java">示例:
videoMonitor.TK_attachCamera(camera, Camera.DEFAULT_AV_CHANNEL);</code></pre>
<h3>TK_deattachCamera</h3>
<pre><code class="language-java">/**
* 播放器解绑Camera
*/
public void TK_deattachCamera()</code></pre>
<pre><code class="language-java">示例:
videoMonitor.TK_deattachCamera();</code></pre>
<h3>setScaleType</h3>
<pre><code class="language-java">/**
* 选择控件自动缩放方式,默认为SCALE_ASPECT
*
* @see ScaleType#SCALE_ASPECT,视频画面保持宽高比
* @see ScaleType#SCALE_ASPECT_FILL,视频画面铺满屏幕
*/
public void setScaleType(ScaleType scaleType)</code></pre>
<pre><code class="language-java">示例:
videoMonitor.setScaleType(ScaleType.SCALE_ASPECT);</code></pre>
<h2>4.2 回调接口</h2>
<h3>TK_setMonitorListener</h3>
<pre><code class="language-java">/**
* 播放器状态监听
*/
public void TK_setMonitorListener(InterfaceCtrl.MonitorListener listener)</code></pre>
<pre><code class="language-java">public interface MonitorListener {
/**
* 播放器的点击事件
*/
void onClick();
/**
* 播放器已准备好出图
*
* @param channel 一般为0
* @param isSoftwareDecode 是否软解码
*/
void onReady(int channel, boolean isSoftwareDecode);
/**
* 播放器缩放的倍数传递给UI层
*
* @param scaleLevel 缩放的倍数
*/
void onScale(float scaleLevel);
}</code></pre>
<pre><code class="language-java">示例:
videoMonitor.TK_setMonitorListener(new InterfaceCtrl.SimpleMonitorListener());</code></pre>
<h1>五、连线Demo</h1>
<p>布局代码</p>
<pre><code class="language-java">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
android:layout_width=&quot;match_parent&quot;
android:layout_height=&quot;match_parent&quot;&gt;
&lt;com.tutk.IOTC.VideoMonitor
android:id=&quot;@+id/videoMonitor&quot;
android:layout_width=&quot;match_parent&quot;
android:layout_height=&quot;match_parent&quot; /&gt;
&lt;/androidx.constraintlayout.widget.ConstraintLayout&gt;</code></pre>
<p>java代码</p>
<pre><code class="language-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);
}
}
};
}</code></pre>