一、使用场景
场景描述:2个好友组小队后,匹配了3个路人组了一个大队伍,需要实现听全队的声音,但只和小队的好友说话。
自定义音频路由功能可以实现。这里5个人都进入同一个语音房间,然后通过音频路由的接口设置,玩家可以设置只听见2人队伍的声音或者全房间的声音,也可以设置为说话只被2人队伍的人听到或者全房间的人听到。
音频规则距离:SetServerAudioRouteSendOperateType(AUDIO_ROUTE_SEND_WHITE_LIST,"2人队伍的list",ITMG_SERVER_AUDIO_ROUTE_RECV_TYPE,"2人队伍的list");
这样声音就只发送给list里面的人,且只接收3人队伍的声音。
二、前提条件
·已开通实时语音服务:可参见 服务开通指引。
·已接入 GME SDK:包括核心接口和实时语音接口的接入,详情可参见 Native SDK 快速接入、Unity SDK 快速接入、Unreal SDK 快速接入。
·使用 GME 实时语音功能成功进入语音房间,并且打开了麦克风(EnableMic)、扬声器(EnableSpeaker)。
三、设置音频转发规则
调用此接口设置音频转发规则,此接口在进房成功回调中调用,调用后此次进房生效,退房后失效。
注意:禁言功能 AddBlackList 为本端生效,优先级高于自定义音频路由。例如 A 通过 SetServerAudioRouteSendOperateType 设置了只听 B 说话,但是又调用了 AddBlackList 将B禁言,此时 A 将听不到 B 的声音。
四、接口原型
UnityC++AndroidiOSpublic abstract class ITMGRoom{ public abstract int SetServerAudioRouteSendOperateType(ITMG_SERVER_AUDIO_ROUTE_SEND_TYPE Sendtype, string[] OpenIDforSend, ITMG_SERVER_AUDIO_ROUTE_RECV_TYPE Recvtype, string[] OpenIDforRecv);}virtual int SetServerAudioRoute(ITMG_SERVER_AUDIO_ROUTE_SEND_TYPE SendType, const char OpenIDforSend[][21], int OpenIDforSendSize, ITMG_SERVER_AUDIO_ROUTE_RECV_TYPE RecvType,const char OpenIDforRecv[][21], int OpenIDforRecvSize) = 0;public abstract int SetServerAudioRoute(ITMGContext.ITMG_SERVER_AUDIO_ROUTE_SEND_TYPE sendType, ArrayList<String> SendList, ITMGContext.ITMG_SERVER_AUDIO_ROUTE_RECV_TYPE recvType, ArrayList<String> RecvList);-(int)SetServerAudioRouteSendOperateType:(ITMG_SERVER_AUDIO_ROUTE_SEND_TYPE) Sendtype SendList:(NSArray *)OpenIDForSend RecvOperateType:(ITMG_SERVER_AUDIO_ROUTE_RECV_TYPE) Recvtype RecvList:(NSArray *)OpenIDForRecv;
五、类型说明
ITMG_SERVER_AUDIO_ROUTE_SEND_TYPE
设置发送音频规则,不同的规则填入后,会有不同的发送规则。
| 接收类型 | 效果 |
| AUDIO_ROUTE_NOT_SEND_TO_ANYONE | 本端音频上行发送到后台,但后台不转发给任何人,相当于将自己静音,此时参数 OpenIDForSend 无效,只需填 null |
| AUDIO_ROUTE_SEND_TO_ALL | 本端音频上行将转发给所有人,此时参数 OpenIDForSend 无效,只需填 null |
| AUDIO_ROUTE_SEND_BLACK_LIST | 本端音频上行将不转发给黑名单的人,黑名单由参数 OpenIDForSend 提供 |
| AUDIO_ROUTE_SEND_WHITE_LIST | 本端音频上行将只转发给白名单的人,白名单由参数 OpenIDForSend 提供 |
ITMG_SERVER_AUDIO_ROUTE_RECV_TYPE
设置接收音频规则,不同的规则填入后,会有不同的接收规则。
| 接收类型 | 效果 |
| AUDIO_ROUTE_NOT_RECV_FROM_ANYONE | 本端不接受任何音频,相当于关闭房间内扬声器效果,此时参数 OpenIDforRecv 无效,只需填 null |
| AUDIO_ROUTE_RECV_FROM_ALL | 本端接收所有人的音频,此时参数 OpenIDforRecv 无效,只需填 null |
| AUDIO_ROUTE_RECV_BLACK_LIST | 本端不接收黑名单的人的音频声音,黑名单由参数 OpenIDforRecv 提供 |
| AUDIO_ROUTE_RECV_WHITE_LIST | 本端只接收白名单的人的音频声音,白名单由参数 OpenIDforRecv 提供 |
六、返回值
接口返回值为 QAV_OK 则表示成功。
·若回调返回 1004 表示参数错误,建议重新检查参数是否正确。
·若回调返回 1001 表示重复操作。
·若回调返回 1201 表示房间不存在,建议检查房间号是否正确。
·若回调返回 10001 以及 1005 ,建议重新调用接口一次。
更多返回结果解释详情请参见 错误码 。
七、示例代码
执行语句
@synthesize _sendListArray;@synthesize _recvListArray;int ret = [[[ITMGContext GetInstance] GetRoom] SetServerAudioRouteSendOperateType:SendType SendList:_sendListArray RecvOperateType:RecvType RecvList:_recvListArray];if (ret != QAV_OK) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"更新audioroute列表失败" message:[NSString stringWithFormat:@"错误码:%d",ret] delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil]; ;}
回调
-(void)OnEvent:(ITMG_MAIN_EVENT_TYPE)eventType data:(NSDictionary *)data{ NSString* log =[NSString stringWithFormat:@"OnEvent:%d,data:%@", (int)eventType, data]; switch (eventType) { case ITMG_MAIN_EVENT_TYPE_SERVER_AUDIO_ROUTE_EVENT:{ { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"更新audioroute" message:[NSString stringWithFormat:@"结果:%@,sub_type: %@ errorinof: %@", data[@"result"],data[@"sub_type"],data[@"error_info"]] delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil]; ; } } default: break; }}
八、获取音频设置转发规则
调用此接口获取音频转发规则。调用后接口返回规则,传入的数组参数会返回相应规则的 openId。
九、接口原型
UnityiOSpublic abstract ITMG_SERVER_AUDIO_ROUTE_SEND_TYPE GetCurrentSendAudioRoute(List<string> OpenIDforSend);public abstract ITMG_SERVER_AUDIO_ROUTE_RECV_TYPE GetCurrentRecvAudioRoute(List<string> OpenIDforRecve);-(ITMG_SERVER_AUDIO_ROUTE_SEND_TYPE)GetCurrentSendAudioRoute:(NSMutableArray *) OpenIDForSend;-(ITMG_SERVER_AUDIO_ROUTE_RECV_TYPE)GetCurrentRecvAudioRoute:(NSMutableArray *) OpenIDForRecv;
十、返回规则
ITMG_SERVER_AUDIO_ROUTE_SEND_TYPE
| 接收类型 | 效果 |
| AUDIO_ROUTE_NOT_SEND_TO_ANYONE | 本端音频上行发送到后台,但后台不转发给任何人,相当于将自己静音 |
| AUDIO_ROUTE_SEND_TO_ALL | 本端音频上行将转发给所有人 |
| AUDIO_ROUTE_SEND_BLACK_LIST | 本端音频上行将不转发给黑名单的人 |
| AUDIO_ROUTE_SEND_WHITE_LIST | 本端音频上行将只转发给白名单的人 |
| AUDIO_ROUTE_RECV_INQUIRE_ERROR | 获取出错,检查是否进入房间,是否已经初始化 SDK |
ITMG_SERVER_AUDIO_ROUTE_RECV_TYPE
| 接收类型 | 效果 |
| AUDIO_ROUTE_NOT_RECV_FROM_ANYONE | 本端不接受任何音频,相当于关闭房间内扬声器效果 |
| AUDIO_ROUTE_RECV_FROM_ALL | 本端接收所有人的音频 |
| AUDIO_ROUTE_RECV_BLACK_LIST | 本端不接收黑名单的人的音频声音 |
| AUDIO_ROUTE_RECV_WHITE_LIST | 本端只接收白名单的人的音频声音 |
| AUDIO_ROUTE_RECV_INQUIRE_ERROR | 获取出错,检查是否进入房间,是否已经初始化 SDK |
注意:在 SetServerAudioRouteSendOperateType 接口中请勿使用 AUDIO_ROUTE_RECV_INQUIRE_ERROR。