为满足不同业务场景的需求,无影云手机提供抢占模式和协同模式这两种拉流模式。本文介绍在不同拉流模式下的拉流最佳实践。
什么是拉流
拉流指通过客户端获取云手机画面并进行查看和操作的过程。为满足不同业务场景的需求,无影云手机提供两种拉流模式。
拉流模式 | 说明 | 适用产品版本 |
抢占模式 | 同一时间只有一个客户端可以连接一台云手机的画面进行查看与操作。当第一个客户端已经在对云手机进行拉流,则第二个客户端发起连接请求后,第一个客户端断开连接,由第二个客户端接管连接与拉流。 | 实例版 |
协同模式 | 同一时间可以有多个客户端连接同一台云手机的画面进行查看或操作,目前同时连接的客户端数量上限是10个,如果超出该上限,则后续用户无法获取Ticket。由于每多推一路流都会多占用一些带宽,您需要关注带宽占用情况并控制客户端连接数量。此模式通常适用于多端协同操作的场景。 |
|
矩阵版处于邀测中,如需体验,请提交工单申请。
指定拉流模式
实例版仅支持抢占模式,无需指定。对于矩阵版,矩阵内云手机实例的拉流模式是通过参数StreamMode
的值来控制的:
1
:抢占模式(默认值)。如果不传入任何值,则默认为抢占模式。2
:协同模式。说明如果希望创建云手机矩阵时默认采用协同模式,您可以提交工单来申请添加白名单。
因此,您可以在创建矩阵时直接指定拉流模式,或者修改已有矩阵的拉流模式。
创建矩阵时指定拉流模式
您可以调用CreateCloudPhoneNode来创建矩阵,并通过参数StreamMode
的值来指定矩阵的拉流模式。
请求参数
名称 |
类型 |
必填 |
描述 |
示例值 |
BizRegionId |
string |
是 |
地域 ID。 |
cn-hangzhou |
NodeName |
string |
否 |
云手机矩阵名称。 |
node_name |
ServerType |
string |
是 |
云手机矩阵规格。 |
cpm.gn6.gx1 |
InstanceType |
string |
否 |
实例规格。 说明
如需购买更多规格,您可以联系售前咨询。 |
ac.max |
ChargeType |
string |
否 |
付费类型。当前仅支持包年包月类型。 |
PrePaid |
PeriodUnit |
string |
否 |
购买资源的时长单位。 |
Month |
Period |
integer |
否 |
购买资源的时长,单位由
|
1 |
AutoPay |
boolean |
否 |
是否自动付费。 |
true |
AutoRenew |
boolean |
否 |
是否开启自动续费。 |
true |
ImageId |
string |
否 |
镜像 ID。 |
imgc-075cllfeuazh0**** |
Count |
string |
否 |
云手机矩阵的购买数量。 |
1 |
NetworkId |
string |
否 |
办公网络 ID。 |
cn-hangzhou+dir-5mwr9azebliva**** |
VSwitchId |
string |
否 |
交换机 ID。 |
vsw-2zeekryyc1q3sm72l**** |
Tag |
array<object> |
否 |
资源的标签。 |
|
object |
否 |
资源的标签。 |
||
Key |
string |
否 |
标签键。 |
keyname |
Value |
string |
否 |
标签值。 |
valuename |
PhoneDataVolume |
integer |
否 |
独立机身存储的大小。单位:GiB。 |
10 |
ServerShareDataVolume |
integer |
否 |
共享机身存储的大小。单位:GiB。 说明
共享机身存储最小值需大于矩阵下的实例开数乘以 10GiB。 |
200 |
ResolutionHeight |
integer |
否 |
分辨率的高度。单位:像素。 |
1280 |
ResolutionWidth |
integer |
否 |
分辨率的宽度。单位:像素。 |
720 |
PhoneCount |
integer |
否 |
云手机矩阵下的实例开数。 |
25 |
DisplayConfig |
object |
否 |
显示设置。 |
|
Dpi |
integer |
否 |
DPI。取值范围 72~600。 |
240 |
Fps |
integer |
否 |
说明
该参数暂未对外开放使用。 |
null |
LockResolution |
string |
否 |
是否锁定分辨率。 |
off |
StreamMode |
integer |
否 |
云手机矩阵下实例的串流模式,该参数不传默认为抢占模式。 |
1 |
NetworkType |
string |
否 |
||
NetworkInfo |
object |
否 |
||
BandwidthPackageName |
string |
否 |
||
CidrBlock |
string |
否 |
||
LimitedBandwidth |
integer |
否 |
||
InternetChargeType |
string |
否 |
||
IpRatio |
integer |
否 |
||
Isp |
string |
否 |
||
BandwidthPackageType |
string |
否 |
||
BandwidthPackageId |
string |
否 |
||
UpBandwidthLimit |
integer |
否 |
||
DownBandwidthLimit |
integer |
否 |
||
UseTemplate |
string |
否 |
创建时是否使用模板。如果使用模版列表的随机模板,则取值为 |
Random |
返回参数
名称 |
类型 |
描述 |
示例值 |
object |
请求信息。 |
||
RequestId |
string |
请求 ID。 |
69BCBBE4-FCF2-59B8-AD9D-531EB422**** |
OrderId |
string |
订单 ID。 |
223684716098**** |
NodeInfos |
array<object> |
云手机矩阵信息。 |
|
object |
云手机矩阵信息。 |
||
NodeId |
string |
云手机矩阵 ID。 |
cpn-e5kxgjyt8s1mb**** |
InstanceIds |
array |
云手机实例 ID 列表。 |
|
string |
云手机实例 ID。 |
cpn-e5kxgjyt8s1mb**** |
|
NetworkPackageOrderModel |
object |
||
BandwidthPackageOrderId |
string |
||
BandwidthPackageId |
string |
修改现有矩阵的拉流模式
对于现有矩阵,您可以调用ModifyCloudPhoneNode来修改参数StreamMode
的值,从而指定矩阵内所有云手机实例的拉流模式。
该接口为异步接口,后台会有几秒钟的处理时间,请10秒钟后再确认修改结果。
如果在拉流期间调用此接口修改拉流模式,则当前拉流会断开,并向客户端返回错误码2027
。为确保您的业务稳定性,建议您不要频繁修改拉流模式,仅在必要时才这样做。关于错误码的详细信息,请参见客户端相关错误码。
请求参数
名称 |
类型 |
必填 |
描述 |
示例值 |
NodeId |
string |
否 |
云手机矩阵 ID。 |
cpn-0ugbptfu473fy**** |
NewNodeName |
string |
否 |
云手机矩阵的新名称。 |
node_name_new |
StreamMode |
integer |
否 |
云手机矩阵下实例的串流模式,该参数不传默认为抢占模式。 |
1 |
返回参数
名称 |
类型 |
描述 |
示例值 |
object |
请求信息。 |
||
RequestId |
string |
请求 ID。 |
7B9EFA4F-4305-5968-BAEE-BD8B8DE5**** |
获取串流Ticket
调用BatchGetAcpConnectionTicket获取串流Ticket(连接凭证)。该接口在不同拉流模式下的作用和限制有所区别:
抢占模式:
同一时间只能有一个用户连接,如果有多个用户请求Ticket,则后续的请求会触发报错。
同一个用户可以多次请求Ticket,但只有最后一个Ticket生效。
允许抢占的情况下,请求Ticket的操作不会让正在连接的用户断连,只有连接实例时才会抢占前一个用户的连接。
协同模式:可通过传入不同的
EnduserId
来为不同的用户同时获取Ticket并串流。每次调用只能传入 1 个EnduserId
。说明用户的理论数量上限为10个,其中控制台和卡片模式会占用2个用户名额。在实际业务中,建议参与协同的用户数不超过5个。
请求参数
名称 |
类型 |
必填 |
描述 |
示例值 |
InstanceGroupId |
string |
否 |
实例组 ID。 |
ag-25nt4kk9whjh**** |
InstanceIds |
array |
否 |
云手机实例 ID 列表,可设置 1~100 个。 |
|
string |
否 |
实例 ID。 |
acp-bj9t2gmys**** |
|
EndUserId |
string |
否 |
已分配的用户 ID,如果不传,则会使用后台分配的系统用户获取 Ticket。 本参数的使用方法因云手机产品版本和实例串流模式而异:
说明
实例串流模式可通过 |
user |
InstanceTasks |
array<object> |
否 |
实例连接任务。 |
|
object |
否 |
实例连接任务。 |
||
InstanceId |
string |
否 |
实例 ID。 |
acp-fkuit0cmyfvzz**** |
TaskId |
string |
否 |
任务 ID。 |
cn-hangzhou@c9f5c2e8-f5c4-4b01-8602-000cae94**** |
返回参数
名称 |
类型 |
描述 |
示例值 |
object |
Schema of Response |
||
RequestId |
string |
请求 ID。 |
7B9EFA4F-4305-5968-BAEE-BD8B8DE5**** |
InstanceConnectionModels |
array<object> |
实例连接任务结果。 |
|
object |
实例连接任务结果。 |
||
AppInstanceGroupId |
string |
交付组 ID。 |
aig-1uzb6heg797z3**** |
InstanceId |
string |
实例 ID。 |
acp-ajxvwo1u0hqvd**** |
TaskStatus |
string |
任务状态。 |
FINISHED |
TaskId |
string |
任务 ID。 |
cn-hangzhou@c9f5c2e8-f5c4-4b01-8602-000cae94**** |
Ticket |
string |
用于连接用户实例的 Ticket。 |
piVE58_AdmVSVW7SEW3*AE5*p8mmO5gvItsNOmv4S_f_cNpoU_BOTwChTBoNM1ZJeedfK9zxYnbN5hossqIZCr6t7SGxRigm2Cb4fGaCdBZWIzmgdHq6sXXZQg4KFWufyvpeV*0*Cm58slMT1tJw3**** |
ErrorCode |
string |
错误原因。 |
InvalidResourceId.NotFound |
PersistentAppInstanceId |
string |
持久会话 ID。 |
p-abdywvcksdb**** |
AppInstanceId |
string |
物理实例 ID。 |
ai-0caoetkqi8kj**** |
同一个Ticket的有效期为10分钟。
断开用户连接(踢流)
调用DisconnectAndroidInstance断开用户连接。该接口在不同拉流模式下的作用有所区别:
抢占模式:将正在串流的用户断开连接。
协同模式:将正在串流的用户断开连接,并令其Ticket失效。
请求参数
名称 |
类型 |
必填 |
描述 |
示例值 |
InstanceIds |
array |
否 |
云手机实例 ID 列表,可设置 1~100 个。 |
|
string |
否 |
云手机实例 ID 列表。 |
acp-5hh4a31emkt6u**** |
|
EndUserId |
string |
否 |
如果使用的是云手机矩阵版,并且实例串流模式为协同模式,则可以通过指定 |
user1 |
返回参数
名称 |
类型 |
描述 |
示例值 |
object |
Schema of Response |
||
RequestId |
string |
请求 ID。 |
E5138F7E-46B5-526A-8C99-82DEAE6B**** |
客户端相关错误码
onDisconnected接收的断连错误消息如下表所示。
错误码 | 说明 |
2002 | 当前云手机被抢占。 |
2004 | 当前用户连接被断开。 |
2027 | 拉流模式已切换。 |
25 | Ticket校验失败。 说明 用户连接被断开后,用同一个Ticket再次请求建立连接也会触发此错误。 |