# anroidSDK **Repository Path**: joris9527/anroid-sdka ## Basic Information - **Project Name**: anroidSDK - **Description**: 阿斯顿发啥的发送到发送到发斯蒂芬 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-07-19 - **Last Updated**: 2024-11-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README <<<<<<< HEAD <<<<<<< HEAD ## VideoSDK 接入使用说明 --------------------------- ### 1.快速开始 #### 1.1 使用Android aar库 * 工程如何引用: ##### 1.1.1 引用稳定版: 在应用模块的build.gradle中配置 ``` dependencies { implementation 'com.tencent.iot.video:video-link-android:2.4.45' } ``` 具体版本号可参考[版本号列表](https://search.maven.org/search?q=video-link-android) ##### 1.1.2 引用SNAPSHOT版: (1). 在工程的build.gradle中配置仓库url ``` allprojects { repositories { google() jcenter() maven { url "https://oss.sonatype.org/content/repositories/snapshots" } } } ``` (2). 在应用模块的build.gradle中配置 ``` dependencies { implementation 'com.tencent.iot.video:video-link-android:2.4.45-SNAPSHOT' } ``` **注:建议使用稳定版本,SNAPSHOT版仅供开发自测使用** ### 2.示例代码 #### 2.1 使用Android aar库 接口详细说明可参考:[VideoSDK接口说明](https://github.com/tencentyun/iot-link-android/blob/master/sdk/video-link-android/doc/VideoSDK接口说明.md) ##### 2.1.0 用户回调 ###### 2.1.0.0 媒体流数据接收回调 * 接口描述: 媒体流数据通知。该回调用于返回以裸流方式传输的媒体流数据。 ``` fun avDataRecvHandle(id: String?, data: ByteArray?, len: Int) { //媒体流数据接收 //回调中应避免耗时操作 //多路p2p传输场景需根据回传的`id`判断对应的p2p通道,以做相应处理 } ``` | 参数 | 类型 | 描述 | 输入/输出 | |:-|:-|:-|:-| | id | String | 目标camera在app端的唯一标识符 | 输出 | | data | ByteArray | 接收到的媒体流数据 | 输出 | | len | Int | 接收到的媒体流数据长度 | 输出 | | 返回值 | 描述 | |:-|:-| | void | - | ###### 2.1.0.1 信令消息通知回调 * 接口描述: 信令消息通知。该回调用于返回以异步方式发送的信令请求结果。 ``` fun commandRequest(id: String?, msg: String?) { //信令消息通知 //回调中应避免耗时操作 //多路p2p传输场景需根据回传的`id`判断对应的p2p通道,以做相应处理 } ``` | 参数 | 类型 | 描述 | 输入/输出 | |:-|:-|:-|:-| | id | String | 目标camera在app端的唯一标识符 | 输出 | | msg | String | 接收到的消息 | 输出 | | 返回值 | 描述 | |:-|:-| | void | - | ###### 2.1.0.2 P2P连接异常断开通知回调 * 接口描述: p2p通道错误断开。该回调用于通知p2p连接异常状况。 ``` private var isXp2pDisconnect: Boolean = false private var isXp2pDetectReady: Boolean = false private var isXp2pDetectError: Boolean = false fun xp2pEventNotify(id: String?, msg: String?, event: Int) { //p2p通道错误断开 //回调中应避免耗时操作 //多路p2p传输场景需根据回传的`id`判断对应的p2p通道,以做相应处理 if (event == 1003) { isXp2pDisconnect = true } else if (event == 1004) { isXp2pDetectReady = true } else if (event == 1005) { isXp2pDetectError = true } } ``` | 参数 | 类型 | 描述 | 输入/输出 | |:-|:-|:-|:-| | id | String | 目标camera在app端的唯一标识符 | 输出 | | msg | String | 附加消息 | 输出 | | 返回值 | 描述 | |:-|:-| | void | - | ###### 2.2.0.3 P2P连接正常关闭通知回调 * 接口描述: p2p通道正常关闭回调。该回调用于通知媒体流传输完成。 ``` fun avDataCloseHandle(id: String?, msg: String?, errorCode: Int) { //p2p通道正常关闭 //回调中应避免耗时操作 //多路p2p传输场景需根据回传的`id`判断对应的p2p通道,以做相应处理 } ``` | 参数 | 类型 | 描述 | 输入/输出 | |:-|:-|:-|:-| | id | String | 目标camera在app端的唯一标识符 | 输出 | | msg | String | 附加消息 | 输出 | | errorCode | Int | 状态码 | 输出 | | 返回值 | 描述 | |:-|:-| | void | - | ## ### 2.2.1 设置用户回调 * 接口描述: 设置用户回调函数。媒体流数据和控制类消息通过设置的回调函数返回。 ``` public static void setCallback(XP2PCallback cb) ``` | 参数 | 类型 | 描述 | 输入/输出 | |:-|:-|:-|:-| | cb | XP2PCallback | p2p回调函数类 | 输入 | | 返回值 | 描述 | |:-|:-| | void | - | * 代码示例: ``` class VideoActivity : XP2PCallback { ... XP2P.setCallback(this) ... } ``` ##### 2.2.2 P2P通道初始化 * 接口描述: 初始化xp2p服务。 ``` public static void startServiceWithXp2pInfo(String id, String product_id, String device_name, String xp2p_info) ``` | 参数 | 类型 | 描述 | 输入/输出 | |:-|:-|:-|:-| | id | String | 目标camera在app端的唯一标识符 | 输入 | | product_id | String | 目标camera产品信息 | 输入 | | device_name | String | 目标camera设备名称 | 输入 | | xp2p_info | String | xp2p信息 | 输入 | | 返回值 | 描述 | |:-|:-| | void | - | * 代码示例: ``` /* 从自建后台获取xp2p info */ String xp2p_info = getXP2PInfo(...) /* 设置回调 */ XP2P.setCallback(this) /* 初始化p2p */ XP2P.startServiceWithXp2pInfo($id, $product_id, $device_name, xp2p_info) ``` ##### 2.2.3 P2P通道传输音视频裸流 ###### 2.2.3.0 启动裸流接收服务 * 接口描述: 向camera设备请求媒体流,异步回调方式。 ``` public static void startAvRecvService(String id, String params, boolean crypto) ``` | 参数 | 类型 | 描述 | 输入/输出 | |:-|:-|:-|:-| | id | String | 目标camera在app端的唯一标识符 | 输入 | | params | String | 直播( `action=live` )或回放( `action=playback` )参数 | 输入 | | crypto | boolean | 是否开启传输层加密 | 输入 | | 返回值 | 描述 | |:-|:-| | void | - | ###### 2.2.3.1 停止裸流接收服务 * 接口描述: 停止裸流接收,并关闭接收服务。 ``` public static int stopAvRecvService(String id, byte[] req) ``` | 参数 | 类型 | 描述 | 输入/输出 | |:-|:-|:-|:-| | id | String | 目标camera在app端的唯一标识符 | 输入 | | req | byte[] | 服务句柄,当前版本传入`null` | 输入 | | 返回值 | 描述 | |:-|:-| | 0 | 成功 | | 其他 | 失败 | * 代码示例: ``` /* 设置回调函数 */ XP2P.setCallback(this) /* 开始请求数据 */ XP2P.startAvRecvService($id, "action=live", true) /* 接收到数据后回调被触发 */ override fun avDataRecvHandle(id: String?, data: ByteArray?, len: Int) { //裸流数据处理 //回调中应避免耗时操作 //多路p2p传输场景需根据回传的`id`判断对应的p2p通道,以做相应处理 } /* 停止接收 */ XP2P.stopAvRecvService($id, null) ``` ##### 2.2.4 接收FLV音视频流,使用ijkplayer播放 * 接口描述: 获取本地代理url。用于播放器直接通过url获取数据进行播放。 ``` public static String delegateHttpFlv(String id) ``` | 参数 | 类型 | 描述 | 输入/输出 | |:-|:-|:-|:-| | id | String | 目标camera在app端的唯一标识符 | 输入 | | 返回值 | 描述 | |:-|:-| | 本地代理url | 成功 | | null | 失败 | * 代码示例: ``` /* 加密方式观看直播(action=live),回放(action=playback) */ val url = XP2P.delegateHttpFlv($id) + "ipc.flv?action=live" /* 非加密方式观看直播(action=live),回放(action=playback) */ val url = XP2P.delegateHttpFlv($id) + "ipc.flv?action=live&crypto=false" mPlayer.dataSource = url mPlayer.prepareAsync() mPlayer.start() ``` ##### 2.2.4 发送语音对讲数据 ###### 2.2.4.0 启动语音发送服务 * 接口描述: 启动向camera设备发送语音或自定义数据服务。异步非阻塞方式。 ``` public static void runSendService(String id, String params, boolean crypto) ``` | 参数 | 类型 | 描述 | 输入/输出 | |:-|:-|:-|:-| | id | String | 目标camera在app端的唯一标识符 | 输入 | | params | String | 请求参数采用 `key1=value&key2=value2` 格式,key不允许以下划线_开头,且key和value中间不能包含&/+=特殊字符 | 输入 | | crypto | boolean | 否开启传输层加密 | 输入 | | 返回值 | 描述 | |:-|:-| | void | - | ###### 2.2.4.1 发送数据 * 接口描述: 向camera设备发送语音或自定义数据。 ``` public static int dataSend(String id, byte[] data, int len) ``` | 参数 | 类型 | 描述 | 输入/输出 | |:-|:-|:-|:-| | id | String | 目标camera在app端的唯一标识符 | 输入 | | data | byte[] | 要发送的数据内容 | 输入 | | len | int | 要发送的数据长度 | 输入 | | 返回值 | 描述 | |:-|:-| | void | - | ###### 2.2.4.2 关闭语音发送服务 * 接口描述: 向camera设备发送语音或自定义数据。 ``` public static int stopSendService(String id, byte[] req) ``` | 参数 | 类型 | 描述 | 输入/输出 | |:-|:-|:-|:-| | id | String | 目标camera在app端的唯一标识符 | 输入 | | req | byte[] | 服务句柄,当前版本可传入`null` | 输入 | | 返回值 | 描述 | |:-|:-| | 0 | 成功 | | 其他 | 失败 | * 代码示例: ``` /* 开启语音发送服务 */ XP2P.runSendService($id, "", true) while(!stop) { /* 采集语音数据并发送 */ byte[] flvData = flvPacker.getFLV(data); XP2P.dataSend(deviceId, flvData, flvData.length); } /* 发送完成后停止服务 */ XP2P.stopSendService($id, null) ``` ##### 2.2.5 P2P通道传输自定义数据 ###### 2.2.5.0 同步方式发送自定义数据 * 接口描述: 发送信令消息给camera设备并等待回复。同步阻塞方式。 ``` public static String postCommandRequestSync(String id, byte[] command, long cmd_len, long timeout_us) ``` | 参数 | 类型 | 描述 | 输入/输出 | |:-|:-|:-|:-| | id | String | 目标camera在app端的唯一标识符 | 输入 | | command | byte[] | 可以为任意格式字符或二进制数据 | 输入 | | cmd_len | long | `command` 参数长度 | 输入 | | timeout_us | long | 命令超时时间,单位为微秒,值为0时采用默认超时(7500ms左右) | 输入 | | 返回值 | 描述 | |:-|:-| | camera回复的数据 | 成功 | | 空值 | 失败 | * 代码示例: ``` val cmd = "action=inner_define&cmd=xxx".toByteArray() val ret = XP2P.postCommandRequestSync($id, cmd, cmd.size.toLong(), 2*1000*1000) L.e("--------ret:----$ret--\n") ``` ###### 2.2.5.1 异步方式发送自定义数据 * 接口描述: 发送信令消息给camera设备,不用等待回复。异步非阻塞方式。 ``` public static int postCommandRequestWithAsync(String id, byte[] command, long cmd_len) ``` | 参数 | 类型 | 描述 | 输入/输出 | |:-|:-|:-|:-| | id | String | 目标camera在app端的唯一标识符 | 输入 | | command | byte[] | 可以为任意格式字符或二进制数据 | 输入 | | cmd_len | long | `command` 参数长度 | 输入 | | 返回值 | 描述 | |:-|:-| | 0 | 成功 | | 其他 | 失败 | * 代码示例: ``` /* 设置回调 */ XP2P.setCallback(this) val cmd = "action=user_define&cmd=xxx".toByteArray() XP2P.postCommandRequestWithAsync($id, cmd, cmd.size.toLong()) override fun commandRequest(id: String?, msg: String?, len: Int) { //处理回复消息 } ``` ##### 2.2.6 主动关闭P2P通道 * 接口描述: 停止xp2p服务。 ``` public static void stopService(String id) ``` | 参数 | 类型 | 描述 | 输入/输出 | |:-|:-|:-|:-| | id | String | 目标camera在app端的唯一标识符 | 输入 | | 返回值 | 描述 | |:-|:-| | void | - | * 代码示例: ``` override fun onDestroy() { super.onDestroy() mPlayer.release() XP2P.stopService($id) } ``` ### APP接入SDK说明 第三方App在接入Video SDK时,建议将`secretId`和`secretKey`保存到自建后台,不推荐将这两个信息保存至App端; 而SDK需要的xp2p info需要App侧从https://krp2p.krzhibo.com/user_device/getXp2pInfo?productId=[]&deviceName=[]获取;获取到xp2p info后,可以通过上述的`startServiceWithXp2pInfo`接口将该info传给SDK,示例代码如下: ``` ... String xp2p_info = getXP2PInfo(...) // 从自建后台获取xp2p info XP2P.setCallback(this) // XP2P.startServiceWithXp2pInfo(id, product_id, device_name, xp2p_info) //连接设备服务 String playUrl = XP2P.delegateHttpFlv(id) //获取播放url playUrl += "ipc.flv?action=live&channel=0" //固定播放地址 playUrl += "&quality=?" // super:超清 standard:标清 //对讲根据上述接口自行开发 String cmd = "action=user_define&channel=0&cmd={}" //发送自定义信令,详情可查看信令文档 String resp = XP2P.postCommandRequestSync(id,cmd.getByte(),cmd.length,timeout) //该接口为同步返回信令数据接口,异步返回在setCallback里面 ``` =======