游密实时语音Talk SDK for HarmonyOS 使用指南
Talk SDK简介
1.功能目标
开发者在成功接入Talk SDK简介后,无需部署任何服务器即可拥有实时语音讲话能力。
2.SDK目录讲解
-
库
@youme/voice_engine包含了必须的接口和so库,请导入HarmonyOS工程。
3.关键类及描述
-
YouMeRtcAPI
引擎服务类,单例模式。该类提供SDK操作的相关方法,例如:初始化,加入房间,参数设置等。 -
YouMeRtcUserRole
用户通话角色。 -
YouMeRtcEvent
SDK事件类型 -
YouMeRtcErrorCode
错误码 -
YouMeRtcServerRegion
SDK语音服务地域。
Talk SDK操作指引
1.申请使用游密Talk SDK
- 首先请与游密商务联系,提供公司名称、游戏的名称、联系人电话、邮箱、 QQ等以申请IM引擎的使用权限。审批通过后会得到有效的AppKey和AppSecret,这些信息属于私密信息,请妥善保管。
2.配置依赖项
两种方法导入HAR包:
1. 手动导入
下载youme_voice_engine_3.0.15.har包,放到⼯程libs中。在⼯程中配置引⽤:
{
"dependencies": {
"@youme/voice_engine":"file:./libs/youme_voice_engine_3.0.15.har"
}
}2. ohpm导入
在⼯程中配置:
{
"dependencies": {
"@youme/voice_engine":"3.0.15"
}
}运⾏命令:
ohpm install @youme/voice_engine3.权限配置
在模块的 module.json5 中 requestPermissions添加网络和麦克风权限,配置如下:
{
"requestPermissions": [
{ "name": "ohos.permission.INTERNET" },
{
"name": "ohos.permission.MICROPHONE",
"reason": "$string:mic_reason",
"usedScene": { "abilities": ["FormAbility"], "when": "inuse" }
}
]
}SDK接入示例
应用中使用ArkTs代码调用SDK ArkTs API
- SDK调用示例 - 设置SDK事件回调和成员列表变更回调:
import { YouMeRtcAPI } from '@youme/voice_engine';
let curDate = new Date();
YouMeRtcAPI.Instance().SetEventCallback(
(event, errCode, channel, param) => {
const ctx = getContext(this)
ctx.eventHub.emit("youme_event", event, errCode, channel, param)
}
);
this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【api】设置事件回调\n`
YouMeRtcAPI.Instance().SetMemberChangeCallback(
(channel, members, isUpdate) => {
const ctx = getContext(this)
ctx.eventHub.emit("youme_members", channel, members, isUpdate)
}
);
this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【api】设置成员列表回调\n`- SDK调用示例 - 初始化SDK:
import { YouMeRtcAPI } from '@youme/voice_engine';
const promise = new Promise<number>((resolve, reject) => {
let error = YouMeRtcAPI.Instance().Init(this.appCustom.appKey, this.appCustom.appSecret, this.selectedRegion, "");
if (error == 0) {
resolve(error);
} else {
reject(new Error("error call failed"));
}
});
promise
.then(result => {
hilog.info(logFlag, logTag, `call init sdk succ:${result} region:${this.selectedRegion}`);
})
.catch((e: Error) => {
hilog.error(logFlag, logTag, `call init sdk err:${e.message} zone:${this.selectedRegion}`);
});- SDK调用示例 - 监听SDK事件:
import { YouMeRtcErrorCode, YouMeRtcEvent } from '@youme/voice_engine';
eventLister: Function = (event:YouMeRtcEvent, err:YouMeRtcErrorCode, channel:string, param:string) => {
let curDate = new Date();
switch (event){
case YouMeRtcEvent.YOUME_EVENT_LOCAL_MIC_ON:
case YouMeRtcEvent.YOUME_EVENT_LOCAL_MIC_OFF:
case YouMeRtcEvent.YOUME_EVENT_LOCAL_SPEAKER_ON:
case YouMeRtcEvent.YOUME_EVENT_LOCAL_SPEAKER_OFF:
case YouMeRtcEvent.YOUME_EVENT_SWITCH_OUTPUT:{
this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【event】${eventStrings[event]} 错误码:${err} 频道:${channel} 参数:${param}\n`
break;
}
case YouMeRtcEvent.YOUME_EVENT_MY_MIC_LEVEL:{
this.selfVolumeLevel = err
break;
}
case YouMeRtcEvent.YOUME_EVENT_FAREND_VOICE_LEVEL:{
this.farendVolumeLevel = err
this.farendUser = param
break;
}
case YouMeRtcEvent.YOUME_EVENT_OTHERS_VOICE_ON:{
this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【vad】${eventStrings[event]} 用户${param}开始说话\n`
break;
}
case YouMeRtcEvent.YOUME_EVENT_OTHERS_VOICE_OFF:{
this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【vad】${eventStrings[event]} 用户${param}停止说话\n`
break;
}
case YouMeRtcEvent.YOUME_EVENT_PAUSED: {
this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【vad】${eventStrings[event]} 通话暂停${err}\n`
break;
}
case YouMeRtcEvent.YOUME_EVENT_RESUMED: {
this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【vad】${eventStrings[event]} 通话恢复${err}\n`
break;
}
case YouMeRtcEvent.YOUME_EVENT_OTHERS_MIC_ON: {
this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【event】${eventStrings[event]} 用户${param}麦克风开启\n`
break;
}
case YouMeRtcEvent.YOUME_EVENT_OTHERS_MIC_OFF: {
this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【event】${eventStrings[event]} 用户${param}麦克风关闭\n`
break;
}
case YouMeRtcEvent.YOUME_EVENT_OTHERS_SPEAKER_ON: {
this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【event】${eventStrings[event]} 用户${param}扬声器开启\n`
break;
}
case YouMeRtcEvent.YOUME_EVENT_OTHERS_SPEAKER_OFF: {
this.sdkEventInfo += `${curDate.toLocaleTimeString()} 【event】${eventStrings[event]} 用户${param}扬声器关闭\n`
break;
}
default:{
break;
}
}
}应用中使用C++代码调用SDK C++ API
- 调用SDK C++ API,需要先在Native C++代码的CMakeList.txt中配置依赖的SDK头文件和库文件路径,示例如下:
# the minimum version of CMake.
cmake_minimum_required(VERSION 3.5.0)
project(entry)
set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
if(DEFINED PACKAGE_FIND_FILE)
include(${PACKAGE_FIND_FILE})
endif()
include_directories(${NATIVERENDER_ROOT_PATH}
${NATIVERENDER_ROOT_PATH}/include
${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules/@youme/voice_engine/include)
set(YOUME_LIB_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules/@youme/voice_engine/libs)
link_directories(${YOUME_LIB_PATH}/${CMAKE_OHOS_ARCH_ABI})
add_library(entry SHARED napi_init.cpp youme_native.cpp)
target_link_libraries(entry PUBLIC libyoume_voice_engine.so libace_napi.z.so libhilog_ndk.z.so)- 应用C++代码引入SDK头文件即可调用C++ API。
#include "IYouMeVoiceEngine.h"
#include "IYouMeEventCallback.h"
#include "YouMeConstDefine.h"
// 定义SDK回调监听类
class YouMeCallback:
public IYouMeEventCallback,
public
public IYouMeMemberChangeCallback,
public IYouMeAVStatisticNewCallback,
public IYouMeChannelMsgCallback,
public IYouMePcmCallback,
public IYouMeDetectNetworkCallback
{
public:
void onEvent(const YouMeEvent event, const YouMeErrorCode error, const char * channel, const char * param);
void onRequestRestAPI(int requestID, const YouMeErrorCode &iErrorCode, const char* strQuery, const char* strResult);
void onDetectNetWorkCompleteCb(bool bNetworkOK, const char* strResult);
void onAVStatisticNew(YouMeAVStatisticType type, const char* userID, int value, const char* param);
void onMemberChange(const char* channel, const char* listMemberChange, bool bUpdate);
void onBroadcast(const YouMeBroadcast bc, const char* channel, const char* param1, const char* param2, const char* strContent);
void onPcmDataRemote(int channelNum, int samplingRateHz, int bytesPerSample, void* data, int dataSizeInByte);
void onPcmDataRecord(int channelNum, int samplingRateHz, int bytesPerSample, void* data, int dataSizeInByte);
void onPcmDataMix(int channelNum, int samplingRateHz, int bytesPerSample, void* data, int dataSizeInByte);
};
// 设置回调
YouMeCallback* inst = new YouMeCallback();
// 不使用 REST 回调;按功能注册下列回调。
IYouMeVoiceEngine::getInstance()->setMemberChangeCallback(inst);
IYouMeVoiceEngine::getInstance()->setNotifyCallback(inst);
IYouMeVoiceEngine::getInstance()->setDetectNetworkCallback(inst);
IYouMeVoiceEngine::getInstance()->setAVStatisticNewCallback(inst);
// 初始化SDK
YouMeErrorCode ec = IYouMeVoiceEngine::getInstance()->init(inst, appKey, appSecret, (YOUME_RTC_SERVER_REGION)serverRegion, extServerRegion);回调与通话流程
初始化前使用 SetEventCallback 注册通用事件函数,成员、网络检测和统计使用各自的注册接口。ArkTS 回调回到注册时的 JS 执行环境;C++ 回调遵循原生线程约定。
接入顺序:注册/提供回调对象 → 初始化 → 等待初始化成功 → 加入频道 → 等待进房成功 → 设置麦克风和扬声器 → 请求离房并等待完成 → 反初始化。异步接口返回成功表示请求已受理,最终结果按回调处理;同步查询按实际返回类型读取。
各接口的语法、功能、参数、返回值和异步回调见 API 手册。
