IOS语音功能接入说明

1 接入指南

龙图SDK语音功能目前整合了腾讯语音SDK.本SDK最低支持ios8.0。
语音SDK可以在龙图BaseSDK内LTVoiceSDK文件夹内获取。
LTVoiceGMESDK.framework
GMESDK.framework
libgmefdkaac.framework
libgmelamemp3.framework
libgmeogg.framework
libgmesoundtouch.framework
接口分为C++和OC两种

2 工程配置

2.1 添加库、资源、配置文件

需要根据情况在 Xcode 的 Link Binary With Libraries 里面加上下面的依赖库。
参考下图:

2.2 权限申请

龙图SDK语音功能所需要的隐私权限如下:

key 意义
Required background modes 允许后台运行(可选)
Microphone Usaeg Description 允许麦克风权限

2.3 添加 HTTP 访问权限

需要增加 Allow Arbitrary Loads 权限。
添加 HTTP 访问权限

2.4 配置Info.plist文件

在info.plist 内添加
LTVoiceGmeAppId
LTVoiceGmeAppKey
两个节点, 对应的参数可以联系技术支持获取

  1. <key>LTVoiceGmeAppId</key>
  2. <string>腾讯gme的appid</string>
  3. <key>LTVoiceGmeAppKey</key>
  4. <string>腾讯gme的appkey</string>

3 离线语音接口使用(C++)

功能说明
语音

3.1 开始录音接口

开始录音接口,需要调用录音结束才能完成录音。
录音录制时长最大为58毫秒。 请研发限制录音时长。

3.1.1 接口调用示例

  1. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceStartRecordingStreaming();

3.2 录音结束接口

录音结束会通过数据回调返回录音的结果,
如果成功以后会返回
本次录音对应的文字,
本次录音对应的fileid,
本次录音在本地的存储路径。
fileid 需要妥善保存,因为播放本条录音时需要此参数。
具体参数将会在数据回调接口说明。

3.2.1 接口调用示例

  1. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceStopRecording();

3.3 录音取消接口

取消本地录音操作,不会返回任何数据。

3.3.1 接口调用示例

  1. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceCancelRecording();

3.4 录音播放接口

播放录音接口, 需要录音完成时返回的fileID进行播放。
播放完成会通过数据回调返回播放结果。

3.4.1 接口调用示例

  1. /**
  2. * 播放语音
  3. * 此接口用于播放语音。
  4. * @param fileId 录音完成返回的fileId
  5. */
  6. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoicePlayRecordedFile(const char * fileId);

3.5 录音变声播放接口

录音变声播放接口, 需要录音完成时返回的fileID进行播放。
播放完成会通过数据回调返回播放结果。

3.5.1 变声参数

变声参数定义 在LTParam.h头文件内的LTGame_VOICE_TYPE,

参数名 效果说明 参数值
LTGame_VOICE_TYPE_ORIGINAL_SOUND 原声 0
LTGame_VOICE_TYPE_LOLITA 萝莉音 1
LTGame_VOICE_TYPE_UNCLE 大叔音 2
LTGame_VOICE_TYPE_INTANGIBLE 空灵 3
LTGame_VOICE_TYPE_DEAD_FATBOY 死肥宅 4
LTGame_VOICE_TYPE_HEAVY_MENTAL 重金属 5
LTGame_VOICE_TYPE_DIALECT 歪果仁 6
LTGame_VOICE_TYPE_INFLUENZA 感冒 7
LTGame_VOICE_TYPE_CAGED_ANIMAL 困兽 8
LTGame_VOICE_TYPE_HEAVY_MACHINE 重机器 9
LTGame_VOICE_TYPE_STRONG_CURRENT 强电流 10
LTGame_VOICE_TYPE_KINDER_GARTEN 幼稚园 11
LTGame_VOICE_TYPE_HUANG 小黄人 12

3.5.2 接口调用示例

  1. /**
  2. * 播放语音
  3. * 此接口用于播放语音。
  4. * @param fileId 录音完成返回的fileId
  5. */
  6. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoicePlayRecordedFileType(const char * fileId.,int type);

3.6 语音文件转文本

语音文件转换文本文字。
转换结果会通过回调接口返回。

3.6.1 接口调用示例

  1. /**
  2. * 将指定的语音文件识别成文字
  3. * 此接口用于将指定的语音文件识别成文字。
  4. *
  5. * @param fileID 指定文件转成文字,fileID 为录音成功后返回的
  6. */
  7. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceSpeechToText(const char * fileID)

3.7 获取语音时长

获取语音文件时长,
此接口用于获取语音文件的时长,单位毫秒。

3.7.1 接口调用示例

  1. /**
  2. * 获取语音文件的时长
  3. * 此接口用于获取语音文件的时长,单位毫秒。
  4. * @param filePath 文件地址
  5. * @return 单位毫秒。
  6. */
  7. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceGetVoiceFileDuration(const char * filePath)

3.8 取消语音播放

此接口用于停止播放语音。停止播放语音也会有播放完成的回调。

3.8.1 接口调用示例

  1. /**
  2. * 停止播放语音
  3. * 此接口用于停止播放语音。停止播放语音也会有播放完成的回调。
  4. */
  5. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceStopPlayFile();

3.9 取消录音

调用此接口取消录音。取消之后没有回调。

3.9.1 接口调用示例

  1. /**
  2. * 停止播放语音
  3. * 此接口用于停止播放语音。停止播放语音也会有播放完成的回调。
  4. */
  5. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceCancelRecording();

3.10 获取离线语音麦克风实时音量

获取离线语音麦克风实时音量
此接口用于获取麦克风实时音量,
返回值为 int 类型,值域为0到100。

3.10.1 接口调用示例

  1. /**
  2. * 获取离线语音麦克风实时音量
  3. * 此接口用于获取麦克风实时音量,
  4. * @return 返回值为 int 类型,值域为0到100。
  5. */
  6. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceGetMicLevel();

3.11 设置离线语音录制音量

设置离线语音录制音量
此接口用于设置离线语音录制音量,值域为0到100。
vol 值域为0到100

3.11.1 接口调用示例

  1. /**
  2. * 设置离线语音录制音量
  3. * 此接口用于设置离线语音录制音量,值域为0到100。
  4. * @param vol 值域为0到100
  5. */
  6. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceSetMicVolume(10);

3.12 获取语音消息录制音量

获取离线语音录制音量
此接口用于获取离线语音录制音量。
返回值为 int 类型,值域为0到100。

3.12.1 接口调用示例

  1. /**
  2. * 获取离线语音录制音量
  3. * 此接口用于获取离线语音录制音量。
  4. * @return 返回值为 int 类型,值域为0到100。
  5. */
  6. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceGetMicVolume();

3.13 获取扬声器实时音量

获取扬声器实时音量
此接口用于获取扬声器实时音量。
返回值为 int 类型,值域为0到100。

3.13.1 接口调用示例

  1. /**
  2. * 获取扬声器实时音量
  3. * 此接口用于获取离线语音录制音量。
  4. * @return 返回值为 int 类型,值域为0到100。
  5. */
  6. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceGetSpeakerLevel();

3.14 设置离线语音播放音量

设置离线语音播放音量
此接口用于设置离线语音播放音量。
int 类型,值域为0到100。

3.14.1 接口调用示例

  1. /**
  2. * 设置离线语音播放音量
  3. * 此接口用于设置离线语音播放音量。
  4. * int 类型,值域为0到100。
  5. */
  6. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceSetSpeakerVolume(10);

3.15 获取离线语音播放音量

获取离线语音播放音量
此接口用于获取离线语音播放音量。
返回值为 int 类型,值域为0到100。

3.15.1 接口调用示例

  1. /**
  2. * 设置离线语音播放音量
  3. * 此接口用于设置离线语音播放音量。
  4. * @return 返回值为 int 类型,值域为0到100。
  5. */
  6. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceGetSpeakerVolume();

3.16 可以 设置语音功能数据回调

设置语音功能数据回调,
通过此回调返回录音结果,播放结果等数据

3.16.1 接口参数说明

事件类型参数定义 在LTParam.h头文件内的LTGame_VOICE_EVENT_TYPE,

事件类型(type) 错误码(errCode) 数据信息 json格式(data) 说明
LTGame_VOICE_EVNET_TYPE_PTT_STREAMINGRECOGNITION_COMPLETE 0成功,非0 失败 {“file_id”:””,”file_path”:”,”text”:””,”result”:0} 录音完成
LTGame_VOICE_EVNET_TYPE_PTT_PLAY_COMPLETE 0成功,非0 失败 {“file_path”:””,”result”:0} 播放完成
LTGame_VOICE_EVNET_TYPE_PTT_SPEECH2TEXT_COMPLETE 0成功,非0 失败 {“file_id”:””,”text”:””,”result”:0} 语音转文本完成

JSon 数据格式说明:

参数名 数据格式 说明
file_id 字符串 录音在后台的 url 地址,录音在腾讯服务器存放90天
file_path 字符串 录音文件本地存储路径
text 字符串 录音文件对应的文字内容
result int 同错误码

3.16.2 接口调用示例

  1. /**
  2. * 设置语音业务回调
  3. * @param pfunc 数据回调类
  4. */
  5. LongTuBaseSdk::LTGameSDK::GetInstance().setVoiceEventLinstener(verificationLinstener);
  6. /**
  7. * 语言业务结果回调
  8. *
  9. * @param type 事件类型
  10. * @param errCode 错误码
  11. * @param data 数据信息 json格式
  12. *
  13. */
  14. void verificationLinstener(int type, int errCode,const char *data){
  15. cout<<"*********VerificationLinstener********"<<endl;
  16. Json::Reader json_reader;
  17. Json::Value json_object;
  18. if (!json_reader.parse(data, json_object)){
  19. return;
  20. }
  21. switch (type) {
  22. case LTGame_VOICE_EVNET_TYPE_PTT_UPLOAD_COMPLETE:{
  23. // 上传 语音文件 完成
  24. if (errCode == 0) {
  25. string file_id = json_object["file_id"].asString();
  26. string file_path = json_object["file_path"].asString();
  27. NSString* fileID = [NSString stringWithUTF8String:file_id.c_str()];
  28. NSString* filePath = [NSString stringWithUTF8String:file_path.c_str()];
  29. NSLog(@" 上传成功 fileID = %@ filePath = %@" ,fileID,filePath);
  30. }else{
  31. // 上传失败
  32. NSLog(@" 上传失败 ");
  33. }
  34. break;
  35. }
  36. case LTGame_VOICE_EVNET_TYPE_PTT_DOWNLOAD_COMPLETE:{
  37. // 下载 语音文件完成
  38. if (errCode == 0) {
  39. string file_id = json_object["file_id"].asString();
  40. string file_path = json_object["file_path"].asString();
  41. NSString* fileID = [NSString stringWithUTF8String:file_id.c_str()];
  42. NSString* filePath = [NSString stringWithUTF8String:file_path.c_str()];
  43. NSLog(@" 下载 语音文件完成 fileID = %@ filePath = %@" ,fileID,filePath);
  44. }else{
  45. // 下载失败
  46. NSLog(@" 下载失败");
  47. }
  48. break;
  49. }
  50. case LTGame_VOICE_EVNET_TYPE_PTT_PLAY_COMPLETE:{
  51. // 播放语音文件完成
  52. if (errCode == 0) {
  53. string file_path = json_object["file_path"].asString();
  54. NSString* filePath = [NSString stringWithUTF8String:file_path.c_str()];
  55. NSLog(@" 播放语音文件完成 filePath = %@" ,filePath);
  56. }else{
  57. // 播放语音文件失败
  58. NSLog(@" 播放语音文件失败 ");
  59. }
  60. break;
  61. }
  62. case LTGame_VOICE_EVNET_TYPE_PTT_SPEECH2TEXT_COMPLETE:{
  63. // 语音翻译成文字
  64. if (errCode == 0) {
  65. string file_id = json_object["file_id"].asString();
  66. string text = json_object["text"].asString();
  67. NSString* fileID = [NSString stringWithUTF8String:file_id.c_str()];
  68. NSString* NSText = [NSString stringWithUTF8String:text.c_str()];
  69. [mLTVoiceViewController setDemoSTREAMINGRECOGNITION_COMPLETE:2 file_id:fileID filePath:@"" FileText:NSText];
  70. NSLog(@" 语音翻译成文字 fileID = %@ NSText = %@" ,fileID,NSText);
  71. }else{
  72. // 语音翻译成文字 失败
  73. NSLog(@" 语音翻译成文字 失败 ");
  74. }
  75. break;
  76. }
  77. case LTGame_VOICE_EVNET_TYPE_PTT_STREAMINGRECOGNITION_COMPLETE:{
  78. // 流式录音录制完成
  79. if (errCode == 0) {
  80. string file_id = json_object["file_id"].asString();
  81. string file_path = json_object["file_path"].asString();
  82. string text = json_object["text"].asCString();
  83. NSString* fileID = [NSString stringWithUTF8String:file_id.c_str()];
  84. NSString* filePath = [NSString stringWithUTF8String:file_path.c_str()];
  85. NSString* NSText = [NSString stringWithUTF8String:text.c_str()];
  86. mLTVoiceViewController->currentFileID = [fileID copy];
  87. [mLTVoiceViewController setDemoSTREAMINGRECOGNITION_COMPLETE:0 file_id:fileID filePath:filePath FileText:NSText];
  88. }else{
  89. //流式录音录制失败
  90. NSLog(@" 流式录音录制失败" );
  91. [mLTVoiceViewController setDemoSTREAMINGRECOGNITION_COMPLETE:0 file_id:@" 录制失败" filePath:@" 录制失败" FileText:@" 录制失败"];
  92. }
  93. break;
  94. }
  95. default:
  96. break;
  97. }
  98. }

3 离线语音接口使用(OC)

功能说明
语音

3.1 开始录音接口

开始录音接口,需要调用录音结束才能完成录音。
录音录制时长最大为58毫秒。 请研发限制录音时长。

3.1.1 接口调用示例

  1. [[LTGameOCSDK shareInstance] LTSDKVoiceStartRecordingStreaming];

3.2 录音结束接口

录音结束会通过数据回调返回录音的结果,
如果成功以后会返回
本次录音对应的文字,
本次录音对应的fileid,
本次录音在本地的存储路径。
fileid 需要妥善保存,因为播放本条录音时需要此参数。
具体参数将会在数据回调接口说明。

3.2.1 接口调用示例

  1. [[LTGameOCSDK shareInstance] LTSDKVoiceStopRecording];

3.3 录音取消接口

取消本地录音操作,不会返回任何数据。

3.3.1 接口调用示例

  1. [[LTGameOCSDK shareInstance]
  2. ];

3.4 录音播放接口

播放录音接口, 需要录音完成时返回的fileID进行播放。
播放完成会通过数据回调返回播放结果。

3.4.1 接口调用示例

  1. /**
  2. * 播放语音
  3. * 此接口用于播放语音。
  4. * @param fileId 录音完成返回的fileId
  5. */
  6. [[LTGameOCSDK shareInstance] LTSDKVoicePlayRecordedFile:currentFileID];

3.5 录音变声播放接口

录音变声播放接口, 需要录音完成时返回的fileID进行播放。
播放完成会通过数据回调返回播放结果。

3.5.1 变声参数

变声参数定义 在LTParam.h头文件内的LTGame_VOICE_TYPE,

参数名 效果说明 参数值
LTGame_VOICE_TYPE_ORIGINAL_SOUND 原声 0
LTGame_VOICE_TYPE_LOLITA 萝莉音 1
LTGame_VOICE_TYPE_UNCLE 大叔音 2
LTGame_VOICE_TYPE_INTANGIBLE 空灵 3
LTGame_VOICE_TYPE_DEAD_FATBOY 死肥宅 4
LTGame_VOICE_TYPE_HEAVY_MENTAL 重金属 5
LTGame_VOICE_TYPE_DIALECT 歪果仁 6
LTGame_VOICE_TYPE_INFLUENZA 感冒 7
LTGame_VOICE_TYPE_CAGED_ANIMAL 困兽 8
LTGame_VOICE_TYPE_HEAVY_MACHINE 重机器 9
LTGame_VOICE_TYPE_STRONG_CURRENT 强电流 10
LTGame_VOICE_TYPE_KINDER_GARTEN 幼稚园 11
LTGame_VOICE_TYPE_HUANG 小黄人 12

3.5.2 接口调用示例

  1. /**
  2. * 播放语音
  3. * 此接口用于播放语音。
  4. * @param fileId 录音完成返回的fileId
  5. */
  6. [[LTGameOCSDK shareInstance] LTSDKVoicePlayRecordedFileType:downloadFilePath VoiceType: type];

3.6 语音文件转文本

语音文件转换文本文字。
转换结果会通过回调接口返回。

3.6.1 接口调用示例

  1. /**
  2. * 将指定的语音文件识别成文字
  3. * 此接口用于将指定的语音文件识别成文字。
  4. *
  5. * @param fileID 指定文件转成文字,fileID 为录音成功后返回的
  6. */
  7. [[LTGameOCSDK shareInstance] LTSDKVoiceSpeechToText:currentFileID];

3.7 获取语音时长

获取语音文件时长,
此接口用于获取语音文件的时长,单位毫秒。

3.7.1 接口调用示例

  1. /**
  2. * 获取语音文件的时长
  3. * 此接口用于获取语音文件的时长,单位毫秒。
  4. * @param filePath 文件地址
  5. * @return 单位毫秒。
  6. */
  7. [[LTGameOCSDK shareInstance] LTSDKVoiceGetVoiceFileDuration:filePath];

3.8 取消语音播放

此接口用于停止播放语音。停止播放语音也会有播放完成的回调。

3.8.1 接口调用示例

  1. /**
  2. * 停止播放语音
  3. * 此接口用于停止播放语音。停止播放语音也会有播放完成的回调。
  4. */
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceStopPlayFile];

3.9 取消录音

取消录音

3.9.1 接口调用示例

  1. /**
  2. * 取消录音
  3. * 调用此接口取消录音。取消之后没有回调。
  4. */
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceCancelRecording];

3.10 获取离线语音麦克风实时音量

获取离线语音麦克风实时音量
此接口用于获取麦克风实时音量,返回值为 int 类型,值域为0到100。

3.10.1 接口调用示例

  1. /**
  2. * 获取离线语音麦克风实时音量
  3. * 此接口用于获取麦克风实时音量,返回值为 int 类型,值域为0到100。
  4. */
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceGetMicLevel];

3.11 设置离线语音录制音量

获取离线语音麦克风实时音量
此接口用于获取麦克风实时音量,返回值为 int 类型,值域为0到100。

3.11.1 接口调用示例

  1. /**
  2. * 设置离线语音录制音量
  3. * 此接口用于设置离线语音录制音量,值域为0到100。
  4. */
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceSetMicVolume:100];

3.12 获取离线语音录制音量

获取离线语音录制音量
此接口用于获取离线语音录制音量。返回值为 int 类型,值域为0到100。

3.12.1 接口调用示例

  1. /**
  2. * 获取离线语音录制音量
  3. * 此接口用于获取离线语音录制音量。返回值为 int 类型,值域为0到100。
  4. */
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceGetMicVolume];

3.13 获取扬声器实时音量

获取离线语音录制音量
此接口用于获取离线语音录制音量。返回值为 int 类型,值域为0到100。

3.13.1 接口调用示例

  1. /**
  2. * 获取扬声器实时音量
  3. * 此接口用于获取扬声器实时音量。返回值为 int 类型,值域为0到100。
  4. */
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceGetSpeakerLevel];

3.14 设置离线语音播放音量

设置离线语音播放音量
此接口用于设置离线语音播放音量。
vol 值域为0到100

3.14.1 接口调用示例

  1. /**
  2. * 获取扬声器实时音量
  3. * 此接口用于获取扬声器实时音量。返回值为 int 类型,值域为0到100。
  4. */
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceSetSpeakerVolume:100];

3.15 获取离线语音播放音量

获取离线语音播放音量
此接口用于获取离线语音播放音量。
@return 返回值为 int 类型,值域为0到100。

3.15.1 接口调用示例

  1. /**
  2. * 获取扬声器实时音量
  3. * 此接口用于获取扬声器实时音量。返回值为 int 类型,值域为0到100。
  4. */
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceGetSpeakerVolume];

3.16 设置语音功能数据回调

设置语音功能数据回调,
通过此回调返回录音结果,播放结果等数据

3.16.1 接口参数说明

事件类型参数定义 在LTParam.h头文件内的LTGame_VOICE_EVENT_TYPE,

事件类型(type) 错误码(errCode) 数据信息 json格式(data) 说明
LTGame_VOICE_EVNET_TYPE_PTT_STREAMINGRECOGNITION_COMPLETE 0成功,非0 失败 {“file_id”:””,”file_path”:”,”text”:””,”result”:0} 录音完成
LTGame_VOICE_EVNET_TYPE_PTT_PLAY_COMPLETE 0成功,非0 失败 {“file_path”:””,”result”:0} 播放完成
LTGame_VOICE_EVNET_TYPE_PTT_SPEECH2TEXT_COMPLETE 0成功,非0 失败 {“file_id”:””,”text”:””,”result”:0} 语音转文本完成

JSon 数据格式说明:

参数名 数据格式 说明
file_id 字符串 录音在后台的 url 地址,录音在腾讯服务器存放90天
file_path 字符串 录音文件本地存储路径
text 字符串 录音文件对应的文字内容
result int 同错误码

3.16.2 接口调用示例

  1. /**
  2. * 设置语音业务代理调
  3. */
  4. //设置代理
  5. [LTGameOCSDK shareInstance].delegate = self;
  6. // 设置语音相关的数据回调
  7. [[LTGameOCSDK shareInstance] LTSDKSetVoiceEventLinstener];
  8. /// 语音功能回调
  9. /// @param type 类型
  10. /// @param errCode 错误码
  11. /// @param dict 返回内容
  12. - (void)ltVerificationLinstenerWithType:(int)type errCode:(int)errCode dict:(NSDictionary *)dict{
  13. switch (type) {
  14. case LTGame_VOICE_EVNET_TYPE_PTT_UPLOAD_COMPLETE:{
  15. // 上传 语音文件 完成
  16. if (errCode == 0) {
  17. NSString* fileID = [dict objectForKey:@"file_id"];
  18. NSString* filePath = [dict objectForKey:@"file_path"];
  19. NSLog(@" 上传成功 fileID = %@ filePath = %@" ,fileID,filePath);
  20. }else{
  21. // 上传失败
  22. NSLog(@" 上传失败 ");
  23. }
  24. break;
  25. }
  26. case LTGame_VOICE_EVNET_TYPE_PTT_DOWNLOAD_COMPLETE:{
  27. // 下载 语音文件完成
  28. if (errCode == 0) {
  29. NSString* fileID = [dict objectForKey:@"file_id"];
  30. NSString* filePath = [dict objectForKey:@"file_path"];
  31. NSLog(@" 下载 语音文件完成 fileID = %@ filePath = %@" ,fileID,filePath);
  32. }else{
  33. // 下载失败
  34. NSLog(@" 下载失败");
  35. }
  36. break;
  37. }
  38. case LTGame_VOICE_EVNET_TYPE_PTT_PLAY_COMPLETE:{
  39. // 播放语音文件完成
  40. if (errCode == 0) {
  41. NSString* filePath = [dict objectForKey:@"file_path"];
  42. NSLog(@" 播放语音文件完成 filePath = %@" ,filePath);
  43. }else{
  44. // 播放语音文件失败
  45. NSLog(@" 播放语音文件失败 ");
  46. }
  47. break;
  48. }
  49. case LTGame_VOICE_EVNET_TYPE_PTT_SPEECH2TEXT_COMPLETE:{
  50. // 语音翻译成文字
  51. if (errCode == 0) {
  52. NSString* fileID = [dict objectForKey:@"file_id"];
  53. NSString* NSText = [dict objectForKey:@"text"];
  54. [mLTVoiceViewController setDemoSTREAMINGRECOGNITION_COMPLETE:2 file_id:fileID filePath:@"" FileText:NSText];
  55. NSLog(@" 语音翻译成文字 fileID = %@ NSText = %@" ,fileID,NSText);
  56. }else{
  57. // 语音翻译成文字 失败
  58. NSLog(@" 语音翻译成文字 失败 ");
  59. }
  60. break;
  61. }
  62. case LTGame_VOICE_EVNET_TYPE_PTT_STREAMINGRECOGNITION_COMPLETE:{
  63. // 流式录音录制完成
  64. if (errCode == 0) {
  65. NSString* fileID = [dict objectForKey:@"file_id"];
  66. NSString* NSText = [dict objectForKey:@"text"];
  67. NSString* filePath = [dict objectForKey:@"file_path"];
  68. mLTVoiceViewController->currentFileID = [fileID copy];
  69. [mLTVoiceViewController setDemoSTREAMINGRECOGNITION_COMPLETE:0 file_id:fileID filePath:filePath FileText:NSText];
  70. }else{
  71. //流式录音录制失败
  72. NSLog(@" 流式录音录制失败" );
  73. [mLTVoiceViewController setDemoSTREAMINGRECOGNITION_COMPLETE:0 file_id:@" 录制失败" filePath:@" 录制失败" FileText:@" 录制失败"];
  74. }
  75. break;
  76. }
  77. default:
  78. break;
  79. }
  80. }

4 实时语音接口使用(C++)

功能说明
语音

4.1 获取openID接口

直接使用当前用户的角色ID即可,语音功能是按照角色收费的.
注意:以下接口中的openID均传入角色ID.

4.2 系统暂停接口

当系统发生 Pause 事件时,需要同时通知引擎进行 Pause。

4.2.1 接口调用示例

  1. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoicePause();

4.3 系统恢复接口

当系统发生 Resume 事件时,需要同时通知引擎进行 Resume。Resume 接口只恢复实时语音。

4.3.1 接口调用示例

  1. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceResume();

4.4 是否已经进入房间接口

通过调用此接口可以判断是否已经进入房间,返回值为 bool 类型。

4.4.1 接口调用示例

  1. bool isEntered = LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceIsRoomEntered();

4.5 进入房间

会收到消息为 LTGame_VOICE_EVENT_TYPE_ENTER_ROOM 的回调。加入房间默认不打开麦克风及扬声器。

4.5.1 接口调用示例

  1. /// @param roomId 房间号,最大支持127字符。
  2. /// @param roomType 房间音频类型 传入
  3. ///1 流畅音质,流畅优先、超低延迟实时语音,应用在游戏内开黑场景,适用于 FPS、MOBA 等类型的游戏;
  4. ///2 标准音质,音质较好,延时适中,适用于狼人杀、棋牌等休闲游戏的实时通话场景;
  5. ///3 高清音质,超高音质,延时相对大一些,适用于音乐舞蹈类游戏以及语音社交类 App;适用于播放音乐、线上 K 歌等有高音质要求的场景.
  6. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceEnterAudioRoom("1",1);

4.5.2 接口调用示例

  1. /// 进入房间
  2. /// @param roomId 房间号,最大支持127字符。
  3. /// @param roomType 房间音频类型 传入 1 流畅音质,流畅优先、超低延迟实时语音,应用在游戏内开黑场景,适用于 FPS、MOBA 等类型的游戏;
  4. /// 2 标准音质,音质较好,延时适中,适用于狼人杀、棋牌等休闲游戏的实时通话场景;
  5. /// 3 高清音质,超高音质,延时相对大一些,适用于音乐舞蹈类游戏以及语音社交类 App;适用于播放音乐、线上 K 歌等有高音质要求的场景.
  6. /// @param authBuffer 加密权限标志
  7. void LTVoiceEnterAudioRoom(const char *roomId,int roomType,id authBuffer);
  8. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceEnterAudioRoom("1",1,authBuffer);

4.6 退出房间

通过调用此接口可以退出所在房间。会收到消息为 LTGame_VOICE_EVENT_TYPE_EXIT_ROOM 的回调。这是一个异步接口,返回值为 AV_OK 的时候代表异步投递成功。

注意:
如果应用中有退房后立即进房的场景,在接口调用流程上,无需要等待 ExitRoom 的回调 RoomExitComplete 通知,只需直接调用接口。

4.6.1 接口调用示例

  1. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceExitRoom();

4.7 修改用户房间音频类型

此接口用于修改用户房间音频类型,会收到消息为 LTGame_VOICE_EVENT_TYPE_CHANGE_ROOM_TYPE 的回调。

4.7.1接口调用示例

  1. /// @param roomType 房间音频类型 传入
  2. ///1 流畅音质,流畅优先、超低延迟实时语音,应用在游戏内开黑场景,适用于 FPS、MOBA 等类型的游戏;
  3. ///2 标准音质,音质较好,延时适中,适用于狼人杀、棋牌等休闲游戏的实时通话场景;
  4. ///3 高清音质,超高音质,延时相对大一些,适用于音乐舞蹈类游戏以及语音社交类 App;适用于播放音乐、线上 K 歌等有高音质要求的场景.
  5. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceChangeRoomType(2);

4.8获取房间音频类型

获取房间音频类型

4.8.1 接口调用示例

  1. /// @param roomType 房间音频类型 传入
  2. ///1 流畅音质,流畅优先、超低延迟实时语音,应用在游戏内开黑场景,适用于 FPS、MOBA 等类型的游戏;
  3. ///2 标准音质,音质较好,延时适中,适用于狼人杀、棋牌等休闲游戏的实时通话场景;
  4. ///3 高清音质,超高音质,延时相对大一些,适用于音乐舞蹈类游戏以及语音社交类 App;适用于播放音乐、线上 K 歌等有高音质要求的场景.
  5. int roomType = LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceGetRoomType();

4.9 开启关闭麦克风

此接口用来开启关闭麦克风。加入房间默认不打开麦克风及扬声器。

4.9.1 接口调用示例

  1. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceEnableMic(true);

4.10 麦克风状态获取

此接口用于获取麦克风状态,返回值0为关闭麦克风状态,返回值1 为打开麦克风状态。

4.10.1 接口调用示例

  1. int micState = LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceGetMicState();

4.11 开启关闭扬声器

此接口用于开启关闭扬声器。

4.11.1 接口调用示例

  1. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceEnableSpeaker(true);

4.12 扬声器状态获取

此接口用于扬声器状态获取。返回值0为关闭扬声器状态,返回值1 为打开扬声器状态,返回值2 为扬声器设备正在操作中。

4.12.1 接口调用示例

  1. int speakerState = LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceGetSpeakerState();

4.13 开启/关闭采集设备。

此接口用来开启/关闭采集设备。

4.13.1 接口调用示例

  1. /// 加入房间默认不打开设备。
  2. /// 只能在进房后调用此接口,退房会自动关闭设备。
  3. /// 在移动端,打开采集设备通常会伴随权限申请,音量类型调整等操作。
  4. /// @param enabled 是否打开
  5. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceEnableAudioCaptureDevice(true);

4.14 采集设备状态获取

采集设备状态获取

4.14.1 接口调用示例

  1. bool enabled = LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceIsAudioCaptureDeviceEnabled();

4.15 打开/关闭音频上行

此接口用于打开/关闭音频上行。

4.15.1 接口调用示例

  1. /// 如果采集设备已经打开,那么会发送采集到的音频数据。
  2. /// 如果采集设备没有打开,那么仍旧无声。
  3. /// 采集设备的打开关闭参见接口 EnableAudioCaptureDevice。
  4. /// @param enable 是否打开
  5. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceEnableAudioSend(true);

4.16 音频上行状态获取

音频上行状态获取

4.16.1 接口调用示例

  1. bool enabled = LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceIsAudioSendEnabled();

4.17 获取麦克风实时音量

此接口用于获取麦克风实时音量

4.17.1 接口调用示例

  1. /// 此接口用于获取麦克风实时音量,
  2. /// 返回值为 int 类型。
  3. /// 建议 20ms 获取一次。
  4. int level = LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceGetAudioMicLevel();

4.18 获取音频上行实时音量

获取音频上行实时音量

4.18.1 接口调用示例

  1. /// 此接口用于获取音频上行实时音量,返回值为 int 类型,取值范围为0到100。
  2. int level = LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceGetAudioSendStreamLevel();

4.19 设置麦克风的音量

此接口用于设置麦克风的音量。

4.19.1 接口调用示例

  1. /// 参数 volume 用于设置麦克风的音量,当数值为0的时候表示静音,当数值为100 的时候表示音量不增不减,默认数值为100。
  2. /// @param volume 设置音量,范围0到200
  3. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceSetAudioMicVolume(100);

4.20 获取麦克风的音量

此接口用于获取麦克风的音量。

4.20.1 接口调用示例

  1. /// 返回值为一个int类型数值,返回值为101代表没调用过接口 SetMicVolume。
  2. int level = LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceGetAudioMicVolume();

4.21 开启关闭播放设备

开启关闭播放设备

4.21.1 接口调用示例

  1. /// 参数 volume 用于设置麦克风的音量,当数值为0的时候表示静音,当数值为100 的时候表示音量不增不减,默认数值为100。
  2. /// @param volume 设置音量,范围0到200
  3. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceEnableAudioPlayDevice(true);

4.22 播放设备状态获取

播放设备状态获取

4.22.1 接口调用示例

  1. bool enabled = LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceIsAudioPlayDeviceEnabled();

4.23 打开关闭音频下行

此接口用于打开/关闭音频下行。

4.23.1 接口调用示例

  1. /// 如果播放设备已经打开,那么会播放房间里其他人的音频数据。
  2. /// 如果播放设备没有打开,那么仍旧无声。
  3. /// 播放设备的打开关闭参见接口 参见 EnableAudioPlayDevice。
  4. /// @param enabled 是否打开
  5. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceEnableAudioRecv(true);

4.24 音频下行状态获取

音频下行状态获取

4.24.1 接口调用示例

  1. bool enabled = LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceIsAudioRecvEnabled();

4.25 获取扬声器实时音量

获取扬声器实时音量

4.25.1 接口调用示例

  1. /// 此接口用于获取扬声器实时音量。
  2. /// 返回值为 int 类型数值,表示扬声器实时音量。
  3. /// 建议 20ms 获取一次。
  4. int level = LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceGetAudioSpeakerLevel();

4.26 获取房间内其他成员下行实时音量

此接口用于获取房间内其他成员下行实时音量,返回值为 int 类型,取值范围为0到100。

4.26.1 接口调用示例

  1. @param openID 房间其他成员的 用户ID
  2. int level = LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceGetAudioRecvStreamLevel("123456");

4.27 设置扬声器的音量

此接口用于设置扬声器的音量

4.27.1 接口调用示例

  1. /// @param vol 参数 vol用于设置扬声器的音量,当数值为0时,表示静音,当数值为100时,表示音量不增不减,默认数值为 100。范围 0 到 200
  2. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceSetAudioSpeakerVolume(100);

4.28 获取扬声器的音量

此接口用于获取扬声器的音量。

4.28.1 接口调用示例

  1. /// 返回值为 int 类型数值,代表扬声器的音量,返回值为101代表没调用过接口 SetSpeakerVolume。
  2. /// Level 是实时音量,Volume 是扬声器的音量,最终声音音量相当于 Level*Volume%。
  3. /// 举个例子:实时音量是数值是 100 的话,此时Volume的数值是 60,那么最终发出来的声音数值也是 60。
  4. int level = LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceGetAudioSpeakerVolume();

4.29 启动耳返

启动耳返

4.29.1 接口调用示例

  1. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceEnableLoopBack(true);

4.30 设置语音功能数据回调

设置语音功能数据回调,
通过此回调返回进入房间,用户列表更新,退出房间等消息

注意:
此接口和离线录音为统一接口,只是返回事件不同

4.30.1 接口参数说明

事件类型参数定义 在LTParam.h头文件内的LTGame_VOICE_EVENT_TYPE,

事件类型(type) 错误码(errCode) 数据信息 json格式(data) 说明
LTGame_VOICE_EVENT_TYPE_ENTER_ROOM 0成功,非0 失败 {“error_info”:””,”result”:0} 加入房间完成
LTGame_VOICE_EVENT_TYPE_EXIT_ROOM 0成功,非0 失败 {“error_info”:””,”result”:0} 退出房间完成
LTGame_VOICE_EVNET_TYPE_USER_UPDATE {“event_id “:”1”,”user_list “:{1234567};} 成员状态变化
LTGame_VOICE_EVENT_TYPE_CHANGE_ROOM_TYPE 0成功,非0 失败 {“error_info”:””,”new_room_type”:0,”sub_event_type”:0,”result”:0} 成员状态变化
LTGame_VOICE_EVENT_TYPE_SWITCH_ROOM 0成功,非0 失败 {“error_info” = “”;result = 0;} 快速切换房间完成

JSon 数据格式说明:

参数名 数据格式 说明
event_id 字符串 用户成员列表更新类型:1有成员进入房间,应用侧维护成员列表2.有成员退出房间,应用侧维护成员列表5.有成员发送音频包,应用侧维护通话成员列表6.有成员停止发送音频包,应用侧维护通话成员列表
error_info 字符串 错误信息
sub_event_type int 1表示在进房的过程中,自带的音频类型与房间不符合,被修改为所进入房间的音频类型2表示已经在房间内,音频类型开始切换(例如调用 ChangeRoomType 接口后切换音频类型 )3表示已经在房间,音频类型切换完成4表示房间成员调用 ChangeRoomType 接口,请求切换房间音频类型
result int 同错误码

4.30.2 接口调用示例

  1. /**
  2. * 设置语音业务回调
  3. * @param pfunc 数据回调类
  4. */
  5. LongTuBaseSdk::LTGameSDK::GetInstance().setVoiceEventLinstener(verificationLinstener);
  6. /**
  7. * 语言业务结果回调
  8. *
  9. * @param type 事件类型
  10. * @param errCode 错误码
  11. * @param data 数据信息 json格式
  12. *
  13. */
  14. void verificationLinstener(int type, int errCode,const char *data){
  15. cout<<"*********VerificationLinstener********"<<endl;
  16. Json::Reader json_reader;
  17. Json::Value json_object;
  18. if (!json_reader.parse(data, json_object)){
  19. return;
  20. }
  21. switch (type) {
  22. case LTGame_VOICE_EVENT_TYPE_ENTER_ROOM:
  23. {
  24. [mLTVoiceViewController showLog:[NSString stringWithFormat:@"进入房间%@",[NSString stringWithUTF8String:data]]];
  25. cout<<"进入房间"<<endl;
  26. cout<<data<<endl;
  27. [mLTVoiceViewController showLog:[NSString stringWithUTF8String:data]];
  28. if (errCode == 0) {
  29. [mLTVoiceViewController showAudioView];
  30. }
  31. else{
  32. // LTSDK::GetInstance().ShowMsg(data);
  33. [mLTVoiceViewController showMessage:[NSString stringWithUTF8String:data]];
  34. }
  35. }
  36. break;
  37. case LTGame_VOICE_EVENT_TYPE_EXIT_ROOM:
  38. {
  39. [mLTVoiceViewController showLog:[NSString stringWithFormat:@"退出房间%@",[NSString stringWithUTF8String:data]]];
  40. cout<<"退出房间"<<endl;
  41. cout<<data<<endl;
  42. // [mLTVoiceViewController showLog:[NSString stringWithUTF8String:data]];
  43. // LTSDK::GetInstance().ShowMsg(data);
  44. if (errCode == 0) {
  45. [mLTVoiceViewController showMessage:@"已退出房间"];
  46. }
  47. else{
  48. [mLTVoiceViewController showMessage:[NSString stringWithUTF8String:data]];
  49. }
  50. }
  51. break;
  52. case LTGame_VOICE_EVENT_TYPE_CHANGE_ROOM_TYPE:
  53. {
  54. [mLTVoiceViewController showLog:[NSString stringWithFormat:@"切换音频类型%@",[NSString stringWithUTF8String:data]]];
  55. cout<<"切换音频类型"<<endl;
  56. [mLTVoiceViewController showLog:[NSString stringWithUTF8String:data]];
  57. cout<<data<<endl;
  58. // LTSDK::GetInstance().ShowMsg(data);
  59. [mLTVoiceViewController showMessage:[NSString stringWithUTF8String:data]];
  60. }
  61. break;
  62. case LTGame_VOICE_EVNET_TYPE_USER_UPDATE:
  63. {
  64. [mLTVoiceViewController showLog:[NSString stringWithFormat:@"用户信息%@",[NSString stringWithUTF8String:data]]];
  65. cout<<"用户信息"<<endl;
  66. cout<<data<<endl;
  67. [mLTVoiceViewController showLog:[NSString stringWithUTF8String:data]];
  68. NSString *dicStr = [NSString stringWithUTF8String:data];
  69. [[NSUserDefaults standardUserDefaults] setObject:dicStr forKey:@"LT_LIST"];
  70. [[NSUserDefaults standardUserDefaults]synchronize];
  71. [mLTVoiceViewController updateUserlist];
  72. }
  73. break;
  74. case LTGame_VOICE_EVENT_TYPE_SWITCH_ROOM:
  75. {
  76. [mLTVoiceViewController showLog:[NSString stringWithFormat:@"快切房间%@",[NSString stringWithUTF8String:data]]];
  77. if (errCode == 0) {
  78. NSLog(@"切换成功:%@",[NSString stringWithUTF8String:data]);
  79. }else{
  80. NSLog(@"切换失败");
  81. }
  82. }
  83. break;
  84. default:
  85. break;
  86. }
  87. }

4.31 获取当前房间号

获取当前房间号

4.31.1 接口调用示例

  1. /**
  2. * 获取当前房间号
  3. * @return 当前正在进行中的房间号(退出过程中不算)。
  4. */
  5. const char* LTVoiceGetRoomID();
  6. LTGameSDK::GetInstance().LTVoiceGetRoomID();

4.32 快速切换房间

快速切换房间,语音回调增加切换房间回调(LTGame_VOICE_EVENT_TYPE_SWITCH_ROOM,详见文档4.30)。

4.32.1 快速切换房间

  1. /// 快速切换房间
  2. /// @param roomId 房间号,最大支持127字符。
  3. /// @param authBuffer 加密权限标志
  4. void LTVoiceSwitchRoom(const char *roomId,id authBuffer);
  5. LTGameSDK::GetInstance().LTVoiceSwitchRoom("房间号","authBuffer 加密权限标志");

4.32.2 快速切换房间默认加密方式

  1. /// 快速切换房间默认加密方式
  2. /// @param roomId 房间号,最大支持127字符。
  3. void LTVoiceSwitchRoom(const char *roomId);
  4. LTGameSDK::GetInstance().LTVoiceSwitchRoom("房间号");

4.33 跨房连麦

此接口在进房后调用。调用接口后,本端可以与目标房间的目标 OpenID 用户进行连麦交流。目标房间与本端房间类型相同才能成功。
场景示例:
a 用户在 A 房间中,b 用户在 B 房间中,a 用户可以通过跨房接口与 b 进行通话,A 房间中的用户 c 说话,B 房间的 b 与 d 无法听到;A 房间中的用户 c 只能听到 A 房间的声音以及 B 房间中 b 的声音,B 房间其他人说话 c 无法听到。

4.33.1 接口调用示例

  1. /// 跨房连麦
  2. /// @param targetRoomID 将要连麦的房间号
  3. /// @param targetOpenID 将要连麦的目标 OpenID(角色ID)
  4. int LTVoiceStartRoomSharing(const char *targetRoomID, const char *targetOpenID);
  5. LTGameSDK::GetInstance().LTVoiceStartRoomSharing("房间号", "角色ID");

4.34 停止连麦

停止连麦

4.34.1 接口调用示例

  1. /// 停止连麦
  2. int LTVoiceStopRoomSharing();
  3. LTGameSDK::GetInstance().LTVoiceStopRoomSharing();

4 实时语音接口使用(OC)

功能说明
语音

4.1 获取openID接口

直接使用当前用户的角色ID即可,语音功能是按照角色收费的.
注意:以下接口中的openID均传入角色ID.

4.2 系统暂停接口

当系统发生 Pause 事件时,需要同时通知引擎进行 Pause。

4.2.1 接口调用示例

  1. [[LTGameOCSDK shareInstance] LTSDKVoicePause];

4.3 系统恢复接口

当系统发生 Resume 事件时,需要同时通知引擎进行 Resume。Resume 接口只恢复实时语音。

4.3.1 接口调用示例

  1. [[LTGameOCSDK shareInstance] LTSDKVoiceResume];

4.4 是否已经进入房间接口

通过调用此接口可以判断是否已经进入房间,返回值为 bool 类型。

4.4.1 接口调用示例

  1. BOOL isEntered = [[LTGameOCSDK shareInstance] LTSDKVoiceIsRoomEntered];

4.5 进入房间

会收到消息为 LTGame_VOICE_EVENT_TYPE_ENTER_ROOM 的回调。加入房间默认不打开麦克风及扬声器。

4.5.1 接口调用示例

  1. /// @param roomId 房间号,最大支持127字符。
  2. /// @param roomType 房间音频类型 传入
  3. ///1 流畅音质,流畅优先、超低延迟实时语音,应用在游戏内开黑场景,适用于 FPS、MOBA 等类型的游戏;
  4. ///2 标准音质,音质较好,延时适中,适用于狼人杀、棋牌等休闲游戏的实时通话场景;
  5. ///3 高清音质,超高音质,延时相对大一些,适用于音乐舞蹈类游戏以及语音社交类 App;适用于播放音乐、线上 K 歌等有高音质要求的场景.
  6. [[LTGameOCSDK shareInstance] LTSDKVoiceEnterAudioRoom:@"1" roomType:1];

4.5.2 接口调用示例

  1. /// 进入房间
  2. /// @param roomId 房间号,最大支持127字符。
  3. /// @param roomType 房间音频类型 传入 1 流畅音质,流畅优先、超低延迟实时语音,应用在游戏内开黑场景,适用于 FPS、MOBA 等类型的游戏;
  4. /// 2 标准音质,音质较好,延时适中,适用于狼人杀、棋牌等休闲游戏的实时通话场景;
  5. /// 3 高清音质,超高音质,延时相对大一些,适用于音乐舞蹈类游戏以及语音社交类 App;适用于播放音乐、线上 K 歌等有高音质要求的场景.
  6. /// @param authBuffer 加密权限标志
  7. - (void)LTSDKVoiceEnterAudioRoom:(NSString *)roomId roomType:(int)roomType authBuffer:(NSData *)authBuffer;
  8. [[LTGameOCSDK shareInstance] LTSDKVoiceEnterAudioRoom:@"1" roomType:1 authBuffer:加密权限标志];

4.6 退出房间

通过调用此接口可以退出所在房间。会收到消息为 LTGame_VOICE_EVENT_TYPE_EXIT_ROOM 的回调。这是一个异步接口,返回值为 AV_OK 的时候代表异步投递成功。

注意:
如果应用中有退房后立即进房的场景,在接口调用流程上,无需要等待 ExitRoom 的回调 RoomExitComplete 通知,只需直接调用接口。

4.6.1 接口调用示例

  1. [[LTGameOCSDK shareInstance] LTSDKVoiceExitRoom];

4.7 修改用户房间音频类型

此接口用于修改用户房间音频类型,会收到消息为 LTGame_VOICE_EVENT_TYPE_CHANGE_ROOM_TYPE 的回调。

4.7.1接口调用示例

  1. /// @param roomType 房间音频类型 传入
  2. ///1 流畅音质,流畅优先、超低延迟实时语音,应用在游戏内开黑场景,适用于 FPS、MOBA 等类型的游戏;
  3. ///2 标准音质,音质较好,延时适中,适用于狼人杀、棋牌等休闲游戏的实时通话场景;
  4. ///3 高清音质,超高音质,延时相对大一些,适用于音乐舞蹈类游戏以及语音社交类 App;适用于播放音乐、线上 K 歌等有高音质要求的场景.
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceChangeRoomType:2];

4.8获取房间音频类型

获取房间音频类型

4.8.1 接口调用示例

  1. /// @param roomType 房间音频类型 传入
  2. ///1 流畅音质,流畅优先、超低延迟实时语音,应用在游戏内开黑场景,适用于 FPS、MOBA 等类型的游戏;
  3. ///2 标准音质,音质较好,延时适中,适用于狼人杀、棋牌等休闲游戏的实时通话场景;
  4. ///3 高清音质,超高音质,延时相对大一些,适用于音乐舞蹈类游戏以及语音社交类 App;适用于播放音乐、线上 K 歌等有高音质要求的场景.
  5. int roomType = [[LTGameOCSDK shareInstance] LTSDKVoiceGetRoomType];

4.9 开启关闭麦克风

此接口用来开启关闭麦克风。加入房间默认不打开麦克风及扬声器。

4.9.1 接口调用示例

  1. [[LTGameOCSDK shareInstance] LTSDKVoiceEnableMic:true];

4.10 麦克风状态获取

此接口用于获取麦克风状态,返回值0为关闭麦克风状态,返回值1 为打开麦克风状态。

4.10.1 接口调用示例

  1. int micState = [[LTGameOCSDK shareInstance] LTSDKVoiceGetMicState];

4.11 开启关闭扬声器

此接口用于开启关闭扬声器。

4.11.1 接口调用示例

  1. [[LTGameOCSDK shareInstance] LTSDKVoiceEnableSpeaker:true];

4.12 扬声器状态获取

此接口用于扬声器状态获取。返回值0为关闭扬声器状态,返回值1 为打开扬声器状态,返回值2 为扬声器设备正在操作中。

4.12.1 接口调用示例

  1. int speakerState = [[LTGameOCSDK shareInstance] LTSDKVoiceGetSpeakerState];

4.13 开启/关闭采集设备。

此接口用来开启/关闭采集设备。

4.13.1 接口调用示例

  1. /// 加入房间默认不打开设备。
  2. /// 只能在进房后调用此接口,退房会自动关闭设备。
  3. /// 在移动端,打开采集设备通常会伴随权限申请,音量类型调整等操作。
  4. /// @param enabled 是否打开
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceEnableAudioCaptureDevice:true];

4.14 采集设备状态获取

采集设备状态获取

4.14.1 接口调用示例

  1. BOOL enabled = [[LTGameOCSDK shareInstance] LTSDKVoiceIsAudioCaptureDeviceEnabled];

4.15 打开/关闭音频上行

此接口用于打开/关闭音频上行。

4.15.1 接口调用示例

  1. /// 如果采集设备已经打开,那么会发送采集到的音频数据。
  2. /// 如果采集设备没有打开,那么仍旧无声。
  3. /// 采集设备的打开关闭参见接口 EnableAudioCaptureDevice。
  4. /// @param enable 是否打开
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceEnableAudioSend:true];

4.16 音频上行状态获取

音频上行状态获取

4.16.1 接口调用示例

  1. BOOL enabled = [[LTGameOCSDK shareInstance] LTSDKVoiceIsAudioSendEnabled];

4.17 获取麦克风实时音量

此接口用于获取麦克风实时音量

4.17.1 接口调用示例

  1. /// 此接口用于获取麦克风实时音量,
  2. /// 返回值为 int 类型。
  3. /// 建议 20ms 获取一次。
  4. int level = [[LTGameOCSDK shareInstance] LTSDKVoiceGetAudioMicLevel];

4.18 获取音频上行实时音量

获取音频上行实时音量

4.18.1 接口调用示例

  1. /// 此接口用于获取音频上行实时音量,返回值为 int 类型,取值范围为0到100。
  2. int level = [[LTGameOCSDK shareInstance] LTSDKVoiceGetAudioSendStreamLevel];

4.19 设置麦克风的音量

此接口用于设置麦克风的音量。

4.19.1 接口调用示例

  1. /// 参数 volume 用于设置麦克风的音量,当数值为0的时候表示静音,当数值为100 的时候表示音量不增不减,默认数值为100。
  2. /// @param volume 设置音量,范围0到200
  3. [[LTGameOCSDK shareInstance] LTSDKVoiceSetAudioMicVolume:100];

4.20 获取麦克风的音量

此接口用于获取麦克风的音量。

4.20.1 接口调用示例

  1. /// 返回值为一个int类型数值,返回值为101代表没调用过接口 SetMicVolume。
  2. int level = [[LTGameOCSDK shareInstance] LTSDKVoiceGetAudioMicVolume];

4.21 开启关闭播放设备

开启关闭播放设备

4.21.1 接口调用示例

  1. [[LTGameOCSDK shareInstance] LTSDKVoiceEnableAudioPlayDevice:true];

4.22 播放设备状态获取

播放设备状态获取

4.22.1 接口调用示例

  1. bool enabled = [[LTGameOCSDK shareInstance] LTSDKVoiceIsAudioPlayDeviceEnabled];

4.23 打开关闭音频下行

此接口用于打开/关闭音频下行。

4.23.1 接口调用示例

  1. /// 如果播放设备已经打开,那么会播放房间里其他人的音频数据。
  2. /// 如果播放设备没有打开,那么仍旧无声。
  3. /// 播放设备的打开关闭参见接口 参见 EnableAudioPlayDevice。
  4. /// @param enabled 是否打开
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceEnableAudioRecv:true];

4.24 音频下行状态获取

音频下行状态获取

4.24.1 接口调用示例

  1. bool enabled = [[LTGameOCSDK shareInstance] LTSDKVoiceIsAudioRecvEnabled];

4.25 获取扬声器实时音量

获取扬声器实时音量

4.25.1 接口调用示例

  1. /// 此接口用于获取扬声器实时音量。
  2. /// 返回值为 int 类型数值,表示扬声器实时音量。
  3. /// 建议 20ms 获取一次。
  4. int level = [[LTGameOCSDK shareInstance] LTSDKVoiceGetAudioSpeakerLevel];

4.26 获取房间内其他成员下行实时音量

此接口用于获取房间内其他成员下行实时音量,返回值为 int 类型,取值范围为0到100。

4.26.1 接口调用示例

  1. @param openID 房间其他成员的 用户ID
  2. int level = [[LTGameOCSDK shareInstance] LTSDKVoiceGetAudioRecvStreamLevel:@"123456"];

4.27 设置扬声器的音量

此接口用于设置扬声器的音量

4.27.1 接口调用示例

  1. /// @param vol 参数 vol用于设置扬声器的音量,当数值为0时,表示静音,当数值为100时,表示音量不增不减,默认数值为 100。范围 0 到 200
  2. [[LTGameOCSDK shareInstance] LTSDKVoiceSetAudioSpeakerVolume:100];

4.28 获取扬声器的音量

此接口用于获取扬声器的音量。

4.28.1 接口调用示例

  1. /// 返回值为 int 类型数值,代表扬声器的音量,返回值为101代表没调用过接口 SetSpeakerVolume。
  2. /// Level 是实时音量,Volume 是扬声器的音量,最终声音音量相当于 Level*Volume%。
  3. /// 举个例子:实时音量是数值是 100 的话,此时Volume的数值是 60,那么最终发出来的声音数值也是 60。
  4. int level = [[LTGameOCSDK shareInstance] LTSDKVoiceGetAudioSpeakerVolume];

4.29 启动耳返

启动耳返

4.29.1 接口调用示例

  1. [[LTGameOCSDK shareInstance] LTSDKVoiceEnableLoopBack:true];

4.30 设置语音功能数据回调

设置语音功能数据回调,
通过此回调返回进入房间,用户列表更新,退出房间等消息

注意:
此接口和离线录音为统一接口,只是返回事件不同

4.30.1 接口参数说明

事件类型参数定义 在LTParam.h头文件内的LTGame_VOICE_EVENT_TYPE,

事件类型(type) 错误码(errCode) 数据信息 json格式(data) 说明
LTOCGame_VOICE_EVENT_TYPE_ENTER_ROOM 0成功,非0 失败 {“error_info”:””,”result”:0} 加入房间完成
LTOCGame_VOICE_EVENT_TYPE_EXIT_ROOM 0成功,非0 失败 {“error_info”:””,”result”:0} 退出房间完成
LTOCGame_VOICE_EVNET_TYPE_USER_UPDATE {“event_id “:”1”,”user_list “:{1234567};} 成员状态变化
LTOCGame_VOICE_EVENT_TYPE_CHANGE_ROOM_TYPE 0成功,非0 失败 {“error_info”:””,”new_room_type”:0,”sub_event_type”:0,”result”:0} 成员状态变化
LTOCGame_VOICE_EVENT_TYPE_SWITCH_ROOM 0成功,非0 失败 {“error_info” = “”;result = 0;} 快速切换房间完成

JSon 数据格式说明:

参数名 数据格式 说明
event_id 字符串 用户成员列表更新类型:1有成员进入房间,应用侧维护成员列表2.有成员退出房间,应用侧维护成员列表5.有成员发送音频包,应用侧维护通话成员列表6.有成员停止发送音频包,应用侧维护通话成员列表
error_info 字符串 错误信息
sub_event_type int 1表示在进房的过程中,自带的音频类型与房间不符合,被修改为所进入房间的音频类型2表示已经在房间内,音频类型开始切换(例如调用 ChangeRoomType 接口后切换音频类型 )3表示已经在房间,音频类型切换完成4表示房间成员调用 ChangeRoomType 接口,请求切换房间音频类型
result int 同错误码

4.30.2 接口调用示例

  1. /**
  2. * 设置语音业务代理调
  3. */
  4. //设置代理
  5. [LTGameOCSDK shareInstance].delegate = self;
  6. // 设置语音相关的数据回调
  7. [[LTGameOCSDK shareInstance] LTSDKSetVoiceEventLinstener];
  8. /// 语音功能回调
  9. /// @param type 类型
  10. /// @param errCode 错误码
  11. /// @param dict 返回内容
  12. - (void)ltVerificationLinstenerWithType:(int)type errCode:(int)errCode dict:(NSDictionary *)dict{
  13. switch (type) {
  14. case LTGame_VOICE_EVENT_TYPE_ENTER_ROOM:
  15. {
  16. [self showLog:[NSString stringWithFormat:@"进入房间%@",dict]];
  17. NSLog(@"进入房间 = %@",dict);
  18. if (errCode == 0) {
  19. [self showAudioView];
  20. }
  21. else{
  22. [self showMessage:[NSString stringWithFormat:@"%@",dict]];
  23. }
  24. }
  25. break;
  26. case LTGame_VOICE_EVENT_TYPE_EXIT_ROOM:
  27. {
  28. [self showLog:[NSString stringWithFormat:@"退出房间%@",dict]];
  29. NSLog(@"退出房间= %@",dict);
  30. // [mLTVoiceViewController showLog:[NSString stringWithUTF8String:data]];
  31. // LTSDK::GetInstance().ShowMsg(data);
  32. if ([[dict objectForKey:@"result"] intValue] == 0) {
  33. [self showMessage:@"退出房间成功"];
  34. }
  35. else{
  36. [self showMessage:[NSString stringWithFormat:@"%@",dict]];
  37. }
  38. }
  39. break;
  40. case LTGame_VOICE_EVENT_TYPE_CHANGE_ROOM_TYPE:
  41. {
  42. [self showLog:[NSString stringWithFormat:@"切换音频类型%@",dict]];
  43. NSLog(@"切换音频类型 = %@",dict);
  44. // [self showMessage:[NSString stringWithUTF8String:data]];
  45. }
  46. break;
  47. case LTGame_VOICE_EVNET_TYPE_USER_UPDATE:
  48. {
  49. [self showLog:[NSString stringWithFormat:@"用户信息%@",dict]];
  50. NSLog(@"用户信息 = %@",dict);
  51. // NSString *dicStr = [NSString stringWithFormat:@"%@",dict];
  52. [[NSUserDefaults standardUserDefaults] setObject:dict forKey:@"LT_LIST"];
  53. [[NSUserDefaults standardUserDefaults]synchronize];
  54. [self updateUserlist];
  55. }
  56. break;
  57. case LTOCGame_VOICE_EVENT_TYPE_SWITCH_ROOM:
  58. {
  59. [self showLog:[NSString stringWithFormat:@"切换房间%@",dict]];
  60. if (errCode == 0) {
  61. NSLog(@"切换成功:%@",dict);
  62. }else{
  63. NSLog(@"切换失败");
  64. }
  65. }
  66. break;
  67. default:
  68. break;
  69. }
  70. }

4.31 获取当前房间号

获取当前房间号

4.31.1 接口调用示例

  1. /**
  2. * 获取当前房间号
  3. * @return 当前正在进行中的房间号(退出过程中不算)。
  4. */
  5. - (NSString *)LTSDKVoiceGetRoomID;
  6. [[LTGameOCSDK shareInstance] LTSDKVoiceGetRoomID];

4.32 快速切换房间

快速切换房间,语音回调增加切换房间回调(LTGame_VOICE_EVENT_TYPE_SWITCH_ROOM,详见文档4.30)。

4.32.1 快速切换房间

  1. /// 快速切换房间
  2. /// @param roomId 房间号,最大支持127字符。
  3. /// @param authBuffer 加密权限标志
  4. - (void)LTSDKVoiceSwitchRoom:(NSString *_Nonnull)roomId authBuffer:(NSData *)authBuffer;
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceSwitchRoom:@"房间号" authBuffer:authBuffer 加密权限标志];

4.32.2 快速切换房间默认加密方式

  1. /// 快速切换房间默认加密方式
  2. /// @param roomId 房间号,最大支持127字符。
  3. - (void)LTSDKVoiceSwitchRoom:(NSString *)roomId;
  4. [[LTGameOCSDK shareInstance] LTSDKVoiceSwitchRoom:@"房间号"];

4.33 跨房连麦

此接口在进房后调用。调用接口后,本端可以与目标房间的目标 OpenID 用户进行连麦交流。目标房间与本端房间类型相同才能成功。
场景示例:
a 用户在 A 房间中,b 用户在 B 房间中,a 用户可以通过跨房接口与 b 进行通话,A 房间中的用户 c 说话,B 房间的 b 与 d 无法听到;A 房间中的用户 c 只能听到 A 房间的声音以及 B 房间中 b 的声音,B 房间其他人说话 c 无法听到。

4.33.1 接口调用示例

  1. /// 跨房连麦
  2. /// @param targetRoomID 将要连麦的房间号
  3. /// @param targetOpenID 将要连麦的目标 OpenID
  4. - (int)LTSDKVoiceStartRoomSharing:(NSString *_Nonnull)targetRoomID targetOpenID:(NSString *_Nonnull)targetOpenID;
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceStartRoomSharing:@"房间号" targetOpenID:@"角色ID"];

4.34 停止连麦

停止连麦

4.34.1 接口调用示例

  1. /// 停止连麦
  2. -(int)LTSDKVoiceStopRoomSharing;
  3. [[LTGameOCSDK shareInstance] LTSDKVoiceStopRoomSharing];

5 范围语音/3D语音/语音路由 接口使用(C++)

使用流程:
有别于普通小队语音房间,在使用范围语音能力时,必须使用流畅音质进房,且在调用 EnterRoom 之前,需调用以下两个 API:LTVoiceSetRangeAudioTeamID、 LTVoiceSetRangeAudioMode。在进房成功后,调用 LTVoiceUpdateAudioRecvRange,及每帧调用 LTVoiceUpdateSelfPosition。
使用范围语音的同时,如果需要同时使用3D音效功能,需要以下几个步骤。

  1. 初始化 3D 音效引擎
    此函数用于初始化 3D 音效引擎,在进房后调用。在使用 3D 音效之前必须先调用此接口,只接收 3D 音效而不发出 3D 音效的用户也需要调用此接口。
  2. 开启或关闭 3D 音效
    此函数用于开启或关闭 3D 音效。开启之后可以听到 3D 音效。
  3. 设置接收语音距离范围(3D)
    通过此方法用于设置接收的语音范围(距离以游戏引擎为准),只支持在进房成功后调用。
    此方法必须配合 UpdateSelfPosition 更新声源方位联合使用。
    此方法只需调用一次即可生效。
    3D 音效中,音源音量的大小与音源距离有一定的衰减关系。单位距离超过 range 之后,音量衰减到几乎为零。
    距离与声音衰减的关系参考文档附录。
    4.更新声源方位,目的是告诉服务器本端位置,通过本端世界坐标+本端接收音频的范围,与其他端世界坐标+其他端接收音频的范围进行判断,达到范围语音效果。
    详细技术细节及讲解可参考文章 (https://cloud.tencent.com/developer/article/1008016)。
    此函数用于更新声源位置信息,只支持在进房成功后调用,且需要每帧调用,以 Unity 引擎为例,此接口需要在 Update 中调用。

5.1 设置小队号

说明:设置当前小队号
通过此方法设置队伍号,必须在 EnterRoom 之前调用,否则将直接返回错误码:AV_ERR_ROOM_NOT_EXITED(1202)。如果是退房后再进房,请在退房成功回调回来之后再调用设置队伍号接口。

注意:
在退房时,此参数不会自动重置为0,所以一旦决定调用此语音模式,请在每次 EnterRoom 之前都调用此方法设置 TeamID。

  1. /// 设置小队号
  2. /// @param teamID 队伍号,专供范围语音中进行上下行音频流控制。当 TeamID 为0时,通话模式为普通小队语音,默认0。
  3. void LTVoiceSetRangeAudioTeamID(int teamID);

调用方式

  1. LTGameSDK::GetInstance().LTVoiceSetRangeAudioTeamID(小队号);

5.2 设置语音模式

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

  1. /// 设置语音模式
  2. /// @param mode 语音模式(0:所有人;1:仅小队)
  3. void LTVoiceSetRangeAudioMode(int mode);

调用方式

  1. LTGameSDK::GetInstance().LTVoiceSetRangeAudioMode(0);

5.3 最大可以接收音频的范围

说明:最大可以接收音频的范围
通过此方法用于设置接收的语音范围(距离以游戏引擎为准),只支持在进房成功后调用。
此方法必须配合 LTVoiceUpdateSelfPosition 更新声源方位联合使用。
此方法只需调用一次即可生效。

  1. /// 更新声源方位
  2. /// @param recvRange 最大可以接收音频的范围,单位为引擎距离单位
  3. int LTVoiceUpdateAudioRecvRange(int recvRange);

调用方式

  1. LTGameSDK::GetInstance().LTVoiceUpdateAudioRecvRange(距离);

5.4 获取质量信息

说明:获取质量信息

  1. /**
  2. * 获取质量信息
  3. *
  4. * @return 质量信息tips
  5. */
  6. const char* LTVoiceGetQualityTips();

调用方式

  1. const char* quality = LTGameSDK::GetInstance().LTVoiceGetQualityTips();

5.5 更新声源方位

说明:更新声源方位
更新声源方位,目的是告诉服务器本端位置,通过本端世界坐标+本端接收音频的范围,与其他端世界坐标+其他端接收音频的范围进行判断,达到范围语音效果。

此函数用于更新声源位置信息,只支持在进房成功后调用,且需要每帧调用,以 Unity 引擎为例,此接口需要在 Update 中调用。
使用范围语音一定要更新声源方位,如果不需要范围判断能力,也需要进房后调用此接口一次。
如果需要同时使用 3D 音效效果,此接口中的参数 axisForward、axisRight 及 axisUp 需要按照 3D 语音部分 进行设置。
更新声源方位,目的是告诉服务器本端位置,通过本端世界坐标+本端接收音频的范围,与其他端世界坐标+其他端接收音频的范围进行判断,达到范围语音效果。
详细技术细节及讲解可参考文章 (https://cloud.tencent.com/developer/article/1008016)。
此函数用于更新声源位置信息,只支持在进房成功后调用,且需要每帧调用,以 Unity 引擎为例,此接口需要在 Update 中调用。

  1. /// 更新声源方位
  2. /// @param position int数组,自身在世界坐标系中的坐标,顺序是前、右、上
  3. /// @param axisForward float数组 自身坐标系前轴的单位向量
  4. /// @param axisRightward float数组 自身坐标系右轴的单位向量
  5. /// @param axisUpward float数组 自身坐标系上轴的单位向量
  6. int LTVoiceUpdateSelfPosition(int position[3], float axisForward[3], float axisRightward[3], float axisUpward[3]);

调用方式

  1. //示例
  2. int posArr[3] = {0,0,0};
  3. float axfArr[3] = {1.0,0.0,0.0};
  4. float axrArr[3] = {0.0,1.0,0.0};
  5. float axuArr[3] = {0.0,0.0,1.0};
  6. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceUpdateSelfPosition(posArr, axfArr, axrArr, axuArr);

5.6 初始化 3D 音效

说明:初始化 3D 音效
此函数用于初始化 3D 音效引擎,在进房后调用。在使用 3D 音效之前必须先调用此接口,只接收 3D 音效而不发出 3D 音效的用户也需要调用此接口。

  1. /// 初始化 3D 音效
  2. /// @param modelPath 3D 音效资源文件路径.3D 音效资源存放于本地中,并通过该参数将存放路径传递给 SDK。必须使用官方提供的文件。
  3. int LTVoiceInitSpatializer(const char* modelPath);

调用方式

  1. NSString *filePath = [[NSBundle mainBundle] pathForResource:@"GME_2.8_3d_model" ofType:@"dat"];
  2. int init = LTGameSDK::GetInstance().LTVoiceInitSpatializer([filePath UTF8String]);

5.7 开启或关闭 3D 音效

说明:开启或关闭 3D 音效

  1. /// 开启或关闭 3D 音效
  2. /// @param bEnable 开启之后可以听到 3D 音效
  3. /// @param applyTeam 3D语音是否作用于小队内部,仅 enble 为 true 时有效
  4. int LTVoiceEnableSpatializer(bool bEnable, bool applyTeam);

调用方式

  1. int init = LTGameSDK::GetInstance().LTVoiceEnableSpatializer(true, true);

5.8 获取当前 3D 音效状态

说明:获取当前 3D 音效状态

  1. /**
  2. * 获取当前 3D 音效状态
  3. *
  4. * @return 当前状态,true开启状态/false关闭状态
  5. */
  6. bool LTVoiceIsEnableSpatializer();

调用方式

  1. bool isEnable = LTGameSDK::GetInstance().LTVoiceIsEnableSpatializer();

5.9 设置音频转发规则

说明:设置音频转发规则
事件类型参数定义 在LTParam.h头文件内的LTGame_VOICE_AUDIO_ROUTE_SEND_TYPE,

事件类型(type) 说明
LTGame_VOICE_AUDIO_ROUTE_SEND_INQUIRE_ERROR = 0 获取出错,检查是否进入房间,是否已经初始化 SDK
LTGame_VOICE_AUDIO_ROUTE_NOT_SEND_TO_ANYONE = 1 本端音频上行发送到后台,但后台不转发给任何人,相当于将自己静音,此时参数 OpenIDForSend 无效,只需填 null
LTGame_VOICE_AUDIO_ROUTE_SEND_TO_ALL = LTGame_VOICE_AUDIO_ROUTE_NOT_SEND_TO_ANYONE + 1 本端音频上行将转发给所有人,此时参数 OpenIDForSend 无效,只需填 null
LTGame_VOICE_AUDIO_ROUTE_SEND_BLACK_LIST = LTGame_VOICE_AUDIO_ROUTE_SEND_TO_ALL + 1 本端音频上行将不转发给黑名单的人,黑名单由参数 OpenIDForSend 提供,最多支持 10 个
LTGame_VOICE_AUDIO_ROUTE_SEND_WHITE_LIST = LTGame_VOICE_AUDIO_ROUTE_SEND_BLACK_LIST + 1, 本端音频上行将只转发给白名单的人,白名单由参数 OpenIDForSend 提供,最多支持 10 个

事件类型参数定义 在LTParam.h头文件内的LTGame_VOICE_AUDIO_ROUTE_RECV_TYPE,

事件类型(type) 说明
LTGame_VOICE_AUDIO_ROUTE_RECV_INQUIRE_ERROR = 0 获获取出错,检查是否进入房间,是否已经初始化 SDK
LTGame_VOICE_AUDIO_ROUTE_NOT_RECV_FROM_ANYONE = 1 本端不接受任何音频,相当于关闭房间内扬声器效果,此时参数 OpenIDForSend 无效,只需填 null
LTGame_VOICE_AUDIO_ROUTE_RECV_FROM_ALL = LTGame_VOICE_AUDIO_ROUTE_NOT_RECV_FROM_ANYONE + 1 本端接收所有人的音频,此时参数 OpenIDForSend 无效,只需填 null
LTGame_VOICE_AUDIO_ROUTE_RECV_BLACK_LIST = LTGame_VOICE_AUDIO_ROUTE_RECV_FROM_ALL + 1 本端不接收黑名单的人的音频声音,黑名单由参数 OpenIDForSend 提供,最多支持 10 个
LTGame_VOICE_AUDIO_ROUTE_RECV_WHITE_LIST = LTGame_VOICE_AUDIO_ROUTE_RECV_BLACK_LIST + 1 本端只接收白名单的人的音频声音,白名单由参数 OpenIDForSend 提供,最多支持 10 个
  1. /// 设置音频转发规则
  2. /// @param Sendtype 发送音频规则
  3. /// @param OpenIDForSend 发送音频黑/白名单列表,根据发送类型生效,最多支持10个
  4. /// @param Recvtype 接收音频规则,接口中请勿使用 LTGame_VOICE_AUDIO_ROUTE_RECV_INQUIRE_ERROR
  5. /// @param OpenIDForRecv 接收音频黑/白名单列表,根据接收类型生效,最多支持10个
  6. int LTVoiceSetServerAudioRouteSendOperateType(int Sendtype, id OpenIDForSend, int Recvtype, id OpenIDForRecv);

调用方式

  1. NSArray *sendArr = [[NSArray alloc] initWithObjects:@"11111",@"22222", nil];
  2. NSArray *recvArr = [[NSArray alloc] initWithObjects:@"33333",@"44444", nil];
  3. int setAudio = LTGameSDK::GetInstance().LTVoiceSetServerAudioRouteSendOperateType(1, sendArr, 1, recvArr);

5.10 获取音频设置转发接收规则

说明:获取音频设置转发接收规则

  1. /// 获取音频设置转发接收规则
  2. /// @param OpenIDForRecv 调用后接口返回规则,传入的数组参数会返回相应规则的 openId
  3. int LTVoiceGetCurrentRecvAudioRoute(id OpenIDForRecv);

调用方式

  1. int setAudio = LTGameSDK::GetInstance().LTVoiceGetCurrentRecvAudioRoute(recvOpenid)

5.11 获取音频设置转发发送规则

说明:获取音频设置转发发送规则

  1. /// 获取音频设置转发发送规则
  2. /// @param OpenIDForSend 调用后接口返回规则,传入的数组参数会返回相应规则的 openId
  3. int LTVoiceGetCurrentSendAudioRoute(id OpenIDForSend);

调用方式

  1. int setAudio = LTGameSDK::GetInstance().LTVoiceGetCurrentSendAudioRoute(sendOpenid)

5 范围语音/3D语音/语音路由 接口使用(OC)

使用流程:
有别于普通小队语音房间,在使用范围语音能力时,必须使用流畅音质进房,且在调用 EnterRoom 之前,需调用以下两个 API:LTVoiceSetRangeAudioTeamID、 LTVoiceSetRangeAudioMode。在进房成功后,调用 LTVoiceUpdateAudioRecvRange,及每帧调用 LTVoiceUpdateSelfPosition。
使用范围语音的同时,如果需要同时使用3D音效功能,需要以下几个步骤。

  1. 初始化 3D 音效引擎
    此函数用于初始化 3D 音效引擎,在进房后调用。在使用 3D 音效之前必须先调用此接口,只接收 3D 音效而不发出 3D 音效的用户也需要调用此接口。
  2. 开启或关闭 3D 音效
    此函数用于开启或关闭 3D 音效。开启之后可以听到 3D 音效。
  3. 设置接收语音距离范围(3D)
    通过此方法用于设置接收的语音范围(距离以游戏引擎为准),只支持在进房成功后调用。
    此方法必须配合 UpdateSelfPosition 更新声源方位联合使用。
    此方法只需调用一次即可生效。
    3D 音效中,音源音量的大小与音源距离有一定的衰减关系。单位距离超过 range 之后,音量衰减到几乎为零。
    距离与声音衰减的关系参考文档附录。
    4.更新声源方位,目的是告诉服务器本端位置,通过本端世界坐标+本端接收音频的范围,与其他端世界坐标+其他端接收音频的范围进行判断,达到范围语音效果。
    详细技术细节及讲解可参考文章 (https://cloud.tencent.com/developer/article/1008016)。
    此函数用于更新声源位置信息,只支持在进房成功后调用,且需要每帧调用,以 Unity 引擎为例,此接口需要在 Update 中调用。

5.1 设置小队号

说明:设置当前小队号
通过此方法设置队伍号,必须在 EnterRoom 之前调用,否则将直接返回错误码:AV_ERR_ROOM_NOT_EXITED(1202)。如果是退房后再进房,请在退房成功回调回来之后再调用设置队伍号接口。

注意:
在退房时,此参数不会自动重置为0,所以一旦决定调用此语音模式,请在每次 EnterRoom 之前都调用此方法设置 TeamID。

  1. /// 设置小队号
  2. /// @param teamID 队伍号,专供范围语音中进行上下行音频流控制。当 TeamID 为0时,通话模式为普通小队语音,默认0。
  3. - (void)LTSDKVoiceSetRangeAudioTeamID:(int)teamID;

调用方式

  1. [[LTGameOCSDK shareInstance] LTSDKVoiceSetRangeAudioTeamID:小队号];

5.2 设置语音模式

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

  1. /// 设置语音模式
  2. /// @param mode 语音模式(0:所有人;1:仅小队)
  3. - (void)LTSDKVoiceSetRangeAudioMode:(int)mode;

调用方式

  1. [[LTGameOCSDK shareInstance] LTSDKVoiceSetRangeAudioMode:0];

5.3 最大可以接收音频的范围

说明:最大可以接收音频的范围
通过此方法用于设置接收的语音范围(距离以游戏引擎为准),只支持在进房成功后调用。
此方法必须配合 LTVoiceUpdateSelfPosition 更新声源方位联合使用。
此方法只需调用一次即可生效。

  1. /// 最大可以接收音频的范围
  2. /// @param recvRange 最大可以接收音频的范围,单位为引擎距离单位
  3. - (int)LTSDKVoiceUpdateAudioRecvRange:(int)recvRange;

调用方式

  1. int range = [[LTGameOCSDK shareInstance] LTSDKVoiceUpdateAudioRecvRange:0];

5.4 获取质量信息

说明:获取质量信息

  1. /**
  2. * 获取质量信息
  3. *
  4. * @return 质量信息tips
  5. */
  6. -(NSString*)LTSDKVoiceGetQualityTips;

调用方式

  1. NSString *quality = [[LTGameOCSDK shareInstance] LTSDKVoiceGetQualityTips];

5.5 更新声源方位

说明:更新声源方位
更新声源方位,目的是告诉服务器本端位置,通过本端世界坐标+本端接收音频的范围,与其他端世界坐标+其他端接收音频的范围进行判断,达到范围语音效果。

此函数用于更新声源位置信息,只支持在进房成功后调用,且需要每帧调用,以 Unity 引擎为例,此接口需要在 Update 中调用。
使用范围语音一定要更新声源方位,如果不需要范围判断能力,也需要进房后调用此接口一次。
如果需要同时使用 3D 音效效果,此接口中的参数 axisForward、axisRight 及 axisUp 需要按照 3D 语音部分 进行设置。
更新声源方位,目的是告诉服务器本端位置,通过本端世界坐标+本端接收音频的范围,与其他端世界坐标+其他端接收音频的范围进行判断,达到范围语音效果。
详细技术细节及讲解可参考文章 (https://cloud.tencent.com/developer/article/1008016)。
此函数用于更新声源位置信息,只支持在进房成功后调用,且需要每帧调用,以 Unity 引擎为例,此接口需要在 Update 中调用。

  1. /// 更新声源方位
  2. /// @param position int数组,自身在世界坐标系中的坐标,顺序是前、右、上
  3. /// @param axisForward float数组 自身坐标系前轴的单位向量
  4. /// @param axisRightward float数组 自身坐标系右轴的单位向量
  5. /// @param axisUpward float数组 自身坐标系上轴的单位向量
  6. -(int)LTSDKVoiceUpdateSelfPosition:(int[3])position axisForward:(float[3])axisForward axisRightward:(float[3])axisRightward axisUpward:(float[3])axisUpward;

调用方式

  1. //示例
  2. int posArr[3] = {0,self.distance,0};
  3. float axfArr[3] = {1.0,0.0,0.0};
  4. float axrArr[3] = {0.0,1.0,0.0};
  5. float axuArr[3] = {0.0,0.0,1.0};
  6. [[LTGameOCSDK shareInstance] LTSDKVoiceUpdateSelfPosition:posArr axisForward:axfArr axisRightward:axrArr axisUpward:axuArr];

5.6 初始化 3D 音效

说明:初始化 3D 音效
此函数用于初始化 3D 音效引擎,在进房后调用。在使用 3D 音效之前必须先调用此接口,只接收 3D 音效而不发出 3D 音效的用户也需要调用此接口。

  1. /// 初始化 3D 音效
  2. /// @param modelPath 3D 音效资源文件路径
  3. - (int)LTSDKVoiceInitSpatializer:(NSString *)modelPath;

调用方式

  1. NSString *filePath = [[NSBundle mainBundle] pathForResource:@"GME_2.8_3d_model" ofType:@"dat"];
  2. int init = [[LTGameOCSDK shareInstance] LTSDKVoiceInitSpatializer:filePath];

5.7 开启或关闭 3D 音效

说明:开启或关闭 3D 音效

  1. /// 开启或关闭 3D 音效
  2. /// @param bEnable 开启之后可以听到 3D 音效
  3. /// @param applyTeam 3D语音是否作用于小队内部,仅 enble 为 true 时有效
  4. -(int)LTSDKVoiceEnableSpatializer:(BOOL)bEnable applyTeam:(BOOL)applyTeam;

调用方式

  1. int init = [[LTGameOCSDK shareInstance] LTSDKVoiceEnableSpatializer:YES applyTeam:YES];

5.8 获取当前 3D 音效状态

说明:获取当前 3D 音效状态

  1. /**
  2. * 获取当前 3D 音效状态
  3. *
  4. * @return 当前状态,true开启状态/false关闭状态
  5. */
  6. -(BOOL)LTSDKVoiceIsEnableSpatializer;

调用方式

  1. BOOL isEnable = [[LTGameOCSDK shareInstance] LTSDKVoiceIsEnableSpatializer];

5.9 设置音频转发规则

说明:设置音频转发规则
事件类型参数定义 在LTParam.h头文件内的LTGame_VOICE_AUDIO_ROUTE_SEND_TYPE,

事件类型(type) 说明
LTGame_VOICE_AUDIO_ROUTE_SEND_INQUIRE_ERROR = 0 获取出错,检查是否进入房间,是否已经初始化 SDK
LTGame_VOICE_AUDIO_ROUTE_NOT_SEND_TO_ANYONE = 1 本端音频上行发送到后台,但后台不转发给任何人,相当于将自己静音,此时参数 OpenIDForSend 无效,只需填 null
LTGame_VOICE_AUDIO_ROUTE_SEND_TO_ALL = LTGame_VOICE_AUDIO_ROUTE_NOT_SEND_TO_ANYONE + 1 本端音频上行将转发给所有人,此时参数 OpenIDForSend 无效,只需填 null
LTGame_VOICE_AUDIO_ROUTE_SEND_BLACK_LIST = LTGame_VOICE_AUDIO_ROUTE_SEND_TO_ALL + 1 本端音频上行将不转发给黑名单的人,黑名单由参数 OpenIDForSend 提供,最多支持 10 个
LTGame_VOICE_AUDIO_ROUTE_SEND_WHITE_LIST = LTGame_VOICE_AUDIO_ROUTE_SEND_BLACK_LIST + 1, 本端音频上行将只转发给白名单的人,白名单由参数 OpenIDForSend 提供,最多支持 10 个

事件类型参数定义 在LTParam.h头文件内的LTGame_VOICE_AUDIO_ROUTE_RECV_TYPE,

事件类型(type) 说明
LTGame_VOICE_AUDIO_ROUTE_RECV_INQUIRE_ERROR = 0 获获取出错,检查是否进入房间,是否已经初始化 SDK
LTGame_VOICE_AUDIO_ROUTE_NOT_RECV_FROM_ANYONE = 1 本端不接受任何音频,相当于关闭房间内扬声器效果,此时参数 OpenIDForSend 无效,只需填 null
LTGame_VOICE_AUDIO_ROUTE_RECV_FROM_ALL = LTGame_VOICE_AUDIO_ROUTE_NOT_RECV_FROM_ANYONE + 1 本端接收所有人的音频,此时参数 OpenIDForSend 无效,只需填 null
LTGame_VOICE_AUDIO_ROUTE_RECV_BLACK_LIST = LTGame_VOICE_AUDIO_ROUTE_RECV_FROM_ALL + 1 本端不接收黑名单的人的音频声音,黑名单由参数 OpenIDForSend 提供,最多支持 10 个
LTGame_VOICE_AUDIO_ROUTE_RECV_WHITE_LIST = LTGame_VOICE_AUDIO_ROUTE_RECV_BLACK_LIST + 1 本端只接收白名单的人的音频声音,白名单由参数 OpenIDForSend 提供,最多支持 10 个
  1. /// 设置音频转发规则
  2. /// @param Sendtype 发送音频规则
  3. /// @param OpenIDForSend 发送音频黑/白名单列表,根据发送类型生效,最多支持10个
  4. /// @param Recvtype 接收音频规则,接口中请勿使用 LTGame_VOICE_AUDIO_ROUTE_RECV_INQUIRE_ERROR
  5. /// @param OpenIDForRecv 接收音频黑/白名单列表,根据接收类型生效,最多支持10个
  6. -(int)LTSDKVoiceSetServerAudioRouteSendOperateType:(int)Sendtype OpenIDForSend:(NSMutableArray *_Nullable)OpenIDForSend Recvtype:(int)Recvtype OpenIDForRecv:(NSMutableArray *_Nullable)OpenIDForRecv;

调用方式

  1. NSArray *sendArr = [[NSArray alloc] initWithObjects:@"11111",@"22222", nil];
  2. NSArray *recvArr = [[NSArray alloc] initWithObjects:@"33333",@"44444", nil];
  3. int setAudio = [[LTGameOCSDK shareInstance] LTSDKVoiceSetServerAudioRouteSendOperateType:self.sendType OpenIDForSend:sendArr Recvtype:self.recvType OpenIDForRecv:recvArr];

5.10 获取音频设置转发接收规则

说明:获取音频设置转发接收规则

  1. /// 获取音频设置转发接收规则
  2. /// @param OpenIDForRecv 调用后接口返回规则,传入的数组参数会返回相应规则的 openId
  3. -(int)LTSDKVoiceGetCurrentRecvAudioRoute:(NSMutableArray *_Nullable)OpenIDForRecv;

调用方式

  1. int setAudio = [[LTGameOCSDK shareInstance] LTSDKVoiceGetCurrentRecvAudioRoute:OpenIDForRecv];

5.11 获取音频设置转发发送规则

说明:获取音频设置转发发送规则

  1. /// 获取音频设置转发发送规则
  2. /// @param OpenIDForSend 调用后接口返回规则,传入的数组参数会返回相应规则的 openId
  3. -(int)LTSDKVoiceGetCurrentSendAudioRoute:(NSMutableArray *_Nullable)OpenIDForSend;

调用方式

  1. int setAudio = LTGameSDK::GetInstance().LTSDKVoiceGetCurrentSendAudioRoute(OpenIDForSend)

6.房间管理接口使用(C++)

房间管理功能在进房后才可调用,且只能修改房间内成员的状态。
所有接口的结果会通过 LTGame_VOICE_EVNET_TYPE_ROOM_MANAGEMENT_OPERATOR 回调,回调详情请参考 回调处理。
注意:房间管理接口返回值=0为操作成功,其他失败信息请查询错误码表.

6.1 采集管理

采集管理接口包含麦克风管理、音频上行管理以及采集硬件设备管理。其中麦克风管理相当于音频上行管理加上采集硬件设备管理,区分出音频数据传输上下行与硬件设备的管理,是因为打开或者关闭采集设备,将会伴随整个设备(采集和播放)重启,如果此时 App 正在播放背景音乐,那么背景音乐的播放也会被中断。利用控制上下行的方式来实现开关麦克风效果,将不会中断播放设备。
注意:采集管理(麦克风管理、音频上行管理以及采集硬件设备管理)可以设置直接关闭,但是打开时出于个人隐私保护最好需要对方授权(腾讯方建议), 因此SDK只做回调消息通知不会直接打开采集管理;也可以接收到回调消息后直接调用设置接口打开,不去请求用户允许,这个看具体业务的策略,但这样不符合个人隐私保护

6.1.1 麦克风管理

接口说明:
调用此接口打开或关闭房间内某用户的麦克风,调用成功后,该用户的麦克风将被关闭或打开。
LTVoiceEnableMic 相当于同时调用 LTVoiceEnableAudioSend 及 LTVoiceEnableAudioCaptureDevice。
接口调用示例:

  1. /// 麦克风管理
  2. /// @param enable true:打开某用户麦克风,false:关闭某用户麦克风
  3. /// @param receiverID 填入目标用户角色ID
  4. int LTVoiceEnableMic(bool enable, const char *receiverID);
  5. LTGameSDK::GetInstance().LTVoiceEnableMic(true/false, "角色ID");

6.1.2 音频上行管理

接口说明:
调用此接口打开或关闭房间内某用户的音频上行。调用成功后,该用户的音频上行将被关闭或打开
接口调用示例:

  1. /// 音频上行管理
  2. /// @param enable true:打开某用户上行,false:关闭某用户上行
  3. /// @param receiverID 填入目标用户角色ID
  4. int LTVoiceEnableAudioSend(bool enable, const char *receiverID);
  5. LTGameSDK::GetInstance().LTVoiceEnableAudioSend(true/false, "角色ID");

6.1.3 音频采集硬件设备管理

接口说明:
调用此接口打开或关闭房间内某用户的音频采集硬件设备。调用成功后,该用户的音频采集硬件设备将被关闭或打开
接口调用示例:

  1. /// 音频采集硬件设备管理
  2. /// @param enable true:打开某用户音频采集硬件设备,false:关闭某用户音频采集硬件设备
  3. /// @param receiverID 填入目标用户角色ID
  4. int LTVoiceEnableAudioCaptureDevice(bool enable, const char *receiverID);
  5. LTGameSDK::GetInstance().LTVoiceEnableAudioCaptureDevice(true/false, "角色ID");

6.2 播放管理相关接口

播放管理接口包含扬声器管理、音频下行管理以及播放硬件设备管理。其中扬声器管理相当于音频下行管理加上播放硬件设备管理。区分出音频数据传输上下行与硬件设备的管理,是因为打开或者关闭采集设备,将会伴随整个设备(采集及播放)重启,如果此时 App 正在播放背景音乐,那么背景音乐的播放也会被中断。利用控制上下行的方式来实现开关麦克风效果,不会中断播放设备。
注意:播放管理(扬声器管理、音频下行管理以及播放硬件设备管理)接口开关可直接设置,无需用户同意

6.2.1 扬声器管理

接口说明:
调用此接口打开或关闭房间内某用户的扬声器。调用成功后,该用户的扬声器将被关闭或打开,听到房间内的音频声音。
LTVoiceEnableSpeaker 相当于同时调用 LTVoiceEnableAudioRecv 及 LTVoiceEnableAudioPlayDevice。
接口调用示例:

  1. /// 扬声器管理
  2. /// @param enable true :打开某用户扬声器,false:关闭某用户扬声器
  3. /// @param receiverID 填入目标用户角色ID
  4. int LTVoiceEnableSpeaker(bool enable, const char *receiverID);
  5. LTGameSDK::GetInstance().LTVoiceEnableSpeaker(true/false, "角色ID");

6.2.2 音频下行管理

接口说明:
调用此接口打开或关闭房间内某用户的音频下行。调用成功后,该用户的音频下行将被关闭或打开,但不影响播放设备。
接口调用示例:

  1. /// 音频下行管理
  2. /// @param enable true :打开某用户音频下行,false:关闭某用户音频下行
  3. /// @param receiverID 填入目标用户角色ID
  4. int LTVoiceEnableAudioRecv(bool enable, const char *receiverID);
  5. LTGameSDK::GetInstance().LTVoiceEnableAudioRecv(true/false, "角色ID");

6.2.3 音频播放硬件设备管理

接口说明:
调用此接口打开或关闭房间内某用户的音频播放硬件设备。调用成功后,该用户的音频播放硬件设备将被关闭或打开,但不影响下行。
接口调用示例:

  1. /// 音频播放硬件设备管理
  2. /// @param enable true :打开某用户音频播放硬件设备,false:关闭某用户音频播放硬件设备
  3. /// @param receiverID 填入目标用户角色ID
  4. int LTVoiceEnableAudioPlayDevice(bool enable, const char *receiverID);
  5. LTGameSDK::GetInstance().LTVoiceEnableAudioPlayDevice(true/false, "角色ID");

6.3 获取成员状态接口

6.3.1 获取某人麦克风状态

接口说明:
调用此接口,获取房间内某成员的麦克风状态。
接口调用示例:

  1. /// 获取某人麦克风状态
  2. /// @param receiverID 填入目标用户角色ID
  3. int LTVoiceGetMicState(const char *receiverID);
  4. LTGameSDK::GetInstance().LTVoiceGetMicState("角色ID");

6.3.2 获取某人扬声器状态

接口说明:
调用此接口,获取房间内某成员的扬声器状态。
接口调用示例:

  1. /// 获取某人扬声器状态
  2. /// @param receiverID 填入目标用户角色ID
  3. int LTVoiceGetSpeakerState(const char *receiverID);
  4. LTGameSDK::GetInstance().LTVoiceGetSpeakerState("角色ID");

6.3.3 禁止某位成员操作麦克风及扬声器

接口说明:
成员进房默认为允许操作麦克风及扬声器,调用此接口可以禁止房间内的某位成员操作麦克风及扬声器,在该成员退出房间后此功能失效。
注意:此接口为true时才是禁止某人操作设备,false时允许操作设备
接口调用示例:

  1. /// 禁止某位成员操作麦克风及扬声器
  2. /// @param enable true:禁止某用户操作设备,false:允许某用户操作设备
  3. /// @param receiverID 填入目标用户角色ID
  4. int LTVoiceForbidUserOperation(bool enable, const char *receiverID);
  5. LTGameSDK::GetInstance().LTVoiceForbidUserOperation(true/false, "角色ID");

6.4 高级接口

接口说明:
设置最高混音路数,在进房前调用,最大为20(超过6人大概率会导致分不清说话的具体是哪位玩家)。
接口调用示例:

  1. /// 设置最大混音路数,进房前调用
  2. /// @param count 混音路数,最大为20
  3. int LTVoiceSetRecvMixStreamCount(int count);
  4. LTGameSDK::GetInstance().LTVoiceSetRecvMixStreamCount(传入小于等于20的正整数);

6.5 回调处理

与语音其他回调相同,房间管理的回调也在 void verificationLinstener(int type, int errCode,const char *data) 中处理,事件名称为 LTGame_VOICE_EVNET_TYPE_ROOM_MANAGEMENT_OPERATOR,事件会返回一个结构体,具体包含的内容如下。

参数 类型 含义
SenderID const char * 事件发送者角色ID,如果与自己角色ID相同,即为本端发送的命令
ReceiverID const char * 事件接收者角色ID,如果与自己角色ID相同,即为本端接收的命令
OperateType int 事件类型
OperateValue bool 命令详情(0:关闭命令,1:打开命令)
事件类型(OperateType) 含义
0 控制采集设备硬件回调
1 控制播放设备硬件回调
2 控制上行回调
3 控制下行回调
4 控制麦克风回调
5 控制扬声器回调
6 获取麦克风状态
7 获取扬声器状态
8 禁止操作麦克风及扬声器事件
  1. /**
  2. * 语言业务结果回调
  3. *
  4. * @param type 事件类型
  5. * @param errCode 错误码
  6. * @param data 数据信息 json格式
  7. *
  8. */
  9. void verificationLinstener(int type, int errCode,const char *data){
  10. cout<<"*********VerificationLinstener********"<<endl;
  11. cout<<data<<endl;
  12. Json::Reader json_reader;
  13. Json::Value json_object;
  14. if (!json_reader.parse(data, json_object)){
  15. return;
  16. }
  17. switch (type) {
  18. case LTGame_VOICE_EVNET_TYPE_ROOM_MANAGEMENT_OPERATOR:
  19. {
  20. [mLTVoiceViewController showLog:[NSString stringWithFormat:@"房间管理%@",[NSString stringWithUTF8String:data]]];
  21. NSString *roleid = [[NSUserDefaults standardUserDefaults] objectForKey:@"LTDEMO_ROLE"];
  22. NSArray *operatorArr = @[@"采集",@"播放",@"上行",@"下行",@"控制麦克风",@"控制扬声器",@"获取麦克风状态",@"获取扬声器状态",@"禁止操作麦克风/扬声器"];
  23. string SenderIDStr = json_object["SenderID"].asString();
  24. string ReceiverIDStr = json_object["ReceiverID"].asString();
  25. int OperateType = json_object["OperateType"].asInt();
  26. bool OperateValue = json_object["OperateValue"].asBool();
  27. NSString *SenderID = [NSString stringWithUTF8String:SenderIDStr.c_str()];
  28. NSString *ReceiverID = [NSString stringWithUTF8String:ReceiverIDStr.c_str()];
  29. if([SenderID isEqualToString:roleid]){//自己发出去的命令
  30. if (OperateType == 6 || OperateType == 7) {//获取目标麦克风或者扬声器状态的结果
  31. NSString *alterString = [NSString stringWithFormat:@"发送给id:%@ 的%@操作,开关结果:%@",ReceiverID,operatorArr[OperateType],OperateValue ? @"开" : @"关"];
  32. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"房间管理操作"
  33. message:alterString
  34. delegate:NULL
  35. cancelButtonTitle:@"OK"
  36. otherButtonTitles:nil];
  37. [alert show];
  38. }else{
  39. NSString *alterString = [NSString stringWithFormat:@"发送给id:%@ 的%@%@操作,操作结果:%@",ReceiverID,OperateValue?@"开":@"关",operatorArr[OperateType],errCode ? @"失败" : @"成功"];
  40. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"房间管理操作" message:alterString delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil];
  41. [alert show];
  42. }
  43. }else if ([ReceiverID isEqualToString:roleid]){//别人发过来的命令
  44. if (errCode == 0) {
  45. switch (OperateType) {
  46. case 0://根据回调结果开启/关闭采集设备(参考5.1采集管理注意事项,最好需要用户允许再操作开关)
  47. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceEnableAudioCaptureDevice(OperateValue);
  48. break;
  49. case 2://根据回调结果开启/关闭采集设备(参考5.1采集管理注意事项,最好需要用户允许再操作开关)
  50. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceEnableAudioSend(OperateValue);
  51. break;
  52. case 4://根据回调结果开启/关闭采集设备(参考5.1采集管理注意事项,最好需要用户允许再操作开关)
  53. LongTuBaseSdk::LTGameSDK::GetInstance().LTVoiceEnableMic(OperateValue);
  54. break;
  55. default:
  56. break;
  57. }
  58. }
  59. if (OperateType == 6 || OperateType == 7) {
  60. NSString *alterString = [NSString stringWithFormat:@"收到id:%@ 发送来的%@操作,结果:%@",SenderID,operatorArr[OperateType],OperateValue?@"开":@"关"];
  61. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"房间管理操作" message:alterString delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil];
  62. [alert show];
  63. }
  64. else{
  65. NSString *alterString = [NSString stringWithFormat:@"收到id:%@ 发送来的%@%@操作,结果:%@",SenderID,OperateValue?@"开":@"关",operatorArr[OperateType],errCode ? @"失败" : @"成功"];
  66. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"房间管理操作" message:alterString delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil];
  67. [alert show];
  68. }
  69. }
  70. }
  71. break;
  72. default:
  73. break;
  74. }
  75. }

6.房间管理接口使用(OC)

房间管理功能在进房后才可调用,且只能修改房间内成员的状态。
所有接口的结果会通过 LTOCGame_VOICE_EVNET_TYPE_ROOM_MANAGEMENT_OPERATOR 回调,回调详情请参考 回调处理。
注意:房间管理接口返回值=0为操作成功,其他失败信息请查询错误码表.

6.1 采集管理

采集管理接口包含麦克风管理、音频上行管理以及采集硬件设备管理。其中麦克风管理相当于音频上行管理加上采集硬件设备管理,区分出音频数据传输上下行与硬件设备的管理,是因为打开或者关闭采集设备,将会伴随整个设备(采集和播放)重启,如果此时 App 正在播放背景音乐,那么背景音乐的播放也会被中断。利用控制上下行的方式来实现开关麦克风效果,将不会中断播放设备。
注意:采集管理(麦克风管理、音频上行管理以及采集硬件设备管理)可以设置直接关闭,但是打开时出于个人隐私保护最好需要对方授权(腾讯方建议), 因此SDK只做回调消息通知不会直接打开采集管理;也可以接收到回调消息后直接调用设置接口打开,不去请求用户允许,这个看具体业务的策略,但这样不符合个人隐私保护

6.1.1 麦克风管理

接口说明:
调用此接口打开或关闭房间内某用户的麦克风,调用成功后,该用户的麦克风将被关闭或打开。
LTVoiceEnableMic 相当于同时调用 LTVoiceEnableAudioSend 及 LTVoiceEnableAudioCaptureDevice。
接口调用示例:

  1. /// 麦克风管理
  2. /// @param enable YES:打开某用户麦克风,NO:关闭某用户麦克风
  3. /// @param receiverID 填入目标用户角色ID
  4. - (int)LTSDKVoiceEnableMic:(BOOL)enable Receiver:(NSString *_Nonnull)receiverID;
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceEnableMic:YES/NO Receiver:@"角色ID"];

6.1.2 音频上行管理

接口说明:
调用此接口打开或关闭房间内某用户的音频上行。调用成功后,该用户的音频上行将被关闭或打开
接口调用示例:

  1. /// 音频上行管理
  2. /// @param enable YES:打开某用户上行,NO:关闭某用户上行
  3. /// @param receiverID 填入目标用户角色ID
  4. - (int)LTSDKVoiceEnableAudioSend:(BOOL)enable Receiver:(NSString *_Nonnull)receiverID;
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceEnableAudioSend:YES/NO Receiver:@"角色ID"];

6.1.3 音频采集硬件设备管理

接口说明:
调用此接口打开或关闭房间内某用户的音频采集硬件设备。调用成功后,该用户的音频采集硬件设备将被关闭或打开
接口调用示例:

  1. /// 音频采集硬件设备管理
  2. /// @param enable YES:打开某用户音频采集硬件设备,NO:关闭某用户音频采集硬件设备
  3. /// @param receiverID 填入目标用户角色ID
  4. - (int)LTSDKVoiceEnableAudioCaptureDevice:(BOOL)enable Receiver:(NSString *_Nonnull)receiverID;
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceEnableAudioCaptureDevice:YES/NO Receiver:@"角色ID"];

6.2 播放管理相关接口

播放管理接口包含扬声器管理、音频下行管理以及播放硬件设备管理。其中扬声器管理相当于音频下行管理加上播放硬件设备管理。区分出音频数据传输上下行与硬件设备的管理,是因为打开或者关闭采集设备,将会伴随整个设备(采集及播放)重启,如果此时 App 正在播放背景音乐,那么背景音乐的播放也会被中断。利用控制上下行的方式来实现开关麦克风效果,不会中断播放设备。
注意:播放管理(扬声器管理、音频下行管理以及播放硬件设备管理)接口开关可直接设置,无需用户同意

6.2.1 扬声器管理

接口说明:
调用此接口打开或关闭房间内某用户的扬声器。调用成功后,该用户的扬声器将被关闭或打开,听到房间内的音频声音。
LTVoiceEnableSpeaker 相当于同时调用 LTVoiceEnableAudioRecv 及 LTVoiceEnableAudioPlayDevice。
接口调用示例:

  1. /// 扬声器管理
  2. /// @param enable YES :打开某用户扬声器,NO:关闭某用户扬声器
  3. /// @param receiverID 填入目标用户角色ID
  4. - (int)LTSDKVoiceEnableSpeaker:(BOOL)enable Receiver:(NSString *_Nonnull)receiverID;
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceEnableSpeaker:YES/NO Receiver:@"角色ID"];

6.2.2 音频下行管理

接口说明:
调用此接口打开或关闭房间内某用户的音频下行。调用成功后,该用户的音频下行将被关闭或打开,但不影响播放设备。
接口调用示例:

  1. /// 音频下行管理
  2. /// @param enable YES :打开某用户音频下行,NO:关闭某用户音频下行
  3. /// @param receiverID 填入目标用户角色ID
  4. - (int)LTSDKVoiceEnableAudioRecv:(BOOL)enable Receiver:(NSString *_Nonnull)receiverID;
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceEnableAudioRecv:YES/NO Receiver:@"角色ID"];

6.2.3 音频播放硬件设备管理

接口说明:
调用此接口打开或关闭房间内某用户的音频播放硬件设备。调用成功后,该用户的音频播放硬件设备将被关闭或打开,但不影响下行。
接口调用示例:

  1. /// 音频播放硬件设备管理
  2. /// @param enable YES :打开某用户音频播放硬件设备,NO:关闭某用户音频播放硬件设备
  3. /// @param receiverID 填入目标用户角色ID
  4. - (int)LTSDKVoiceEnableAudioPlayDevice:(BOOL)enable Receiver:(NSString *_Nonnull)receiverID;
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceEnableAudioPlayDevice:YES/NO Receiver:@"角色ID"];

6.3 获取成员状态接口

6.3.1 获取某人麦克风状态

接口说明:
调用此接口,获取房间内某成员的麦克风状态。
接口调用示例:

  1. /// 获取某人麦克风状态
  2. /// @param receiverID 填入目标用户角色ID
  3. - (int)LTSDKVoiceGetMicState:(NSString *_Nonnull)receiverID;
  4. [[LTGameOCSDK shareInstance] LTSDKVoiceGetMicState:@"角色ID"];

6.3.2 获取某人扬声器状态

接口说明:
调用此接口,获取房间内某成员的扬声器状态。
接口调用示例:

  1. /// 获取某人扬声器状态
  2. /// @param receiverID 填入目标用户角色ID
  3. - (int)LTSDKVoiceGetSpeakerState:(NSString *_Nonnull)receiverID;
  4. [[LTGameOCSDK shareInstance] LTSDKVoiceGetSpeakerState:@"角色ID"];

6.3.3 禁止某位成员操作麦克风及扬声器

接口说明:
成员进房默认为允许操作麦克风及扬声器,调用此接口可以禁止房间内的某位成员操作麦克风及扬声器,在该成员退出房间后此功能失效。
注意:此接口为true时才是禁止某人操作设备,false时允许操作设备
接口调用示例:

  1. /// 禁止某位成员操作麦克风及扬声器
  2. /// @param enable YES:禁止某用户操作设备,NO:允许某用户操作设备
  3. /// @param receiverID 填入目标用户角色ID
  4. - (int)LTSDKVoiceForbidUserOperation:(BOOL)enable Receiver:(NSString *_Nonnull)receiverID;
  5. [[LTGameOCSDK shareInstance] LTSDKVoiceForbidUserOperation:YES/NO Receiver:@"角色ID"];

6.4 高级接口

接口说明:
设置最高混音路数,在进房前调用,最大为20(超过6人大概率会导致分不清说话的具体是哪位玩家)。
接口调用示例:

  1. /// 设置最大混音路数,在进房前调用。
  2. /// @param count 混音路数,最大为20
  3. - (int)LTSDKVoiceSetRecvMixStreamCount:(int)count;
  4. [[LTGameOCSDK shareInstance] LTSDKVoiceSetRecvMixStreamCount:传入小于等于20的正整数];

6.5 回调处理

与语音其他回调相同,房间管理的回调也在- (void)ltVerificationLinstenerWithType:(int)type errCode:(int)errCode dict:(NSDictionary *)dict;中处理,事件名称为 LTOCGame_VOICE_EVNET_TYPE_ROOM_MANAGEMENT_OPERATOR,事件会返回一个结构体,具体包含的内容如下。

参数 类型 含义
SenderID NSString 事件发送者角色ID,如果与自己角色ID相同,即为本端发送的命令
ReceiverID NSString 事件接收者角色ID,如果与自己角色ID相同,即为本端接收的命令
OperateType NSNumber 事件类型
OperateValue NSNumber 命令详情(0:关闭命令,1:打开命令)
事件类型(OperateType) 含义
0 控制采集设备硬件回调
1 控制播放设备硬件回调
2 控制上行回调
3 控制下行回调
4 控制麦克风回调
5 控制扬声器回调
6 获取麦克风状态
7 获取扬声器状态
8 禁止操作麦克风及扬声器事件
  1. /**
  2. * 语言业务结果回调
  3. *
  4. * @param type 事件类型
  5. * @param errCode 错误码
  6. * @param dict 数据信息 json格式
  7. *
  8. */
  9. - (void)ltVerificationLinstenerWithType:(int)type errCode:(int)errCode dict:(NSDictionary *)dict{
  10. switch (type) {
  11. case LTOCGame_VOICE_EVNET_TYPE_ROOM_MANAGEMENT_OPERATOR:
  12. {
  13. NSArray *operatorArr = @[@"采集",@"播放",@"上行",@"下行",@"控制麦克风",@"控制扬声器",@"获取麦克风状态",@"获取扬声器状态",@"禁止操作麦克风/扬声器"];
  14. NSString *SenderID = [dict objectForKey:@"SenderID"];
  15. NSString *ReceiverID = [dict objectForKey:@"ReceiverID"];
  16. NSNumber *OperateType = [dict objectForKey:@"OperateType"];
  17. NSNumber *OperateValue = [dict objectForKey:@"OperateValue"];
  18. if([SenderID isEqualToString:roleid]){//自己发出去的命令
  19. if (OperateType.intValue == 6 || OperateType.intValue == 7) {{//获取目标麦克风或者扬声器状态的结果
  20. NSString *alterString = [NSString stringWithFormat:@"发送给id:%@ 的 %@ 操作,开关结果:%@",ReceiverID,operatorArr[OperateType.intValue],OperateValue.boolValue ? @"开" : @"关"];
  21. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"房间管理操作"
  22. message:alterString
  23. delegate:NULL
  24. cancelButtonTitle:@"OK"
  25. otherButtonTitles:nil];
  26. [alert show];
  27. }else{
  28. NSString *alterString = [NSString stringWithFormat:@"发送给id:%@ 的%@ %@ 操作,操作结果:%@",ReceiverID,OperateValue.boolValue?@"开":@"关",operatorArr[OperateType.intValue],errCode ? @"失败" : @"成功"];
  29. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"房间管理操作" message:alterString delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil];
  30. [alert show];
  31. }
  32. }else if ([ReceiverID isEqualToString:roleid]){//别人发过来的命令
  33. if (errCode == 0) {
  34. switch (OperateType.intValue) {
  35. case 0://根据回调结果开启/关闭采集设备(参考5.1采集管理注意事项,最好需要用户允许再操作开关)
  36. [[LTGameOCSDK shareInstance] LTSDKVoiceEnableAudioCaptureDevice:OperateValue.boolValue];
  37. break;
  38. case 2://根据回调结果开启/关闭采集设备(参考5.1采集管理注意事项,最好需要用户允许再操作开关)
  39. [[LTGameOCSDK shareInstance] LTSDKVoiceEnableAudioSend:OperateValue.boolValue];
  40. break;
  41. case 4://根据回调结果开启/关闭采集设备(参考5.1采集管理注意事项,最好需要用户允许再操作开关)
  42. [[LTGameOCSDK shareInstance] LTSDKVoiceEnableMic:OperateValue.boolValue];
  43. break;
  44. default:
  45. break;
  46. }
  47. }
  48. if (OperateType.intValue == 6 || OperateType.intValue == 7) {
  49. NSString *alterString = [NSString stringWithFormat:@"收到id:%@ 发送来的 %@ 操作,结果:%@",SenderID,operatorArr[OperateType.intValue],OperateValue.boolValue?@"开":@"关"];
  50. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"房间管理操作" message:alterString delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil];
  51. [alert show];
  52. }
  53. else{
  54. NSString *alterString = [NSString stringWithFormat:@"收到id:%@ 发送来的%@ %@ 操作,结果:%@",SenderID,OperateValue.boolValue?@"开":@"关",operatorArr[OperateType.intValue],errCode ? @"失败" : @"成功"];
  55. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"房间管理操作" message:alterString delegate:NULL cancelButtonTitle:@"OK" otherButtonTitles:nil];
  56. [alert show];
  57. }
  58. }
  59. }
  60. break;
  61. default:
  62. break;
  63. }
  64. }

7 附录

不同语音模式

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

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

距离与声音衰减的关系

3D 音效中,音源音量的大小与音源距离有一定的衰减关系。单位距离超过 range 之后,音量衰减到几乎为零。

8.错误码表

一般性错误

错误码名称 错误码值 原因及建议方案
AV_ERR_3DVOICE_ERR_NOT_INITED 7003 需要先调用 InitSpatializer 接口
AV_ERR_NET_REQUEST_FALLED 7004 网络请求失败,一般由网络状态不稳定引起,可参考 实时语音房间问题 进行排查
AV_ERR_CHARGE_OVERDUE 7005 账号欠费导致失败,需要在腾讯云控制台上查看是否欠费
AV_ERR_AUTH_FIALD 7006 鉴权失败 有以下几个原因:1. AppID 不存在或者错误,2. authbuff 鉴权错误,3. 鉴权过期
AV_ERR_IN_OTHER_ROOM 7007 已经在其它房间
AV_ERR_NO_PERMISSION 7009 要进行某个操作的时候,没有权限
AV_ERR_FILE_CANNOT_ACCESS 7010 无法访问文件
AV_ERR_FILE_DAMAGED 7011 文件被损坏
AV_ERR_SERVICE_NOT_OPENED 7012 没有在控制台开通此功能,请在控制台上开通
AV_ERR_USER_CANCELED 7013 用户主动取消此操作,例如没进房成功就进行退房操作
AV_ERR_LOAD_LIB_FAILED 7014 库文件没有正常加载,请检查库文件是否缺失
AV_ERR_SDK_NOT_FULL_UPDATE 7015 升级 SDK 时,没有升级所有的文件,导致某些模块不匹配,请全量升级 SDK
AV_ERR_3DVOICE_ERR_FILE_DAMAGED 7002 3D 音效文件未加载成功

实时语音客户端错误

错误码名称 错误码值 含义 原因 建议方案
AV_ERR_REPEATED_OPERATION 1001 重复操作 已经在进行某种操作,再次去做同样的操作,则会产生这个错误。操作类别主要有:AVContext 类、房间类、设备类、成员类。AVContext 类型的操作:StartContext/StopContext。房间类型的操作:EnterRoom/ExitRoom。设备类型的操作:打开/关闭某个设备。 等待上一个操作完成后再进行下一个操作。
AV_ERR_EXCLUSIVE_OPERATION 1002 互斥操作 已经在进行某种操作,再次去做同类型的其他操作,则会产生这个错误。 等待上一个操作完成后再进行下一个操作。
AV_ERR_HAS_IN_THE_STATE 1003 重复操作 对象已经处于某种状态,再去做使得它进入这种状态的操作时,则会产生这个错误。如已经在房间中,再去做进入房间的操作,就会产生这个错误。 由于已经处于所要状态,可以认为该操作已经成功,当作成功来处理。
AV_ERR_INVALID_ARGUMENT 1004 错误参数 调用 SDK 接口时,传入错误的参数,则会产生这个错误。如进入房间时,传入的房间类型不等于 AVRoom::ROOM_TYPE_PAIR 或 AVRoom::ROOM_TYPE_MULTI,就会产生这个错误。 详细阅读 API 文档,获取每个接口的每个参数的有效取值范围,保证传入参数的正确性并进行相应的预防处理。
AV_ERR_TIMEOUT 1005 操作超时 进行某个操作,在规定的时间内,还未返回操作结果,则会产生这个错误。多数情况下,涉及到信令传输的、且网络出问题的情况下,才容易产生这个错误。如执行进入房间操作时,30s后还没有返回进入房间操作完成的结果的话,就会产生这个错误。 确认网络是否有问题,是否能连接到外网环境,并尝试重试。
AV_ERR_NOT_IMPLEMENTED 1006 未实现 调用 SDK 接口时,如果相应的功能还未支持,则会产生这个错误。 暂不支持该功能,找其他替代方案。
AV_ERR_NOT_IN_MAIN_THREAD 1007 不在主线程 SDK 对外接口要求在主线程执行,如果业务侧调用 SDK 接口时,没有在主线程调用,则会产生这个错误。 修改业务侧逻辑,确保在主线程调用 SDK 接口。
AV_ERR_RESOURCE_IS_OCCUPIED 1008 资源被占用 当需要用到某种资源,如摄像头、屏幕等,而这些资源已经被占用了,则会产生这个错误。 确认具体要用到哪些资源,及这样资源为什么被占用了,确保在正确的时机使用 SDK 相关功能以保证资源使用不冲突。
AV_ERR_CONTEXT_NOT_EXIST 1101 AVContext 状态问题 当 AVContext 对象未处于 CONTEXT_STATE_STARTED 状态,去调用需要处于这个状态才允许调用的接口时,则会产生这个错误。 修改业务侧逻辑,确保调用 SDK 接口时机的正确性。
AV_ERR_CONTEXT_NOT_STOPPED 1102 AVContext 状态问题 当 AVContext 对象未处于 CONTEXT_STATE_STOPPED 状态,去调用需要处于这个状态才允许调用的接口时,则会产生这个错误。如不在这种状态下,去调用 AVContext::DestroyContext 时,就会产生这个错误。 修改业务侧逻辑,确保调用 SDK 接口的时机的正确性。
AV_ERR_ROOM_NOT_EXIST 1201 AVRoom 状态问题 当 AVRoom 对象未处于 ROOM_STATE_ENTERED 状态,去调用需要处于这个状态才允许调用的接口时,则会产生这个错误。 修改业务侧逻辑,确保调用 SDK 接口的时机的正确性。
AV_ERR_ROOM_NOT_EXITED 1202 AVRoom 状态问题 当 AVRoom 对象未处于 ROOM_STATE_EXITED 状态,去调用需要处于这个状态才允许调用的接口时,则会产生这个错误。如不在这种状态下,去调用 AVContext::StopContext 时,就会产生这个错误。 修改业务侧逻辑,确保调用 SDK 接口的时机的正确性。
AV_ERR_DEVICE_NOT_EXIST 1301 设备不存在 当设备不存在或者设备初始化未完成时,去使用设备,则会产生这个错误。 确认设备是否真的存在,确保设备 ID 填写的正确性,确保在设备初始化成功后再去使用设备。
AV_ERR_ENDPOINT_NOT_EXIST 1401 AVEndpoint 对象不存在 当成员没有在发语音或视频文件时,去获取它的 AVEndpoint 对象时,就可能产生这个错误。 修改业务侧逻辑,确保调用 SDK 接口的时机的正确性。
AV_ERR_ENDPOINT_HAS_NOT_VIDEO 1402 成员没有发视频 当成员没有在发视频时,去做需要成员发视频的相关操作时,就可能产生这个错误。如当某个成员没有发送视频时,去请求他的画面,就会产生这个错误。 修改业务侧逻辑,确保调用 SDK 接口的时机的正确性。
AV_ERR_TINYID_TO_OPENID_FAILED 1501 tinyid 转 identifier 失败 当收到某个成员信息更新的信令时,需要去把 tinyid 转成 identifier,如果 IMSDK 库相关逻辑存在问题、网络存在问题等,则会产生这个错误。 确认网络是否存在问题,查看日志确认 IMSDK 相关逻辑是否存在问题。
AV_ERR_OPENID_TO_TINYID_FAILED 1502 identifier 转 tinyid 失败 当调用 StartContext 接口时,需要去把 identifier 转成 tinyid,如果 IMSDK 库相关逻辑存在问题、网络存在问题、没有处于登录态时等,则会产生这个错误。 确认网络是否存在问题,查看日志确认 IMSDK 相关逻辑是否存在问题,确认已经成功调用 IMSDK 的登录接口。
AV_ERR_DEVICE_TEST_NOT_EXIST 1601 AVDeviceTest 状态问题 当 AVDeviceTest 对象未处于 DEVICE_TEST_STATE_STARTED 状态,去调用需要处于这个状态才允许调用的接口时,则会产生这个错误。 修改业务侧逻辑,确保调用 SDK 接口的时机的正确性。
AV_ERR_DEVICE_TEST_NOT_STOPPED 1602 AVDeviceTest 状态问题 当 AVDeviceTest 对象未处于 DEVICE_TEST_STATE_STOPPED 状态,去调用需要处于这个状态才允许调用的接口时,则会产生这个错误。如不在这种状态下,去调用 AVContext::StopContext 时,就会产生这个错误。 修改业务侧逻辑,确保调用 SDK 接口的时机的正确性。
AV_ERR_INVITET_FAILED 1801 发送邀请失败 发送邀请时产生的失败。 邀请模块只是用于 DEMO 演示方便用,对外暂不支持邀请功能,所以业务侧不需要处理这些错误码。
AV_ERR_ACCEPTT_FAILED 1802 接受邀请失败 接受邀请时产生的失败。 邀请模块只是用于 DEMO 演示方便用,对外暂不支持邀请功能,所以业务侧不需要处理这些错误码。
AV_ERR_REFUSE_FAILED 1803 拒绝邀请失败 拒绝邀请时产生的失败。 邀请模块只是用于 DEMO 演示方便用,对外暂不支持邀请功能,所以业务侧不需要处理这些错误码。
QAV_ERR_NOT_TRY_NEW_ROOM 2001 没有尝试进入新房间,将停留在旧房间。 切换到新房间失败,但仍然在当前房间 在当前房间仍可以正常使用。
QAV_ERR_TRY_NEW_ROOM_FAILED 2002 尝试进入新房间,但失败了,旧房间也将关闭。 切换到新房间失败,同时已退出原来的房间 退出房间,重新进入。

实时语音服务端错误

错误码名称 错误码值 含义 原因 建议方案
AV_ERR_SERVER_FAILED 10001 一般错误 具体原因需要通过分析日志确认后台返回给客户端的真正错误码才能知道。 查看并确认进房 API 中的参数,如 AppID, UIN, AuthBuffer 的合法性(参照文档)。请查看控制台上的相关参数是否与本地的一致。请查看控制台是否欠费。检查开发者测试设备网络环境,是在开发者内网环境还是外网环境。
AV_ERR_SERVER_INVALID_ARGUMENT 10002 错误参数 调用 SDK 接口时,或 SDK 内部发送信令给后台时,传了错误的参数。 确保调用 SDK 接口时所传的参数的正确性。分析日志,获取后台返回给客户端的真正错误码,并联系后台同事协助解决。
AV_ERR_SERVER_NO_PERMISSION 10003 没有权限 没有权限使用某个功能。如进入房间时所带的签名错误或过期,就会产生这个错误。 确保在设置正确的权限参数后才去使用相应的功能。检查 AppID 及权限密钥是否正确。
AV_ERR_SERVER_TIMEOUT 10004 超时 进行某个操作,在规定的时间内,还未返回操作结果,则会产生这个错误。 分析日志,获取后台返回给客户端的真正错误码,并联系后台同事协助解决。
AV_ERR_SERVER_ALLOC_RESOURCE_FAILED 10005 网络错误 执行某些操作时,网络错误 看并确认进房 API 中的参数,例如 AppID, UIN, AuthBuffer 的合法性(参照文档)。如果合法,检查开发者测试设备网络环境,是在开发者内网环境还是外网环境。如果是开发者内网,请开发者探测下 url:openmsf.3g.qq.com:15000 是否能够连接上。如上 url 成功连接,请探测下 url:cloud.tim.qq.com:15000 是否能够连通。
AV_ERR_SERVER_ID_NOT_IN_ROOM 10006 不在房间内 在不在房间内时,去执行某些操作,则会产生这个错误。 确保在正确的时机使用 SDK 相关功能
AV_ERR_SERVER_NOT_IMPLEMENT 10007 未实现 调用 SDK 接口时,如果相应的功能还未支持,则会产生这个错误。 暂不支持该功能,找其他替代方案。
AV_ERR_SERVER_REPEATED_OPERATION 10008 重复操作 已经在进行某种操作,再次去做同类型的其他操作,则会产生这个错误。 等待上一个操作完成后再进行下一个操作。
AV_ERR_SERVER_ROOM_NOT_EXIST 10009 房间不存在 房间不存在时,去执行某些操作,则会产生这个错误。 确保在正确的时机使用 SDK 相关功能
AV_ERR_SERVER_ENDPOINT_NOT_EXIST 10010 成员不存在 某个成员不存在时,去执行该成员相关的操作,则会产生这个错误。 分析日志,获取后台返回给客户端的真正错误码,并联系后台同事协助解决。
AV_ERR_SERVER_INVALID_ABILITY 10011 错误能力 具体原因需要通过分析日志确认后台返回给客户端的真正错误码才能知道。 分析日志,获取后台返回给客户端的真正错误码,并联系后台同事协助解决。

语音转文字错误

错误码名称 错误码值 含义 原因 建议方案
QAVPTTERROR_RECORDER_PARAM_NULL 4097 录音错误 参数为空 检查代码中接口参数是否正确。
QAVPTTERROR_RECORDER_INIT_ERROR 4098 录音错误 初始化错误 检查设备是否被占用,或者权限是否正常,是否初始化正常。
QAVPTTERROR_RECORDER_RECORDING_ERR 4099 录音错误 正在录制中 确保在正确的时机使用 SDK 录制功能。
QAVPTTERROR_RECORDER_NODATA_ERR 4100 录音错误 没有采集到音频数据 检查麦克风设备是否正常。
QAVPTTERROR_RECORDER_OPENFILE_ERR 4101 录音错误 录音时,录制文件访问错误 确保文件存在,文件路径的合法性。
QAVPTTERROR_RECORDER_PERMISSION_MIC_ERR 4102 录音错误 麦克风未授权错误 使用 SDK 需要麦克风权限,添加权限请参考对应引擎或平台的 SDK 工程配置文档。
QAVPTTERROR_RECORDER_AUDIO_TOO_SHORT 4103 录音错误 录音时间太短错误 首先,限制录音时长的单位为毫秒,检查参数是否正确;其次,录音时长要1000毫秒以上才能成功录制。
QAVPTTERROR_RECORDER_RECORD_NOT_START 4104 录音错误 没有启动录音操作 检查是否已经调用启动录音接口。
QAVPTTERROR_UPLOAD_FILE_ACCESSERROR 8193 上传错误 上传文件时,文件访问错误 确保文件存在,文件路径的合法性。
QAVPTTERROR_UPLOAD_SIGN_CHECK_FAIL 8194 上传错误 签名校验失败错误 检查鉴权密钥是否正确,检查是否有初始化离线语音。
QAVPTTERROR_UPLOAD_COS_INTERNAL_FAIL 8195 上传错误 网络错误 检查设备网络是否可以正常访问外网环境,参考 如何检查网络。
QAVPTTERROR_UPLOAD_GET_TOKEN_NETWORK_FAIL 8196 上传错误 获取上传参数过程中网络失败 检查鉴权是否正确,检查设备网络是否可以正常访问外网环境,参考 如何检查网络。
QAVPTTERROR_UPLOAD_SYSTEM_INNER_ERROR 8197 上传错误 获取上传参数过程中回包数据为空 检查鉴权是否正确,检查设备网络是否可以正常访问外网环境,参考 如何检查网络。
QAVPTTERROR_UPLOAD_RSP_DATA_DECODE_FAIL 8198 上传错误 获取上传参数过程中回包解包失败 检查鉴权是否正确,检查设备网络是否可以正常访问外网环境,参考 如何检查网络。
QAVPTTERROR_UPLOAD_APPINFO_UNSET 8200 上传错误 没有设置 appinfo 检查 apply 接口是否有调用,或者入参是否为空。
QAVPTTERROR_DOWNLOAD_FILE_ACCESSERROR 12289 下载错误 下载文件时,文件访问错误 检查文件路径是否合法。
QAVPTTERROR_DOWNLOAD_SIGN_CHECK_FAIL 12290 下载错误 签名校验失败 检查鉴权密钥是否正确,检查是否有初始化离线语音。
QAVPTTERROR_DOWNLOAD_COS_INTERNAL_FAIL 12291 下载错误 网络错误 服务器获取语音文件失败,检查接口参数 fileid 是否正确,检查网络是否正常。
QAVPTTERROR_DOWNLOAD_REMOTEFILE_ACCESSERROR 12292 下载错误 服务器文件系统错误 检查设备网络是否可以正常访问外网环境,检查服务器上是否有此文件。
QAVPTTERROR_DOWNLOAD_GET_SIGN_NETWORK_FAIL 12293 下载错误 获取下载参数过程中,HTTP 网络失败 检查设备网络是否可以正常访问外网环境,参考 如何检查网络。
QAVPTTERROR_DOWNLOAD_SYSTEM_INNER_ERROR 12294 下载错误 获取下载参数过程中,回包数据为空 检查设备网络是否可以正常访问外网环境,参考 如何检查网络。
QAVPTTERROR_DOWNLOAD_GET_SIGN_RSP_DATA_DECODE_FAIL 12295 下载错误 获取下载参数过程中,回包解包失败 检查设备网络是否可以正常访问外网环境,参考 如何检查网络。
QAVPTTERROR_DOWNLOAD_APPINFO_UNSET 12297 下载错误 没有设置 appinfo 检查鉴权密钥是否正确,检查是否有初始化离线语音。
QAVPTTERROR_PLAYER_INIT_ERR 20481 播放错误 初始化错误 检查设备是否被占用,或者权限是否正常,是否初始化正常。
QAVPTTERROR_PLAYER_PLAYING_ERR 20482 播放错误 正在播放中,试图打断并播放下一个失败了(正常是可以打断的) 检查代码逻辑是否正确。
QAVPTTERROR_PLAYER_PARAM_NULL 20483 播放错误 参数为空 检查代码中接口参数是否正确。
QAVPTTERROR_PLAYER_OPENFILE_ERR 20484 播放错误 播放时,文件访问错误 确保文件存在,文件路径的合法性。
QAVPTTERROR_PLAYER_PLAYER_NOT_START_ERR 20485 播放错误 播放未开始 确保文件存在,文件路径的合法性。
QAVPTTERROR_S2T_INTERNAL_ERROR 32769 语音转文字错误 内部错误 出现此情况请联系腾讯云工作人员,并参照 下载及使用问题 提供日志文件。
QAVPTTERROR_S2T_NETWORK_FAIL 32770 语音转文字错误 网络失败 检查设备网络是否可以正常访问外网环境,参考 如何检查网络。
QAVPTTERROR_S2T_RSP_DATA_DECODE_FAIL 32772 语音转文字错误 回包解包失败 出现此情况请联系腾讯云工作人员,并参照 下载及使用问题 提供日志文件。
QAVPTTERROR_S2T_APPINFO_UNSET 32774 语音转文字错误 没有设置 appinfo 检查鉴权密钥是否正确,检查是否有初始化离线语音。
QAVPTTERROR_STREAMIN_RECORD_SUC_REC_FAIL 32775 流式语音转文本错误 流式语音转文本失败,但是录音成功了 检查网络是否正确连接,检查权限密钥是否正确。
QAVPTTERROR_S2T_SIGN_CHECK_FAIL 32776 authbuffer 校验失败 authbuffer 校验失败 检查 authbuffer 是否正确。
QAVPTTERROR_STREAMIN_UPLOADANDRECORD_SUC_REC_FAIL 32777 流式语音转文本错误 流式语音转文本失败,但是录音成功了,上传也成功了。 检查代码是否有错误。
QAVPTTERROR_S2T_PARAM_NULL 32784 语音转文字错误 语音转文本参数错误 检查代码中接口参数 fileid 是否为空。
QAVPTTERROR_S2T_AUTO_SPEECH_REC_ERROR 32785 语音转文字错误 语音转文本翻译返回错误 出现此情况请联系腾讯云工作人员,并参照 下载及使用问题 提供日志文件。
QAVPTTERROR_ERR_VOICE_STREAMIN_RUNING_ERROR 32786 流式语音转文本错误 流式语音转文本失败 在流式录制状态当中,请等待流式录制接口执行结果返回。
QAVPTTERROR_ERR_VOICE_STREAMING_ASR_ERROR 50012 流式语音转文本错误 请求 ASR 错误 重新上传录制文件(UploadRecordedFile),然后调用转文本接口(SpeechToText)。出现此情况请联系腾讯云工作人员,并参照 下载及使用问题 提供日志文件。

房间管理返回值信息

返回值 含义
0 成功操作。
1001 < 重复操作。已经在进行某种操作,再次去做同样的操作,则返回这个错误。
1002 < 互斥操作。已经在进行某种操作,再次去做同类型的其他操作,则返回这个错误。
1003 < 已经处于所要状态,无需再操作。如设备已经打开,再次去打开,就返回这个错误码。
1004 错误参数。
1005 操作超时。
1006 功能未实现。
1007 不在主线程中执行操作
1101 AVContext没有启动。
1201 房间不存在。
1301 设备不存在。
10001 服务器返回一般错误。
10003 没有权限。
10004 进房间获取房间地址失败。
10005 进房间连接房间失败。
10006 免流情况下,免流签名校验失败,导致进房获取房间地址失败。
10007 游戏应用房间超过90分钟,强制下线。
6999 IMSDK失败。
7000 IMSDK超时。
7001 QAV_ERR_HTTP_REQ_FAIL。
7002 3d voice model file is damaged.。
7003 should call InitSpatializer first。
65536 无效值。
7004 QAV_ERR_NET_REQUEST_FALLED。
7005 QAV_ERR_CHARGE_OVERDUE。
7006 QAV_ERR_AUTH_FIALD。
7007 QAV_ERR_IN_OTHER_ROOM。
7008 QAV_ERR_DISSOLVED_OVERUSER。
7009 QAV_ERR_NO_PERMISSION。
7010 QAV_ERR_FILE_CANNOT_ACCESS。
7011 QAV_ERR_FILE_DAMAGED。
7012 QAV_ERR_SERVICE_NOT_OPENED。
7013 QAV_ERR_USER_CANCELED。
7014 QAV_ERR_LOAD_LIB_FAILED。
7015 升级SDK的时候没有升级所有的文件,导致某些模块不匹配@name 实时语音伴奏相关错误。
7016 QAV_ERR_ROOMMANAGER_TIMESTAMP_CHECK_FAIL。
7017 QAV_ERR_ASR_CONNECT_CLOSED。
7018 iOS静音开关检测错误。
4051 打开文件失败。
4052 不支持的文件格式。
4053 解码失败。
4054 参数错误。
4055 内存分配失败。
4056 创建线程失败。
4057 状态非法。