1.4.0 • Published 9 months ago

ecloud-rcr v1.4.0

Weekly downloads
-
License
-
Repository
-
Last release
9 months ago

天翼云实时云渲染 JS SDK

ecloud-rcr

toc

安装

npm install ecloud-rcr

一、快速启动

1.1 前端项目引入

import { RCRLaunch } from 'ecloud-rcr';

const bootstrap = async () => {
  try {
    const launch = await RCRLaunch({ appKey });
    const container = document.getElementById('container');
    await launch.automata(container);
    const connection = launch.getConnection();
    //监听连接状态
    connection.event.close.on(() => console.log('断开连接'));
  } catch (error) {
    console.error(error);
  }
};

bootstrap();

1.2 浏览器直接引入

// 注意全局对象的名称
const { RCRLaunch } = window.ECloudRCR;

二、启动器(Launcher)

import { RCRLaunch } from 'ecloud-rcr';

const launch = RCRLaunch({
  appKey,
  baseOptions: { ... },
  extendOptions: { ... },
});

2.1 构造属性(Constructors)

属性说明类型是否必填
appKey应用 keystring-
baseOptions基础配置baseOptions-
extendOptions拓展配置extendOptions-

2.1.1 baseOptions 基础配置

属性说明类型是否必填
startType1:普通连接 3:投屏连接number必填
appSecret密钥string-
webrtcEnable是否开启webrtc推流,默认为true(详见示例)boolean-
exeParameter自定义应用启动参数string-
isCastScreenMaster(投屏)是否为主控boolean-
castScreenMaxQty(投屏)最大并发数(最大为 5)number-
castScreenNickname(投屏)昵称string-
castScreenPwd(投屏)投屏密钥boolean-
joinType(投屏)加入方式 (1:密钥|3:链接)number-

2.1.2 extendOptions 拓展配置

属性说明类型是否必填
onPlay开始播放回调() => void-
onLiveStart设置直播流url地址(开始)回调(result:boolean) => void-
onLiveStop停⽌直播回调(result:boolean) => void-
onLiveUrl设置直播url地址回调(result:boolean) => void-
onMount虚拟控件挂载回调(返回挂载父节点)(el:HTMLElement) => void-
onRotate视频容器方向变化回调(rotate:boolean) => void-
ueMultiTouch是否开启 UE4 应用多点触控boolean-
minBitrate初始化最小码率(默认为:2000)number-
maxBitrate初始化最大码率(默认为:5000)number-
startBitrate初始化码率(默认为:4000)number-
openWebRTCStats开启 WebRTC 日志打印boolean-
holdToolDisplay是否保持工具栏显示boolean-
audioToastDisplay是否开启音频提示弹窗(默认true)boolean-
toolOption工具栏选项toolOption-
eventOption事件选项eventOption-

2.1.2.1 extendOptions.toolOption 工具栏选项

属性说明类型是否必填
dropTools删除工具栏DropToolsType-
dropTools.toolsIndex工具栏位置(从 0 开始)number[]-
dropTools.platform平台(1:pc|2:移动端|3:全部)number-
extendTools新增工具栏ExtendToolsType[]-
extendTools.icon图标(base64)string
extendTools.text标题string-
extendTools.platform平台(1:pc|2:移动端|3:全部)number-
extendTools.order新增位置(从 0 开始)number-
extendTools.onClick点击触发事件() => void-

2.1.2.2 extendOptions.eventOption 事件选项

属性说明类型是否必填
enableKeyBoard是否挂载键盘事件(默认为 true)boolean-

2.2 属性(Attributes)

属性名说明类型默认值
runningState获取运行状态dn-
runningState.isOrientationMatch获取屏幕方向变化(false:横屏|true:竖屏)booleantrue

2.3 方法(Methods)

方法名说明参数回调参数
getConnection获取连接实例-连接实例(Connection)
getPlayer获取播放实例-播放实例(LivePlayer)
report获取实时连接状态-object
toggleStatistics控制连接状态显示状态(影响report)-object
toggleFullscreen切换全屏(横屏)支持情况参考-void
destory断开全部连接[errMsg]void
setUpProcessPause暂停当前运行应用-void
setUpProcessRestart重启运行应用-void
setMoveSensitivity设置鼠标或者触摸移动的敏感度number(0:低,1:中,2:高)void
handleSubscribe手动挂载鼠标、键盘、触控等事件HTMLElementvoid
handleUnsubscribe手动取消鼠标、键盘、触控等事件-void
requestPointerLock锁定鼠标-void
exitPointerLock解锁鼠标-void
handleChangeSubscribe切换猫头工具的控制权booleanvoid
getOrientationMatch对比容器与推流的方向是否一致-boolean
liveStart设置直播流url地址,并开始推送;传参为空时,使用之前的url地址(详细参考示例6.9)stringvoid
liveStop停⽌推直播流数据-void
liveUrl设置直播url地址,url地址必填stringvoid

三、连接管理(Connection)

const launch = await RCRLaunch({ ... });
await launch.automata(container);
const connection = launch.getConnection();

3.1 属性(Attributes)

属性名说明类型默认值
dc获取 RTCDataChannel 实例RTCDataChannel-
pc获取 RTCPeerConnection 实例RTCPeerConnection-
eventConnection 事件object-

3.2 方法(Methods)

方法名说明参数回调参数
emitUIInteraction发送消息到应用程序stringPromise\<boolean>
send发送消息到应用程序string|Blob|ArrayBuffer|booleanvoid
changeBandwidth调节码率numbervoid
controlAuthority转移控制权限(详细参考投屏示例)tokenvoid

3.3 事件(Events)

事件名说明回调参数
connect可视化服务连接中-
dataChannelConnected连接成功,资源加载中-
close连接中断回调CloseEvent
disconnect信令断开回调string
interaction接收应用端返回数据string
afk超时断开-

四、播放管理(LivePlayer)

const launch = await RCRLaunch({ ... });
await launch.automata(container);
const livePlayer = launch.getPlayer();

4.1 属性(Attributes)

属性名说明类型默认值
videoElement播放实例节点HTMLVideoElement-
playerElement播放实例父级容器HTMLDivElement-
videoVolume获取 video 当前音量值(应用声音,ios设备永远返回1)number0

4.2 方法(Methods)

方法名说明参数回调参数
handleChangeCanResize设置播放实例显示模式自适应booleanvoid
resizePlayer初始化播放实例显示模式-void
showLoadingText设置加载中文字stringvoid
showTextOverlay设置播放页遮盖文字stringvoid
setVideoVolume设置 video 播放音量值(应用声音)numbervoid
handleChangeBgImage设置应用加载背景图stringvoid
handleChangeOrientationLock移动端调节旋转boolean(false:横屏|true:竖屏)void
handleChangeLandscapeType设置显示模式number(1:自适应|2:拉伸|3:裁剪)void

五、鼠标键盘控制相关接口(可选扩展)

当您需要对鼠标、键盘进行定制时(eg:组合键、改键映射),可以使用下面的能力。

5.1 键盘事件(Keyboard)

import { RCRLaunch, Keyboard } from 'ecloud-rcr';
const launch = await RCRLaunch({
  ...
  extendOptions: {
    eventOption: {
      enableKeyBoard: false, // 关闭默认键盘挂载
    },
    onPlay() {
      // 处理键盘映射
    },
  },
});
await launch.automata(container);
const connection = launch.getConnection();

// eg:发送键盘事件
connection.send(new Keyboard(27, false, false, false, false, false, false, true).dumps());

参数说明:

属性说明类型
keycode键码number
alt按下 altboolean
shift按下 shiftboolean
ctrl按下 ctrlboolean
nlock按下 nlockboolean
clock按下 clockboolean
slock按下 slockboolean
down按下boolean

5.2 鼠标移动事件(MouseMove)

import { MouseMove } from 'ecloud-rcr';
connection.send(new MouseMove(100, 300, 3, 4).dumps());

参数说明:

属性说明类型
xxnumber
yynumber
dxdxnumber
dydynumber

5.3 鼠标按钮事件(MouseButton)

import { MouseButton } from 'ecloud-rcr';
connection.send(new MouseButton(1, true).dumps());

参数说明:

属性说明类型
mouseButtonTypeleft = 1,middle=2, right=3number
down按下boolean

5.4 缩放事件(WheelScroll)

import { WheelScroll } from 'ecloud-rcr';
connection.send(new WheelScroll(10, true).dumps());

参数说明:

属性说明类型
stepstepnumber
forwardforwardboolean

5.6、触控事件(TouchSet)

import { TouchSet } from 'ecloud-rcr';
connection.send(new TouchSet(0, [{ x: 10, y: 10, id: 1 }]).dumps());

参数说明:

属性说明类型
touchTypedown = 0,update=1, up=2number
touchListTouchPoint:{x: number y: number id: number} //id:touch identifierTouchPoint[]

5.7、文本传输事件(TextInput)

import { TextInput } from 'ecloud-rcr';
connection.send(new TextInput('test text').dumps());

参数说明:

属性说明类型
text聚焦应用输入框时能够快速发送内容,比如实现复制粘贴功能string

5.8、鼠标控制管理相关(PointerManager)

import { PointerManager } from 'ecloud-rcr';
new PointerManager(target);

参数说明:

属性说明类型
target宿主容器HTMLElement
onExit全局退出或者中断回调() => void

属性说明:

属性名说明类型默认值
cursor光标实例base64: string, show: boolean, x: number, y: numbercursor

方法说明:

方法名说明参数回调参数
setCursor设置鼠标大小/形状Cursorvoid
destory销毁-void

六、常用问题

6.1 接入微信小程序

  • 步骤 1. 使用 jssdk 开发,打包成 html 部署到线上(生产环境需要域名解析) 2. 微信小程序通过 web-view 嵌入 html 地址(域名链接)
  • 开发 html 时候,微信(小程序)环境需要注意监听 WeixinJSBridgeReady 事件,然后开始对接 jssdk
window.addEventListener('DOMContentLoaded', () => {
  if (navigator.userAgent.includes('miniProgram') || navigator.userAgent.includes('MicroMessenger')) {
    //微信浏览器/微信小程序环境
    document.addEventListener('WeixinJSBridgeReady', bootstrap, false);
  } else {
    bootstrap();
  }
});

6.2 WebRTC 调试参考

  • 方法1:在任一浏览器标签地址打开 chrome://webrtc-internals,即可看到 WebRTC 的完整调试数据
  • 方法2:调⽤ Launcher showDashboard⽅法,显示仪表盘推流性能数据(注:空数据情况下记得调⽤ launcher toggleStatistics ⽅法切换状态)
  • 方法3:调⽤ Launcher exportLog ⽅法,导出 webrtc-internal s统计数据(注:空数据情况下记得调⽤ launcher toggleStatistics ⽅法切换状态)

6.3 接入多点触控需求(UE4)

  1. 接入 3DCAT 的 UE4 插件
  2. 在后台管理->应用详情->设置->开启多点触控。

6.4 投屏分享功能

功能说明:

  • 投屏交互分为主控端、观看端
  • 主控端需要使用投屏 appKey 初始化应用
  • 主控端生成观看端链接
  • 主控端可以赋予/回收临时操控权给观看端(需要创建投屏链接时勾选该功能)

主控端示例:

const launch = await RCRLaunch({
  appKey, // 投屏专用 appKey ,需要先增加投屏链接获取
  address, // 投屏需要指定集群地址,和观看端保持同集群
  baseOptions: {
    startType: 3, // 投屏链接
    isCastScreenMaster: true,
  },
  extendOptions: {
    onMount: () => {
      // 获取投屏观看端临时 appKey ,拼接投屏地址
      // 投屏地址可以直接使用当前页面(定义 query 参数来区分端),或使用独立的分享页面来进行物理分隔
      copyUrl = `${window.location.origin}${window.location.pathname}?appKey=${key}&type=share`;
    },
    toolOption: {
      // 生成投屏的功能按钮
      extendTools:[
        {
          icon: "your icon",
          text: "访问邀请",
          platform: 3,
          onClick: () => { 
            // 复制生成的投屏地址
          },
        },
      ],
    },
  },
});

connection.event.clientInfo.on((data) => {
  const list = data.clients || [];

  list.forEach((client) => {
    const { nickname, isControlAuthority, token } = client;
    // 渲染投屏用户列表,注意:
    // 1、仅主控端可以进行权限转移
    // 2、列表样式用户自行定义

    // 判断当前用户是自己
    if (token === launch.clientToken) {
      launch.handleChangeSubscribe(isControlAuthority); // 切换猫头工具的控制权
      isControlAuthority ? launch.handleSubscribe(videoEle) : launch.handleUnsubscribe(); // 订阅交互 or 取消订阅交互
    }
  });
});

观看端示例:

const bootstrap = async (nickname) => {
  try {
    const launch = await RCRLaunch({
      // appKey, // 不需要填,默认从 query 中读取观看端 appKey
      address, // 需要显式指定集群地址,确保和主控端在同一集群
      baseOptions: {
        startType: 3, // 投屏链接
        isCastScreenMaster: false,
        nickname: nickname, // 分享端必填
      },
    });
    connection.event.clientInfo.on((data) => {
      // 
    });
  } catch (error) {
    console.error(error);
  }
};

// 分享端要先拿到分享信息,渲染一个需要输入 nickname 的界面给用户填写,填写后再启动应用
1.4.0

9 months ago

1.3.3

11 months ago

1.3.2

11 months ago

1.3.1

11 months ago

1.3.0

11 months ago

1.2.0

1 year ago

1.1.4

1 year ago

1.1.1

1 year ago

1.1.3

1 year ago

1.1.2

1 year ago

1.1.0

2 years ago

1.0.0

2 years ago

1.0.0-beta.3

2 years ago

1.0.0-beta.2

2 years ago

1.0.0-beta.1

2 years ago