示例搭建
环境要求
iOS 11.0 及以上系统版本
Android 浏览器:需要支持 WebRTC 的浏览器内核
PC Web 浏览器:内核为 Chrome 58+ 的浏览器,以及 Safari 11 及以上版本
快速接入
方法一:下载 armcloudH5SDK 包文件后,解压后引入即可
import { ArmcloudEngine } from "@/lib/index.es.js";
方法二:通过 npm 加载。
安装:
# npm
npm i armcloud-rtc
# yarn
yarn add armcloud-rtc
# pnpm
pnpm add armcloud-rtc
// 使用
import { ArmcloudEngine } from "armcloud-rtc";
const engine = new ArmcloudEngine({
//...初始化参数
});
说明: 1.在页面上创建一个容器
<div
class="phoneBox"
id="phoneBox"
style="background-color: grey;overflow:hidden;width: 100%;height: 100%;text-align: center;"
></div>
2.通过 PaaS 接口获取实例信息,获得实例连接信息。 3.获取到实例信息数据后 const armCloud = new ArmcloudEngine({//...初始化参数}) 进行初始化。 4.初始化成功后,通过 armCloud.start() 进行设备链接。 5.需要停止链接云手机,调用 armCloud.stop() 断开链接。
示例Demo
示例代码
baseUrl: 请设置对应的地址
- 国内:https://openapi.armcloud.net
- 海外:https://openapi-hk.armcloud.net
token: 通过调用服务端接口 /openapi/open/token/stsToken
- 注:国内请调用国内的OpenAPI地址,海外请调用海外的OpenAPI地址
// 以vue项目为例
<script setup lang="ts">
import { ref, onMounted } from "vue";
import { showNotify, showDialog } from "vant";
import "vant/es/notify/style";
import "vant/es/dialog/style";
import { ArmcloudEngine } from "armcloud-rtc";
const armCloud: any = ref(null);
const handleStart = () => {
// RTC初始化
const params = {
baseUrl: 'https://openapi-hk.armcloud.net', // sdk请求域名 默认 https://openapi.armcloud.net
token: '', // 必填,从服务端调用/openapi/open/token/stsToken获取到的token
retryCount: 2, // ws重连次数 默认2
retryTime: 2000, // ws每次重连间隔 默认2000
enableMicrophone: true, // 是否开启麦克风
enableCamera: true, // 是否开启摄像头
deviceInfo: {
padCode: 'AC22030020000', // 必填,房间号
userId: 'xxxx-xxxx-xxxx-xxx', // 必填, 你产品的用户id或其他唯一id
videoStream: { // 选填,具体配置请查看 API详情-设置分辨率,码率,帧率
resolution: 12, // 选填,分辨率,默认12(540 * 960)
frameRate: 2, // 选填,帧率,默认2(25fps)
bitrate: 3 // 选填,码率,默认3(2Mbps)
},
autoRecoveryTime: 300, // 选填,无操作回收时间,范围 1s~7200s,默认值:300
mediaType: 3, // 选填,媒体流类型 1:只控制音频 2:只控制视频 3:同时控制音频和视频,默认值:3
rotateType: 0, // 选填,旋转屏幕 0:竖屏, 1:横屏,默认值:0
keyboard: 'pad', // 选填,当前键盘 'local':本机键盘,'pad':云机键盘,默认值:'pad'
saveCloudClipboard: true, // 选填,是否接收云机剪切板回调 true: 接收,false:不接收,默认 true
},
viewId: "phoneBox", // 必填,容器id
callbacks: { // 选填,回调集合
// 初始化回调
onInit: ({ code, msg }) => {
console.log("init:", code, msg);
// 初始化成功后,进行后续业务操作
if (code === 0) {
// 浏览器是否支持rtc服务监听
const isSupported = armCloud.value.isSupported();
if (!isSupported) {
showNotify({
type: "warning",
message: "该浏览器不支持RTC服务"
});
return false;
}
// 加入房间
armCloud.value.start();
}
},
// 链接成功回调
onConnectSuccess: () => {
showNotify({
type: "success",
message: "进入房间成功"
});
// 获取SDK版本号
const version = armCloud.value.version
console.log('当前SDK版本号:', version)
},
// 链接失败回调
onConnectFail: ({ code, msg }) => {
console.log("fail:" code, msg);
showNotify({
type: "danger",
message: msg
});
},
// 无操作回收回调
onAutoRecoveryTime: () => {
console.log("触发回收回调");
// 触发无操作回收后,SDK内部会执行 armCloud.value.stop() 离开房间业务逻辑,需重新再次加入房间
showDialog({
message: "触发无操作回收,暂停拉流; 点击确认,恢复拉流"
}).then(() => {
// on close
// 加入房间
armCloud.value.start();
});
},
// 自动播放失败回调
onAutoplayFailed: e => {
console.log("自动播放失败", e);
if (e.kind === "video") {
showDialog({
message: "自动播放视频失败; 点击确认,手动播放"
}).then(() => {
// on close
armCloud.value.startPlay();
});
}
if (e.kind === "audio") {
showDialog({
message: "自动播放音频失败; 点击确认,手动播放"
}).then(() => {
// on close
armCloud.value.startPlay();
});
}
},
// 当前运行信息回调
onRunInformation: (info) => {
console.log("当前网络状况", info);
},
// 当分辨率发生变化时触发
onChangeResolution: (width, height) => {
console.log("当前分辨率", width, height);
},
// 当收到云端app透传的消息时的触发
onTransparentMsg: (type, msg) => {
console.log("消息透传", type, msg);
},
// 当播放出现异常时触发
onErrorMessage: (event) => {
console.log("异常", event);
},
// 云机文本内容复制触发回调
onOutputClipper: (message) => {
// 若初始化传入了配置想 saveCloudClipboard: false, 将无法收到回调消息
console.log("复制文本内容", message);
},
// 视频首帧渲染成功
onRenderedFirstFrame: () => {
console.log("视频首帧渲染成功");
}
}
};
armCloud.value = new ArmcloudEngine(params);
}
/** 离开房间 */
const handleStop = () => {
armCloud.value.stop();
}
</script>
<template>
<div>
<div
id="phoneBox"
class="phone-box"
style="background-color: grey; overflow: hidden; width: 100%; height: 80%; text-align: center"
/>
<div class="flex">
<div @click="handleStart">加入房间</div>
<div @click="handleStop">离开房间</div>
</div>
</div>
</template>