范围语音

最近更新时间:2019-07-23 18:09:33

为方便开发者调试和接入腾讯云游戏多媒体引擎产品 API,这里向您介绍 GME 范围语音的接入技术文档。
GME 范围语音是专门为吃鸡类游戏开发的定制化产品。其有别于普通小队语音房间的核心能力为:

  1. 提供吃鸡类游戏中特有的“仅小队”或“所有人”的语音模式;
  2. 依托于范围判断能力,在同一个语音房间内,支持大量用户同时打开麦克风进行语音通话。

基本概念

1. 当进入房间时指定的 TeamID != 0 时,进入范围语音房间模式;

2. 当进入范围语音房间时,有两种语音模式可供选择:

语音模式 参数名称 功能
所有人 RANGE_AUDIO_MODE_WORLD 设置后玩家附近一定范围的人都能听到该玩家讲话
仅小队 RANGE_AUDIO_MODE_TEAM 仅队友可以听到

3. 不同的语音模式下,其具体的声音可达情况如下:

a. 同一小队内,无论距离多远、玩家为何种语音状态都能听见

b. 不同小队情况下,双方开启“所有人”的语音状态情况下,在距离内可以互相听见

具体详细的声音可达情况如下表格:

假设 A 玩家状态为“所有人”,对应 B 玩家在不同语音模式下声音可达情况:

是否同一小队 是否范围内 语音模式 A 能不能听到 B 的声音 B 能不能听到 A 的声音
同一小队 MODE_WORLD A 可以听到 B 的声音 B 可以听到 A 的声音
同一小队 MODE_TEAM A 可以听到 B 的声音 B 可以听到 A 的声音
同一小队 MODE_WORLD A 可以听到 B 的声音 B 可以听到 A 的声音
同一小队 MODE_TEAM A 可以听到 B 的声音 B 可以听到 A 的声音
不同小队 MODE_WORLD A 可以听到 B 的声音 B 可以听到 A 的声音
不同小队 MODE_TEAM A 不可以听到 B 的声音 B 不可以听到 A 的声音
不同小队 MODE_WORLD A 不可以听到 B 的声音 B 不可以听到 A 的声音
不同小队 MODE_TEAM A 不可以听到 B 的声音 B 不可以听到 A 的声音

假设 A 玩家状态为“仅小队“,对应 B 玩家在不同语音模式下声音可达情况:

是否同一小队 是否范围内 语音状态 A 能不能听到 B 的声音 B 能不能听到 A 的声音
同一小队 MODE_WORLD A 可以听到 B 的声音 B 可以听到 A 的声音
同一小队 MODE_TEAM A 可以听到 B 的声音 B 可以听到 A 的声音
同一小队 MODE_WORLD A 可以听到 B 的声音 B 可以听到 A 的声音
同一小队 MODE_TEAM A 可以听到 B 的声音 B 可以听到 A 的声音
不同小队 MODE_WORLD A 不可以听到 B 的声音 B 不可以听到 A 的声音
不同小队 MODE_TEAM A 不可以听到 B 的声音 B 不可以听到 A 的声音
不同小队 MODE_WORLD A 不可以听到 B 的声音 B 不可以听到 A 的声音
不同小队 MODE_TEAM A 不可以听到 B 的声音 B 不可以听到 A 的声音

4. 对语音距离范围的补充:

  • 是否在语音距离范围内,不影响同一小队成员互相通话。
  • 设置接收语音距离范围参考 API:UpdateAudioRecvRange
  • 支持在范围语音房间中实时切换语音模式。但不支持在房间内更换 TeamID,TeamID 必须在进房前指定。

使用流程

有别于普通小队语音房间,在使用范围语音能力时,必须在 EnterRoom 之前,调用以下两个 API:

1. 设置 TeamID

  • 通过此方法设置队伍号,必须在 EnterRoom 之前调用,否则将直接返回错误码 AV_ERR_ROOM_NOT_EXITED(1202);
  • 在退房时,此参数不会自动重置为0,所以一旦决定调用此语音模式,请在每次 EnterRoom 之前都调用此方法设置 TeamID。

函数原型

ITMGContext SetRangeAudioTeamID(int teamID)
参数 类型 意义
teamID int 队伍号,专供范围语音中进行上下行音频流控制。当 TeamID 为 0 时,通话模式为普通小队语音,默认 0。

2. 设置 AudioMode

  • 通过此方法修改语音模式,可在进房前调用,也可在进房后调用。
  • 在进房前调用此方法,方法将影响下一次进房;
  • 在进房后调用此方法,将直接改变当前用户的语音模式;
  • 在退房时,此参数不会自动重置为 MODE_WORLD,所以一旦决定调用此方法,请在每次 EnterRoom 之前都调用此方法设置 audioMode。

函数原型

ITMGRoom int SetRangeAudioMode(RANGE_AUDIO_MODE rangeAudioMode)
参数 类型 意义
rangeAudioMode int 0(MODE_WORLD) 代表“所有人”,1(MODE_TEAM) 代表"仅小队"

3. 设置接收语音距离范围

  • 通过此方法用于设置接收的语音范围(距离以游戏引擎为准),只支持在进房成功后调用;
  • 此方法必须配合 UpdateSelfPosition 更新声源方位联合使用。

函数原型

ITMGRoom int UpdateAudioRecvRange(int range)
参数 类型 意义
range int 最大可以接收音频的范围

示例代码

ITMGContext.GetInstance().GetRoom().UpdateAudioRecvRange(300);

4. 更新声源方位

  • 此函数用于更新声源位置信息,只支持在进房成功后调用;
  • 在此产品形态中,只需要位置,不需要指定声音朝向;
  • 在判定声源和听众之间的距离时,使用声源的 SelfPostion、听众的 SelfPostion 和听众的 AudioRecvRange 联合判定。

函数原型

public abstract int UpdateSelfPosition(int position[3], float axisForward[3], float axisRight[3], float axisUp[3])
参数 类型 意义
position int[] 自身在世界坐标系中的坐标,顺序是前、右、上
axisForward float[] 在本产品中无需关注
axisRight float[] 在本产品中无需关注
axisUp float[] 在本产品中无需关注