Kalay1.0标准-升级版PSC

Kalay1.0 升级版PSC


Android API

<p>[TOC]</p> <h1>一、IOTCamera</h1> <h2>1.1 初始化接口、静态API</h2> <h3>TK_initIOTC</h3> <pre><code class="language-java">/** * IOTC初始化 * &amp;lt;p&amp;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 &amp;quot;code = &amp;quot; + code + &amp;quot;, ip = &amp;quot; + ip + &amp;quot;, msg = &amp;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=&amp;quot;true&amp;quot; 否则会初始化不成功; 例如: &amp;lt;application android:icon=&amp;quot;@mipmap/ic_launcher&amp;quot; android:label=&amp;quot;@string/app_name&amp;quot; android:roundIcon=&amp;quot;@mipmap/ic_launcher&amp;quot; android:usesCleartextTraffic=&amp;quot;true&amp;quot; android:theme=&amp;quot;@style/AppTheme&amp;quot;&amp;gt; &amp;lt;/application&amp;gt;</code></pre> <p>&gt; 注:调用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分区分流 * &amp;lt;p&amp;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, &amp;quot;uid: &amp;quot; + new String(info.UID) + &amp;quot; ip:&amp;quot; + new String(info.IP)); } }</code></pre> <h3>TK_setLogEnable</h3> <pre><code class="language-java">/** * 设置log记录 * * @param enable 是否开启log记录 * @param path 设置path后,log沙盒存储路径为 * &amp;lt;path&amp;gt;/yyyy-MM-dd/HH:mm:ss/Console.txt * &amp;lt;path&amp;gt;/yyyy-MM-dd/HH:mm:ss/IOTC.txt * &amp;lt;path&amp;gt;/yyyy-MM-dd/HH:mm:ss/AVAPI.txt * &amp;lt;path&amp;gt;/yyyy-MM-dd/HH:mm:ss/RDT.txt * &amp;lt;path&amp;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绑定信息回调 * &amp;lt;p&amp;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连线信息回调 * &amp;lt;p&amp;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通道连线信息回调 * &amp;lt;p&amp;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); /** * 对讲是否成功回调 * &amp;lt;p&amp;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); /** * 视频发送是否成功回调 * &amp;lt;p&amp;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); /** * 监听是否成功回调 * &amp;lt;p&amp;gt; * 当调用{@link com.tutk.IOTC.Camera#TK_startSoundToPhone}后,回调是否监听成功 * * @param camera * @param avChannel av通道 * @param success 是否监听成功 */ void receiveSoundToPhone(Camera camera, int avChannel, boolean success); /** * 接收Command信息回调 * &amp;lt;p&amp;gt; * 连线成功之后,当收到设备发过来指令后,回调指令数据 * * @param camera * @param avChannel av通道 * @param avIOCtrlMsgType 接收到的信息类型 * @param data 接收到的信息 */ void receiveIOCtrlData(Camera camera, int avChannel, int avIOCtrlMsgType, byte[] data); /** * 发送Command调试信息回调 * &amp;lt;p&amp;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调试信息回调 * &amp;lt;p&amp;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); /** * 文件上传、下载回调 * &amp;lt;p&amp;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 { /** * 视频解码数据回调 * &amp;lt;p&amp;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); /** * 视频接收原始数据回调 * &amp;lt;p&amp;gt; * 当调用{@link com.tutk.IOTC.Camera#TK_startShow}后,回调视频接收信息 * * @param avFrame 接收当前帧 */ void onRecvVideoFrame(Camera camera, int avChannel, AVFrame avFrame); /** * 视频调试信息回调 * &amp;lt;p&amp;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); /** * 视频发送数据回调 * &amp;lt;p&amp;gt; * 当调用{@link com.tutk.IOTC.Camera#TK_client_startSendVideo}后,回调视频编码后发送的数据 * * @param avChannel av通道 一般为0 * @param avFrame 发送当前帧 */ void onSendVideoFrame(Camera camera, int avChannel, AVFrame avFrame); /** * 音频解码数据回调 * &amp;lt;p&amp;gt; * 当调用{@link com.tutk.IOTC.Camera#TK_startSoundToPhone}后,回调解码信息 * * @param avFrame 解码当前帧 * @param decodeAfter 解码后的PCM数据 */ void onDecodeAudioData(Camera camera, int avChannel, AVFrame avFrame, byte[] decodeAfter); /** * 音频接收原始数据回调 * &amp;lt;p&amp;gt; * 当调用{@link com.tutk.IOTC.Camera#TK_startSoundToPhone}后,回调音频接收信息 * * @param avChannel av通道 一般为0 * @param avFrame 接收当前帧 */ void onRecvAudioFrame(Camera camera, int avChannel, AVFrame avFrame); /** * 音频采集原始数据回调 * &amp;lt;p&amp;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 * &amp;lt;p&amp;gt; * 连线结果使用{@link #TK_registerIOTCListener}进行获取 * * @param uid 20位uid序列号 * @see InterfaceCtrl.IOTCListener#receiveSessionInfo */ public abstract void TK_connect(String uid); /** * 连线Device * &amp;lt;p&amp;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开始绑定设备 * &amp;lt;p&amp;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, &amp;quot;123456&amp;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连线设备 * &amp;lt;p&amp;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连线设备 * &amp;lt;p&amp;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, &amp;quot;123456&amp;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列表 * &amp;lt;p&amp;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;&amp;amp; lanSearch.length &amp;gt; 0) { String udid = new String(lanSearch[0].UDID); } else { Log.e(TAG, &amp;quot;TK_nebulaLanSearch lanSearch = null&amp;quot;); }</code></pre> <h4>TK_nebulaSsidListReq</h4> <pre><code class="language-java">/** * Nebula AP模式添加时,发送本地指令,获取设备wifi列表 * &amp;lt;p&amp;gt; * 需要先调用 {@link #TK_nebulaStartBind} 进行AP模式绑定 * * @return wifi列表 */ List&amp;lt;NebulaWiFiConfig.NebulaIOCtrlMsgSSIDListResp&amp;gt; TK_nebulaSsidListReq();</code></pre> <h4>TK_nebulaSetWifiReq</h4> <pre><code class="language-java">/** * Nebula AP模式添加时,发送本地指令,给设备设置wifi * &amp;lt;p&amp;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分区分流 * &amp;lt;p&amp;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通道 * &amp;lt;p&amp;gt; * 1、SecurityMode加密模式会优先使用上次连线成功后的方式,默认为AUTO(2) * 2、AuthType认证方式默认为PASSWORD(0)方式 * &amp;lt;p&amp;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通道 * &amp;lt;p&amp;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, &amp;quot;admin&amp;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 * &amp;lt;p&amp;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, &amp;quot;admin&amp;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">/** * 开启视频接收、解码、播放 * &amp;lt;p&amp;gt; * 默认硬解码,不丢P帧,输出数据为空 * &amp;lt;p&amp;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); /** * 开启视频接收、解码、播放 * &amp;lt;p&amp;gt; * 使用 {@link #TK_registerMediaDataListener} 获取视频数据 * &amp;lt;p&amp;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">/** * 获取当前视频格式 * &amp;lt;p&amp;gt; * 在出图后,可使用本Api获取视频格式 * &amp;lt;p&amp;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">/** * 是否开启解码滤镜 * &amp;lt;p&amp;gt; * 在出图后,可使用用本Api开/关滤镜 * &amp;lt;p&amp;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-&amp;gt; if(decodeSuucess){ camera.TK_setAVFilter(Camera.DEFAULT_AV_CHANNEL, &amp;quot;eq=contrast=0.9:brightness=0.1:saturation=1&amp;quot;, true); } });</code></pre> <h3>TK_setDecodeDelayTime</h3> <pre><code class="language-java">/** * 设置解码最大延时,调整解码每帧时间间隔 * &amp;lt;p&amp;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, &amp;quot;admin&amp;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">/** * 开始视频采集、编码、发送 * &amp;lt;p&amp;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 = &amp;quot;1.3.1&amp;quot; // CameraX Camera2 extensions api &amp;quot;androidx.camera:camera-camera2:$camerax_version&amp;quot; // CameraX Lifecycle library api &amp;quot;androidx.camera:camera-lifecycle:$camerax_version&amp;quot; // CameraX View class api &amp;quot;androidx.camera:camera-view:$camerax_version&amp;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, &amp;quot;admin&amp;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(&amp;quot;ClickableViewAccessibility&amp;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) -&amp;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">/** * 发送处理后的视频数据,一般用于视频采集经第三方处理后进行发送 * &amp;lt;p&amp;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">/** * 是否需要发送视频,一般用于视频采集经第三方处理后进行发送 * &amp;lt;p&amp;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">/** * 开始音频采集、编码、发送 * &amp;lt;p&amp;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); /** * 开始音频采集、编码、发送 * &amp;lt;p&amp;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">/** * 开始音频接收、解码、播放 * &amp;lt;p&amp;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); /** * 开始音频接收、解码、播放 * &amp;lt;p&amp;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">/** * 是否需要自行播放或发送音频,一般用于第三方回音消除功能 * &amp;lt;p&amp;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">/** * 播放回音消除后的音频数据,一般用于第三方回音消除功能 * &amp;lt;p&amp;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">/** * 发送回音消除后的音频数据,一般用于第三方回音消除功能 * &amp;lt;p&amp;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">/** * 设置音频对讲格式、采样率等 * &amp;lt;p&amp;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">/** * 获取音频对讲格式 * &amp;lt;p&amp;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">/** * 获取音频监听格式 * &amp;lt;p&amp;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> &quot;[android耳机适配示例.zip&quot;)</p> <pre><code class="language-java">/** * 设置音频对讲的采集源及采集音频增益,可以用来适配耳机功能(参考&amp;lt;android耳机适配示例&amp;gt;) * &amp;lt;p&amp;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> &quot;[android耳机适配示例.zip&quot;)</p> <pre><code class="language-java">/** * 设置音频监听的播放源,可以用来适配耳机功能(参考&amp;lt;android耳机适配示例&amp;gt;) * &amp;lt;p&amp;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">/** * 开始录像 * &amp;lt;p&amp;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">/** * 视频截图 * &amp;lt;p&amp;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 * &amp;lt;p&amp;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(&amp;quot;value&amp;quot;, true); jsonObject.put(&amp;quot;func&amp;quot;, &amp;quot;startVideo&amp;quot;); jsonObject.put(&amp;quot;args&amp;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">/** * 开始文件下载 * &amp;lt;p&amp;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&amp;lt;CommandGetListFile&amp;gt;() { @Override public void onResponse(@Nullable CommandGetListFile command) { //发送command获取设备下载通道列表 TK_commandDownloadFile(command.list, new CommandListener&amp;lt;CommandDownloadFile&amp;gt;() { @Override public void onResponse(@Nullable CommandDownloadFile command) { //开始文件下载 String dirPath = &amp;quot;/sdcard/Android/data/com.tutk.kalay/file&amp;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">/** * 开始文件上传 * &amp;lt;p&amp;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&amp;lt;String&amp;gt; filePathList = new ArrayList(); filePathList.add(&amp;quot;/sdcard/Android/data/com.tutk.kalay/file1.mp4&amp;quot;); filePathList.add(&amp;quot;/sdcard/Android/data/com.tutk.kalay/file2.jpg&amp;quot;); filePathList.add(&amp;quot;/sdcard/Android/data/com.tutk.kalay/file3.zip&amp;quot;); filePathList.add(&amp;quot;/sdcard/Android/data/com.tutk.kalay/file4.mp3&amp;quot;); //获取设备上传通道列表 TK_commandUploadFile(filePathList, new CommandListener&amp;lt;CommandUploadFile&amp;gt;() { @Override public void onResponse(@Nullable CommandUploadFile command) { //开始文件上传 int index = -1; for (Integer channel : command.list) { index++; if (index &amp;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&amp;lt;CommandSetRecord&amp;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&amp;lt;CommandGetRecordMode&amp;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&amp;lt;CommandListEvent&amp;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&amp;lt;CommandRecordPlayControl&amp;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&amp;lt;CommandSetStreamCtrl&amp;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&amp;lt;CommandGetStreamCtrl&amp;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&amp;lt;CommandSetMotionDetect&amp;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&amp;lt;CommandGetMotionDetect&amp;gt; listener)</code></pre> <h2>2.9 TK_commandGetSupportStream</h2> <pre><code class="language-java">/** * 获取目前设备通道数 */ public void TK_commandGetSupportStream(CommandListener&amp;lt;CommandGetSupportStream&amp;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&amp;lt;CommandGetAudioOutFormat&amp;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&amp;lt;CommandSetPassword&amp;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&amp;lt;CommandGetRecordDuration&amp;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&amp;lt;CommandSetRecordProgress&amp;gt; listener)</code></pre> <h2>2.14 TK_commandListWifiAp</h2> <pre><code class="language-java">/** * 获取设备周围Wifi列表 */ public void TK_commandListWifiAp(CommandListener&amp;lt;CommandListWifiAp&amp;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&amp;lt;CommandSetWifi&amp;gt; listener)</code></pre> <h2>2.16 TK_commandGetWifi</h2> <pre><code class="language-java">/** * 获取设备目前所设置的WiFi */ public void TK_commandGetWifi(CommandListener&amp;lt;CommandGetWifi&amp;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&amp;lt;CommandSetVideoMode&amp;gt; listener)</code></pre> <h2>2.18 TK_commandGetVideoMode</h2> <pre><code class="language-java">/** * 获取画面镜像/翻转设置状态 */ public void TK_commandGetVideoMode(int channel, CommandListener&amp;lt;CommandGetVideoMode&amp;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&amp;lt;CommandFormatExtStorage&amp;gt; listener)</code></pre> <h2>2.20 TK_commandGetChannelName</h2> <pre><code class="language-java">/** * 获取所有通道名称 */ public void TK_commandGetChannelName(CommandListener&amp;lt;CommandGetChannelName&amp;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&amp;lt;CommandSetChannelName&amp;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&amp;lt;CommandXmCall&amp;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&amp;lt;CommandSetName&amp;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&amp;lt;CommandSetTimeSync&amp;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&amp;lt;CommandPtz&amp;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&amp;lt;CommandOta&amp;gt; listener)</code></pre> <h2>2.27 TK_commandDeviceInfo</h2> <pre><code class="language-java">/** * 获取设备信息 */ public void TK_commandDeviceInfo(CommandListener&amp;lt;CommandDeviceInfo&amp;gt; listener)</code></pre> <h2>2.28 TK_commandDeviceSupportOta</h2> <pre><code class="language-java">/** * 获取设备是否支持OTA升级 */ public void TK_commandDeviceSupportOta(CommandListener&amp;lt;CommandDeviceSupportOta&amp;gt; listener)</code></pre> <h2>2.29 TK_commandDeviceSupportCloud</h2> <pre><code class="language-java">/** * 获取设备是否支持云存储 */ public void TK_commandDeviceSupportCloud(CommandListener&amp;lt;CommandDeviceSupportCloud&amp;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&amp;lt;CommandDeviceSetCloud&amp;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&amp;lt;CommandDeviceGetCloud&amp;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&amp;lt;CommandGetEventDate&amp;gt; listener)</code></pre> <h2>2.33 TK_commandGetHumanDetection</h2> <pre><code class="language-java">/** * 获取设备人形侦测开关 */ public void TK_commandGetHumanDetection(CommandListener&amp;lt;CommandGetHumanDetection&amp;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&amp;lt;CommandSetHumanDetection&amp;gt; listener)</code></pre> <h2>2.35 TK_commandGetNightVision</h2> <pre><code class="language-java">/** * 获取设备夜视开关 */ public void TK_commandGetNightVision(CommandListener&amp;lt;CommandGetNightVision&amp;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&amp;lt;CommandSetNightVision&amp;gt; listener)</code></pre> <h2>2.37 TK_commandGetSummerTime</h2> <pre><code class="language-java">/** * 获取设备夏令时开关 */ public void TK_commandGetSummerTime(CommandListener&amp;lt;CommandGetSummerTime&amp;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&amp;lt;CommandSetSummerTime&amp;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">&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt; &amp;lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot; android:layout_width=&amp;quot;match_parent&amp;quot; android:layout_height=&amp;quot;match_parent&amp;quot;&amp;gt; &amp;lt;com.tutk.IOTC.VideoMonitor android:id=&amp;quot;@+id/videoMonitor&amp;quot; android:layout_width=&amp;quot;match_parent&amp;quot; android:layout_height=&amp;quot;match_parent&amp;quot; /&amp;gt; &amp;lt;/androidx.constraintlayout.widget.ConstraintLayout&amp;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>

页面列表

ITEM_HTML