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_initIOTCWithLicenseKey(Context context, String privateKey, String sdkLicenseKey, TK_Listener listener);
/**
* RN封装方法
*/
@ReactMethod
public void RN_initIOTC()</code></pre>
<pre><code class="language-java">示例:
Camera.TK_initIOTCWithLicenseKey(context, privateKey, sdkLicensekey, new TK_Listener());</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();
/**
* RN封装方法
*/
@ReactMethod
public void RN_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);
/**
* RN封装方法
*/
@ReactMethod
public void RN_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的版本号
*/config {
storeFile file('/Volumes/Transcend/TUTK资料/tutk.keystore')
storePassword '123456'
keyAlias = 'ipcamp'
keyPassword '123456'
}
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);
/**
* RN封装方法
*/
@ReactMethod
public st_LanSearchInfo[] TK_LanSearch(int timeout)</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_setMaxCameraLimit</h3>
<pre><code class="language-java">/**
* 设置最大camera数量,默认是4
* &lt;p&gt;
* 需要在{@link #TK_initIOTC}之前进行调用
*/
public static void TK_setMaxCameraLimit(int limit);</code></pre>
<pre><code class="language-java">示例:
Camera.TK_setMaxCameraLimit(4);</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.SimpleIRegisterIOTCListener listener);
/**
* 注销IOTC回调
*/
public boolean TK_unregisterIOTCListener(InterfaceCtrl.SimpleIRegisterIOTCListener listener);</code></pre>
<pre><code class="language-java">public class SimpleIRegisterIOTCListener {
/**
* 软解码数据回调(当调用MyCamera.TK_startShow(软解)时,IOTCamera层从此方法上抛视频解码信息)
*
* @param camera
* @param avChannel AV通道
* @param videoWidth 解码后Video的宽
* @param videoHeight 解码后Video的高
* @param isIframe 当前frame是否I帧
*/
public void receiveFrameData(final Camera camera, final int avChannel, final int videoWidth, final int videoHeight, boolean isIframe);
/**
* 硬解码数据回调(当调用MyCamera.TK_startShow(硬解)时,IOTCamera层从此方法上抛视频解码信息)
*
* @param camera
* @param avChannel AV通道
* @param buf 接收到的Video数据
* @param length 接收到的Video数据长度
* @param pFrmNo 接收到的Video数据的序号
* @param pFrmInfoBuf 接收到的Video数据头信息
* @param isIframe 是否I帧
* @param codecId Codec ID (编码解码类型)
*/
public void receiveFrameDataForMediaCodec(final Camera camera, final int avChannel, final byte[] buf, final int length, int pFrmNo, byte[] pFrmInfoBuf, boolean isIframe, int codecId);
/**
* 接收到的帧信息回调(当调用MyCamera.TK_startShow时,IOTCamera层从此方法上抛视频观看信息)
*
* @param camera
* @param avChannel AV通道
* @param bitRate 音视频的比特率
* @param frameRate 解码的VideoFPS
* @param onlineNm 在线人数
* @param frameCount 接收到的帧总数
* @param incompleteFrameCount 丢失帧的总数
*/
public void receiveFrameInfo(final Camera camera, final int avChannel, final long bitRate, final int frameRate, final int onlineNm, final int frameCount,
final int incompleteFrameCount);
/**
* IOTC连接信息回调(当调用MyCamera.TK_connect时,IOTCamera层从此方法上抛连线返回值)
*
* @param camera
* @param resultCode IOTC连接返回码(Camera定义的返回码)
*/
public void receiveSessionInfo(final Camera camera, final int resultCode);
示例:在Android层解析然后上抛到RN层,上层监听DeviceEventEmitter的receiveSessionInfo
public void receiveSessionInfo(final Camera camera, final int resultCode){
LogUtils.I(TAG, &quot; receiveSessionInfo-----resultCode:&quot;+resultCode);
WritableMap wm = Arguments.createMap();
wm.putInt(&quot;state&quot;,resultCode);
sendEventToUi(mContext,&quot;receiveSessionInfo&quot;, wm);
}
/**
* AV连接信息回调(当调用MyCamera.TK_start时,IOTCamera层从此方法上抛创建通道返回值)
*
* @param camera
* @param avChannel av通道
* @param resultCode AV连接返回码(Camera定义的返回码)
*/
public void receiveChannelInfo(final Camera camera, final int avChannel, final int resultCode);
示例:在Android层解析然后上抛到RN层,上层监听DeviceEventEmitter的receiveChannelInfo
public void receiveChannelInfo(final Camera camera, final int avChannel, final int resultCode){
WritableMap wm = Arguments.createMap();
wm.putInt(&quot;avChannel&quot;,avChannel);
wm.putInt(&quot;state&quot;,resultCode);
sendEventToUi(mContext,&quot;receiveChannelInfo&quot;, wm);
if (resultCode == Camera.CONNECTION_STATE_CONNECTED){
//连接成功后询问设备的音频格式
mCamera.TK_sendIOCtrlToChannel(channel, AVIOCTRLDEFs.IOTYPE_USER_IPCAM_GETAUDIOOUTFORMAT_REQ,
AVIOCTRLDEFs.SMsgAVIoctrlGetAudioOutFormatReq.parseContent(channel));
}
}
/**
* 接收信息回调(当收到设备发过来的信息,IOTCamera层从此方法上抛信息)
*
* @param camera
* @param avChannel av通道
* @param avIOCtrlMsgType 接收到的信息类型
* @param data 接收到的信息
*/
public void receiveIOCtrlData(final Camera camera, final int avChannel, final int avIOCtrlMsgType, final byte[] data);
示例:在Android层解析然后上抛到RN层,上层监听DeviceEventEmitter的IOTYPE_USER_IPCAM_GETAUDIOOUTFORMAT_RESP
public void receiveIOCtrlData(final Camera camera, final int avChannel, final int avIOCtrlMsgType, final byte[] data){
if(avIOCtrlMsgType == AVIOCTRLDEFs.IOTYPE_USER_IPCAM_GETAUDIOOUTFORMAT_RESP){
int channel = Packet.byteArrayToInt_Little(data, 0);
int format = Packet.byteArrayToInt_Little(data, 4);
int sample = data[8];
//发送事件,IOTYPE_USER_IPCAM_GETAUDIOOUTFORMAT_RESP
WritableMap wm = Arguments.createMap();
wm.putInt(&quot;channel&quot;,channel);
wm.putInt(&quot;format&quot;,format);
wm.putInt(&quot;sample&quot;,sample);
sendEventToUi(mContext,&quot;IOTYPE_USER_IPCAM_GETAUDIOOUTFORMAT_RESP&quot;, wm);
}
}
/**
* 通道建立回调方法(当调用MyCamera.TK_startSoundToDevice时,IOTCamera层从此方法上抛返回值)
*
* @param camera
* @param avChannel av通道
* @param ret av通道建立返回码(SDK底层返回码)
*/
public void retStartChannel(final Camera camera, final int avChannel, final int ret);
示例:在Android层解析然后上抛到RN层,上层监听DeviceEventEmitter的retStartChannel
public void retStartChannel(final Camera camera, final int avChannel, final int ret){
WritableMap wm = Arguments.createMap();
wm.putInt(&quot;avChannel&quot;,avChannel);
wm.putInt(&quot;state&quot;,ret);
sendEventToUi(mContext,&quot;retStartChannel&quot;, wm);
}
/**
* 监听音频解码结果回调方法(当调用MyCamera.TK_startSoundToPhone时,IOTCamera层从此方法上抛音频解码返回值)
*
* @param camera
* @param avChannel av通道
* @param ret 是否音频解码
*/
public void retStartListen(final Camera camera, final int avChannel, final Boolean ret);
示例:在Android层解析然后上抛到RN层,上层监听DeviceEventEmitter的retStartListen
public void retStartListen(final Camera camera, final int avChannel, final Boolean ret){
WritableMap wm = Arguments.createMap();
wm.putInt(&quot;avChannel&quot;,avChannel);
wm.putBoolean(&quot;state&quot;,ret);
sendEventToUi(mContext,&quot;retStartListen&quot;, wm);
}
/**
* IOTC连接信息回调 (当调用MyCamera.TK_connect时,SDK底层从此方法上抛连线返回值)
*
* @param camera
* @param resultCode IOTC连接返回码(SDK底层返回码)
*/
public void debugSessionInfo(final Camera camera, final int resultCode);
示例:在Android层解析然后上抛到RN层,上层监听DeviceEventEmitter的debugSessionInfo
public void debugSessionInfo(final Camera camera, final int resultCode){
WritableMap wm = Arguments.createMap();
wm.putInt(&quot;resultCode&quot;,resultCode);
sendEventToUi(mContext,&quot;debugSessionInfo&quot;, wm);
}
/**
* AV连接信息回调 (当调用MyCamera.TK_start时,SDK底层从此方法上抛创建通道返回值)
*
* @param camera
* @param avChannel av通道
* @param resultCode AV连接返回码(SDK底层返回码)
*/
public void debugChannelInfo(final Camera camera, final int avChannel, final int resultCode);
示例:在Android层解析然后上抛到RN层,上层监听DeviceEventEmitter的debugChannelInfo
public void debugChannelInfo(final Camera camera, final int avChannel, final int resultCode){
WritableMap wm = Arguments.createMap();
wm.putInt(&quot;avChannel&quot;,avChannel);
wm.putInt(&quot;resultCode&quot;,resultCode);
sendEventToUi(mContext,&quot;debugChannelInfo&quot;, wm);
}
/**
* 发送数据的回调 (当调用MyCamera.TK_sendIOCtrlToChannel时,SDK底层从此方法上抛)
*
* @param camera
* @param avChannel av通道
* @param avIOCtrlMsgType 发送信息的类型
* @param result 发送信息的返回码
* @param data 发送信息的数据
*/
public void debugIOCtrlData(final Camera camera, final int avChannel, final int avIOCtrlMsgType, final int result, final byte[] data);
/**
* 发送数据的回调 (当调用MyCamera.TK_sendJsonIOCtrlToChannel时,SDK底层从此方法上抛)
*
* @param camera
* @param avChannel av通道
* @param jsonRequest 发送的json数据
* @param jsonResponse 设备返回的内容
* @param timeoutSec 超时时间
* @param result 发送信息的返回码
*/
void receiveJsonIOCtrlData(final Camera camera, final int avChannel, final String jsonRequest,
final String[] jsonResponse, final int timeoutSec, int result);
}</code></pre>
<pre><code class="language-java">示例:
Camera camera = new Camera();
camera.TK_registerIOTCListener(new SimpleIRegisterIOTCListener());</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>
</tbody>
</table>
<h3>1.2.2 音视频回调接口</h3>
<h4>TK_registerMediaDataListener</h4>
<pre><code class="language-java">/**
* 注册音视频数据回调
*/
public boolean TK_registerVideoDataListeners(InterfaceCtrl.SimpleIRegisterVideoDataListener listener);
/**
* 注销音视频数据回调
*/
public boolean TK_unregisterVideoDataListeners(InterfaceCtrl.SimpleIRegisterVideoDataListener listener);</code></pre>
<pre><code class="language-java">public class SimpleIRegisterVideoDataListener {
/**
* Video数据回调 (调用TK_startShow后才有数据返回)
*
* @param camera
* @param avChannel av通道 一般为0
* @param decodeBefore 解码前的数据
* @param decodeAfter 解码后的数据(如果是硬解则此数据为null)yuv
* @param timestamp 当前数据的时间戳
* @param isIFrame 是否I帧
*/
void onReceiveVideoData(Camera camera, int avChannel, byte[] decodeBefore, byte[] decodeAfter, long timestamp, boolean isIFrame);
/**
* 开启接收视频数据而不解码的回调(只有调用TK_startRecvFrame才有数据返回)
*
* @param camera
* @param avChannel av通道 一般为0
* @param frameNum 当前接收视频帧的序号
* @param timeStamp 当前接收视频帧的时间戳
* @param isIFrame 是否I帧
* @param receiveVideoData Video裸数据
*/
void onRecvVideoFrame(Camera camera, int avChannel, int frameNum, long timeStamp, boolean isIFrame, byte[] receiveVideoData);
/**
* 开启接收音频数据而不解码的回调 (只有调用TK_startRecvAudio才有数据返回)
*
* @param camera
* @param avChannel av通道 一般为0
* @param frameNum 当前接收音频帧的序号
* @param timeStamp 当前接收音频帧的时间戳
* @param receiveAudioData 当前接收音频数据
*/
void onRecvAudioData(Camera camera, int avChannel, int frameNum, long timeStamp, byte[] receiveAudioData);
}</code></pre>
<pre><code class="language-java">示例:
Camera camera = new Camera();
camera.TK_registerVideoDataListeners(new SimpleIRegisterVideoDataListener());</code></pre>
<h2>1.3 连线处理</h2>
<h3>1.3.1 P2P</h3>
<h4>TK_connect</h4>
<pre><code class="language-java">/**
* 连线Device
* IOTCAPIs 连接. 内部调用IOTC_Connect_ByUID_Parallel连线至UID,建立IOTC Session
* 以及开启线程不断进行IOTC_Session_Check查询与Device之间的连线
*
* @param uid 20位uid序列号
*/
public abstract void TK_connect(String uid,String viewAccount, String viewPasswd);
/**
* 连线Device
* IOTCAPIs 连接. 内部调用IOTC_Connect_ByUIDEx连线至UID,建立IOTC Session
* 以及开启线程不断进行IOTC_Session_Check查询与Device之间的连线
*
* @param uid 20位uid序列号
* @param viewAccount 设备账号
* @param viewPasswd 设备密码
* @param authKey 连线认证的Key
*/
public abstract void TK_connect(String uid,String viewAccount, String viewPasswd, String authKey);
/**
* RN封装方法
*/
@ReactMethod
public void RN_connect(String uid,String viewAccount,String viewPasswd,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 共有</h3>
<h4>TK_disconnect</h4>
<pre><code class="language-java">/**
* 断线Device,同时断开内部所有AV通道
*/
public abstract void TK_disconnect();
/**
* RN封装方法
*/
@ReactMethod
public void RN_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
* @see InterfaceCtrl.IOTCListener#receiveChannelInfo
*/
public abstract void TK_start(int avChannel);
/**
* 连线AV通道
* &lt;p&gt;
* 1、需要先调用{@link #TK_connect}
* 2、连线结果使用{@link #TK_registerIOTCListener}进行获取
*
* @param avChannel 一般为0
* @param authType 0:AV_AUTH_PASSWORD 1:AV_AUTH_TOKEN
*/
public abstract void TK_start(int avChannel,int authType);
/**
* RN封装方法
*/
@ReactMethod
public void RN_start(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,Camera.AV_AUTH_PASSWORD);
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);
/**
* RN封装方法
*/
@ReactMethod
public void RN_stop(int avChannel)</code></pre>
<pre><code class="language-java">示例:
camera.TK_stop(Camera.DEFAULT_AV_CHANNEL);</code></pre>
<h4>TK_setDtls</h4>
<pre><code class="language-java">/**
* 重置DTLS连接方式为Auto
* @param uid
* @param avChannel
*/
public abstract void TK_setDtls(String uid,int avChannel);</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();
/**
* RN封装方法
*/
@ReactMethod
public boolean RN_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);
/**
* RN封装方法
*/
@ReactMethod
public boolean RN_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);
/**
* RN封装方法
*/
@ReactMethod
public boolean RN_getAudioInSupportOfChannel(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">/**
* 开启视频接收和解码
* 内部开始接收视频数据以及开始解码视频数据
* 视频数据的回调:硬解回调receiveFrameDataForMediaCodec 和软解回调receiveFrameData
* (onReceiveVideoData回调decodeAfter返回null)
*
* @param avChannel 一般默认为0
* @param sendStartCommand 是否发送0x1ff
* @param runSoftwareDecode 是否软解码(true为软解码 false为硬解码)
* @param isDropFrame 是否丢掉P帧
*/
public abstract void TK_startShow(int avChannel, boolean sendStartCommand, boolean runSoftwareDecode, boolean isDropFrame);
/**
* RN封装方法
*/
@ReactMethod
public void RN_startShow(int avChannel,boolean runSoftwareDecode ,boolean isDropFrame)
/**
* 开始视频接收和解码YUV数据(onReceiveVideoData回调decodeAfter返回YUV数据)
*
* @param avChannel 一般默认为0
* @param sendStartCommand 是否发送0x1ff
* @param runSoftwareDecode 是否软解码(true为软解码 false为硬解码)
* @param isDropFrame 是否软解码(true为软解码 false为硬解码)
*/
public abstract void TK_startShowWithYUV(int avChannel, boolean sendStartCommand, boolean runSoftwareDecode, boolean isDropFrame);
/**
* 开始视频接收和解码RGB数据(onReceiveVideoData回调decodeAfter返回RGB数据)
*
* @param avChannel 一般默认为0
* @paramsendStartCommand 是否发送0x1ff
* @param runSoftwareDecode 是否软解码(true为软解码 false为硬解码)
* @param isDropFrame 是否软解码(true为软解码 false为硬解码)
*/
public abstract void TK_startShowWithRGB(int avChannel, boolean sendStartCommand, boolean runSoftwareDecode, boolean isDropFrame);</code></pre>
<pre><code class="language-java">示例:
camera.TK_startShow(Camera.DEFAULT_AV_CHANNEL, true, false, false);</code></pre>
<h3>TK_stopShow</h3>
<pre><code class="language-java">/**
* 停止所有AV通道的视频接收、解码、播放
*/
public abstract void TK_stopShow();
/**
* 停止指令通道的视频接收、解码、播放
* @param avChannel 停止显示的Channel
* @param sendStopCommand 是否发送0x1ff
*/
public abstract void TK_stopShow(int avChannel, boolean sendStopCommand);
/**
* RN封装方法
*/
@ReactMethod
public void RN_stopShow(int avChannel)</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);
/**
* RN封装方法
*/
@ReactMethod
public int RN_startSoundToDevice(int avChannel)</code></pre>
<pre><code class="language-java">示例:
camera.TK_getVideoCodecId(Camera.DEFAULT_AV_CHANNEL);</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} 获取是否音频对讲成功
*
* @param avChannel 一般为0
* @param isResend 是否开启Resend机制
*/
void TK_startSoundToDevice(int avChannel, boolean isResend);
/**
* RN封装方法
*/
@ReactMethod
public void RN_startSoundToDevice(int avChannel,boolean isResend)</code></pre>
<pre><code class="language-java">示例:
camera.TK_startSoundToDevice(Camera.DEFAULT_AV_CHANNEL);</code></pre>
<h3>TK_stopSoundToDevice</h3>
<pre><code class="language-java">/**
* 停止音频采集、编码、发送
*
* @param avChannel 一般为0
*/
public abstract void TK_stopSoundToDevice(int avChannel);
/**
* RN封装方法
*/
@ReactMethod
public void RN_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">/**
* 开始接收Device端的音频数据
* 内部开始接收Device的音频和开始解码音频数据
*
* @param avChannel 一般为0
* @param isListening 是否监听(是否解码音频)
*/
public abstract void TK_startSoundToPhone(int avChannel, boolean isListening);
/**
* RN封装方法
*/
@ReactMethod
public void RN_startSoundToPhone(int avChannel, boolean isListening)</code></pre>
<pre><code class="language-java">示例:
camera.TK_startSoundToPhone(Camera.DEFAULT_AV_CHANNEL);</code></pre>
<h3>TK_stopSoundToPhone</h3>
<pre><code class="language-java">/**
* 停止音频接收、解码、播放
*
* @param avChannel 一般为0
*/
public abstract void TK_stopSoundToPhone(int avChannel);
/**
* RN封装方法
*/
@ReactMethod
public void RN_stopSoundToPhone(int avChannel)</code></pre>
<pre><code class="language-java">示例:
camera.TK_stopSoundToPhone(Camera.DEFAULT_AV_CHANNEL);</code></pre>
<h3>TK_sendAudio</h3>
<pre><code class="language-java">/**
* 发送回音消除后的音频数据,一般用于第三方回音消除功能
*
* @param avChannel 通道号
* @param bytes audio数据
* @param length audio数据长度
*/
public abstract void TK_sendAudioData(int avChannel, byte[] bytes, int length);</code></pre>
<h3>TK_setAudioSpeakFormats</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_setAudioSpeakFormats(int channel, int audioSpeakCodec, int audioSampleRate, int channelConfig, int audioDataBits);</code></pre>
<pre><code class="language-java">示例:
camera.TK_setAudioSpeakFormats(Camera.DEFAULT_AV_CHANNEL, AVFrame.AUDIO_CODEC_G711A, AVFrame.AUDIO_SAMPLE_8K, AVFrame.AUDIO_CHANNEL_MONO, AVFrame.AUDIO_DATABITS_16);</code></pre>
<h3>TK_setAudioInputCodecId</h3>
<pre><code class="language-java">/**
* 设置音频对讲格式
* &lt;p&gt;
* 使用 {@link #TK_startSoundToDevice} 将采用本Api的配置
* &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
* @param audioFormat 音频格式
*/
void TK_setAudioInputCodecId(int channel, int audioFormat);
/**
* RN封装方法
*/
@ReactMethod
public void RN_setAudioInputCodecId(int channel, int audioformat)</code></pre>
<pre><code class="language-java">示例:
camera.TK_setAudioSpeakFormats(Camera.DEFAULT_AV_CHANNEL, AVFrame.AUDIO_CODEC_G711A, AVFrame.AUDIO_SAMPLE_8K, AVFrame.AUDIO_CHANNEL_MONO, AVFrame.AUDIO_DATABITS_16);</code></pre>
<h3>TK_getAudioInputCodecId</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_getAudioInputCodecId(int channel);
/**
* RN封装方法
*/
@ReactMethod
public int RN_getAudioInputCodecId( int channel)</code></pre>
<pre><code class="language-java">示例:
camera.TK_getAudioInputCodecId(Camera.DEFAULT_AV_CHANNEL);</code></pre>
<h3>TK_getAudioOutputCodecId</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_getAudioOutputCodecId(int channel);
/**
* RN封装方法
*/
@ReactMethod
public int RN_getAudioOutputCodecId( int channel)
</code></pre>
<pre><code class="language-java">示例:
camera.TK_getAudioOutputCodecId(Camera.DEFAULT_AV_CHANNEL);</code></pre>
<h3>TK_setSoundToPhonePlaySource</h3>
<pre><code class="language-java">/**
* 设置音频监听的播放源,可以用来适配耳机功能
* &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)
/**
* RN封装方法
*/
@ReactMethod
public void RN_setSoundToPhonePlaySource( int audioStreamType)
</code></pre>
<pre><code class="language-java">示例:
Camera.TK_setSoundToPhonePlaySource(audioStreamType);</code></pre>
<h3>TK_setSoundToPhonePlaySource</h3>
<pre><code class="language-java">/**
* 设置音频对讲的采集源及采集音频增益,可以用来适配耳机功能
* &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)
/**
* RN封装方法
*/
@ReactMethod
public void RN_setSoundToDeviceCaptureSource(int audioSource, float audioSpeakGain)
</code></pre>
<pre><code class="language-java">示例:
Camera.TK_setSoundToDeviceCaptureSource(audioSource,audioSpeakGain);</code></pre>
<h2>1.6 录像与截图</h2>
<h3>TK_startRecording</h3>
<pre><code class="language-java">/**
* 开始录像
* 内部开始录像channel的视频数据和音频数据
*
* @param path 录像保存地址
* @param sync 设置为true则等待实际录像的开始
* @param channel 一般为0
* @param recordingTime 录像时长,单位为毫秒
* @return
*/
public abstract boolean TK_startRecordingForChannel(String path, boolean sync, int channel, long recordingTime);
/**
* RN封装方法
*/
@ReactMethod
public boolean RN_startRecordingForChannel( int channel)</code></pre>
<pre><code class="language-java">示例:
camera.TK_startRecording(path,true,Camera.DEFAULT_AV_CHANNEL, 0);
/**
* RN封装方法
*/
@ReactMethod
public boolean RN_startRecordingForChannel(int channel)</code></pre>
<h3>TK_stopRecording</h3>
<pre><code class="language-java">/**
* 停止录像
*/
public abstract boolean TK_stopRecording(int channel);
/**
* RN封装方法
*/
@ReactMethod
public boolean RN_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">/**
* 视频截图 (截图成功后在CameraListener回调OnSnapshotComplete)
*
* @param channel 一般为0
* @param filePath 图片保存地址
* @deprecated 在一定条件下有可能失败
*/
public abstract void TK_setSnapshot( int channel, String filePath);
/**
* RN封装方法
*/
@ReactMethod
public boolean RN_setSnapshot( int channel)
/**
* 截图
* @param channel 通道号
* @param filePath 截图保存地址
* @param bitmapPixels 0即代表默认 DEFAULT_BITMAP_PIXELS = 1200000
* @return 根据给的bitmapPixels返回图像
*/
public abstract boolean TK_setSnapshotByCurrentBitmap( int channel, String filePath, long bitmapPixels);</code></pre>
<pre><code class="language-java">示例:
camera.TK_snapshot(Camera.DEFAULT_AV_CHANNEL, path);
camera.TK_setSnapshotByCurrentBitmap(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);
/**
* RN封装方法
*/
@ReactMethod
public boolean RN_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_sendJsonIOCtrlToChannel(int avChannel, String jsonRequest, String[] jsonResponse, int timeoutSec);</code></pre>
<pre><code class="language-java">示例:
camera.TK_sendJsonIOCtrlToChannel(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>
<h1>二、VideoMonitor(播放器)</h1>
<h2>2.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>
<h2>2.2 回调接口</h2>
<h3>TK_setMonitorListener</h3>
<pre><code class="language-java">/**
* 播放器状态监听
*/
public void TK_setMonitorListener(InterfaceCtrl.SimpleMonitorListener listener)</code></pre>
<pre><code class="language-java">public class SimpleMonitorListener {
/**
* 播放器的点击事件
*/
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>