文档导航 Cocos Js
本页目录

Talk SDK for Cocos2d Js 使用指南

适用范围

本规范仅适用于使用游密实时语音引擎Cocos2d-js接口开发多人实时语音功能的开发者。

SDK目录概述

语音SDK中有两个子文件夹:lib、include,下面依次介绍下这两个子文件夹。

  1. include:SDK的头文件。 详细介绍下inlude,所有接口都在这个文件夹中。
    • IYouMeVoiceEngine.h封装了语音SDK的全部功能接口,集成方可通过IYouMeVoiceEngine::getInstance ()->…来调用语音SDK接口。
    • IYouMeEventCallback.h包含语音SDK的所有回调事件接口,例如初始化结果,频道加入成功等,都将通过此接口通知集成方。
    • YouMeConstDefine.h包含语音SDK的所有枚举类型定义,如错误码等。
  2. lib:库文件,分为Android平台和iOS平台。Android平台下包括ARMv5、ARMv7和X86三种CPU架构下的libyoume_voice_engine.so文件,还包括youme_voice_engine.jar。iOS平台下包含libyoume_voice_engine.a文件。
  3. jsb_youmetalk.h, jsb_youmetalk.cpp,JS语言的封装文件。

开发环境集成

Cocos2d-js开发环境生成的目录结构如下图所示,将SDK目录更名为youme_voice_engine(内含“include”和“lib”两个子文件夹),并复制到游戏的根目录下,这个目录下包含了Android和iOS两个平台所需的所有C++头文件和库文件。

把jsb_youmetalk.h, jsb_youmetalk.cpp 放入Classes目录,并加入项目。

Android开发环境配置

  1. 修改proj.android/jni/Android.mk文件,对应位置增加指定内容,分别对游密实时语音SDK的动态库进行预编译处理、添加头文件路径、链接动态库。
MAKE
  

  LOCAL_PATH := $(call my-dir)
  include $(CLEAR_VARS)
  $(call import-add-path,$(LOCAL_PATH)/../../cocos2d)
  $(call import-add-path,$(LOCAL_PATH)/../../cocos2d/external)
  $(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos)

  #======Youme 添加=========
  LOCAL_MODULE := youme_voice_engine
  LOCAL_SRC_FILES := ../$(LOCAL_PATH)/../../../../youme_voice_engine/lib/android/$(TARGET_ARCH_ABI)/libyoume_voice_engine.so
  include $(PREBUILT_SHARED_LIBRARY)
  #======结束 Youme 添加=======

  LOCAL_MODULE := cocos2dcpp_shared
  LOCAL_MODULE_FILENAME := libcocos2dcpp
  LOCAL_SRC_FILES := hellocpp/main.cpp \
                     ../../Classes/Helloworld.cpp \
  #========Youme修改,不要拷贝这一行=========
                     ../../Classes/jsb_youmetalk.cpp
  #======结束 Youme 修改=======

  #========Youme修改=========
  LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
                      $(LOCAL_PATH)/../../../../youme_voice_engine/include
  #======结束 Youme 修改=======

  # _COCOS_HEADER_ANDROID_BEGIN
  # _COCOS_HEADER_ANDROID_END
  LOCAL_STATIC_LIBRARIES := cocos2dx_static

  #======Youme 添加=========
  LOCAL_SHARED_LIBRARIES := youme_voice_engine
  #======结束 Youme 添加=======

  # _COCOS_LIB_ANDROID_BEGIN
  # _COCOS_LIB_ANDROID_END
  include $(BUILD_SHARED_LIBRARY)
  $(call import-module,.)
  # _COCOS_LIB_IMPORT_ANDROID_BEGIN
  # _COCOS_LIB_IMPORT_ANDROID_END
  1. 如果需要显示指定CPU架构则修改proj.android/jni/Application.mk文件,增加指定部分的内容(v5版本为APP_ABI := armeabi);如果不需要指定CPU架构Application.mk文件, 则不用修改。

    SHELL
     #======修改===========
     APP_ABI := armeabi-v7a
     #======结束修改=========
    
       APP_STL := gnustl_static
       APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -std=c++11 -fsigned-char
       APP_LDFLAGS := -latomic
       ifeq ($(NDK_DEBUG),1)
        APP_CPPFLAGS += -DCOCOS2D_DEBUG=1
        APP_OPTIM := debug
       else
        APP_CPPFLAGS += -DNDEBUG
        APP_OPTIM := release
       endif
     
  2. 复制youme_voice_engine/lib/android/youme_voice_engine.jar到proj.android/libs/ youme_voice_engine.jar。

  3. 修改proj.android/AndroidManifest.xml文件,确保声明了如下的权限:

XML
    <!-- 允许程序访问互联网 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 允许程序获取 Wi-Fi 状态信息(Wi-Fi 是否启用) -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 允许程序获取网络信息状态(是否连接到网络) -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 允许程序写入外部存储(存储 SDK 日志文件) -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 允许程序通过手机或耳机的麦克录制声音 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <!-- 允许程序修改声音设置信息,比如:修改通话音量、扬声器/听筒切换 -->
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <!-- 允许程序连接到蓝牙设备配对,Android 11 (API 30) 及以下 -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <!-- 允许程序连接到蓝牙设备配对,Android 12 (API 31) 及以上 -->
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
  1. 打开eclipse,导入上一步Android工程,在项目的第一个启动的AppActivity(找到AppActivity.java文件)中导入package:

    JAVA
    import  com.youme.voiceengine.mgr.YouMeManager;
    import  com.youme.voiceengine.*;

    然后在onCreate方法里添加如下代码(没有此方法的话需要自己补上):

    JAVA
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        //以下两个函数调用顺序不能错
        YouMeManager.Init(this);
        super.onCreate(savedInstanceState);
    
    }

iOS系统XCode开发环境配置

添加头文件和依赖库:

  1. 添加头文件路径:在Build Settings -> Search Paths -> Header Search Paths中添加: ../../../youme_voice_engine/include (建议直接将此include文件夹拖到xcode需要填入的位置,然后路径会自动生成)
    ../../cocos2d-x/cocos/scripting/js-bindings/manual。

  2. 添加库文件路径:在Build Settings -> Search Paths -> Library Search Paths中添加../../../youme_voice_engine/lib/ios (建议直接将此ios文件夹拖到xcode需要填入的位置,然后路径会自动生成)。

  3. 把jsb_youmetalk.h,js_youmetalk.cpp加入项目。

  4. 添加依赖库:在Build Phases -> Link Binary With Libraries下添加:
    libc++.tbd
    libsqlite3.0.tbd
    libyoume_voice_engine.a
    libz.dylib
    libz.1.2.5.tbd
    libresolv.9.tbd
    SystemConfiguration.framework
    CoreTelephony.framework
    AVFoundation.framework
    AudioToolBox.framework
    CFNetwork.framework

接口注册

  • 引入C++接口文件 #include "jsb_youmetalk.h"。

  • 注册js方法:在AppDelegate::applicationDidFinishLaunching() 中,添加注册函数。

    C++
    
    //添加这句
    sc->addRegisterCallback(register_jsb_youmetalk);
    ///添加结束
    sc->start();
    

API接口调用流程

API调用的基本流程如下图所示,具体接口说明参见API接口手册。

接口调用基本流程

实现回调(参考api手册里面的实现回调)-> 初始化(talk_Init)->收到初始化成功回调通知 0(0表示sdk初始化成功)->加入语音单频道(talk_JoinChannel)->收到加入频道成功回调通知 2(2表示进入语音频道成功)->打开麦克风(talk_SetMicrophoneMute(false))->收到麦克风已打开回调通知 29(29表示自己麦克风被打开)->打开扬声器(talk_SetSpeakerMute(false))->收到扬声器已打开回调通知 31(31表示自己扬声器被打开) ->设置扬声器音量增益(talk_SetVolume(70)(该音量建议70))-> (到了前面一步已经可以和当前进入同一频道的人进行实时通话了)->使用其他接口 ->结束

以上回调事件通知状态码更多详细请查看对应的状态码。

单频道自由通话基本流程

先注册回调,初始化返回成功后等待初始化成功事件,再加入频道;收到进房成功后设置麦克风、扬声器及音量增益。同步返回失败或收到失败事件时停止后续步骤。退出时先离房,等待完成后反初始化。

下面的示例代码演示单频道自由通话。替换 AppKey、AppSecret、用户和频道 ID,并完成本平台 SDK 导入及权限配置;回调对象应保持存活。

JavaScript
var talk = new YouMeTalk();
talk.OnEvent = function(event, err, channel, param) {
    if (event === 0) {
        var ret = talk.talk_JoinChannel("user1", "team1", 1, true, false);
        if (ret !== 0) cc.log("进房请求失败", ret);
    } else if (event === 2) {
        talk.talk_SetMicrophoneMute(false);
        talk.talk_SetSpeakerMute(false);
        talk.talk_SetVolume(70);
    } else if (event === 1 || event === 3) {
        cc.log("初始化或进房失败", err);
    }
};
talk.OnMemberChange = function(channel, members, update) {};
talk.OnBroadcast = function(bc, channel, param1, param2, content) {};
var ret = talk.talk_Init("YOUR_APP_KEY", "YOUR_APP_SECRET", 10001, "");
if (ret !== 0) cc.log("初始化请求失败", ret);
// 离开时 talk.talk_LeaveChannelAll(),等离房完成后 talk.talk_UnInit()。

回调与通话流程

在初始化前设置 YouMeTalk 对象的 OnEvent、OnMemberChange、OnBroadcast 等已封装回调属性;通用事件由 OnEvent 接收,经 Cocos 调度器回到游戏主线程。

接入顺序:注册/提供回调对象 → 初始化 → 等待初始化成功 → 加入频道 → 等待进房成功 → 设置麦克风和扬声器 → 请求离房并等待完成 → 反初始化。异步接口返回成功表示请求已受理,最终结果按回调处理;同步查询按实际返回类型读取。

各接口的语法、功能、参数、返回值和异步回调见 API 手册。