Video SDK for Cocos2d Lua 快速接入

适用范围

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

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、ARM-v7a、 ARM64-v8a和X86四种CPU架构下的libyoume_voice_engine.so文件,还包括youme_voice_engine.jar。iOS平台下包含libyoume_voice_engine.a,libffmpeg3.3.a, libYouMeCommon.a文件。
  3. LuaYTalk.h, LuaYTalk.cpp,Lua语言的封装文件。
  • lua相关SDK 此SDK是在引擎SDK基础上封装的为cocos-lua使用的SDK,包括一部分c++文件和lua文件。
    1. Classes:对应cocos-lua里的frameworks\runtime-src\Classes目录,包括一些封装过的c++文件以及c++转lua的文件。
    2. src:对应cocos-lua里的src目录,里面的YoumeSDK.lua就是提供给游戏使用的lua文件。

开发环境集成

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

  • lua SDK集成 把lua相关sdk的Classes目录放入cocos-lua项目的frameworks\runtime-src\Classes目录,将src目录放入cocos-lua项目的src目录,并加入项目。

  • lua注册 修改cocos-lua原有项目中的frameworks\runtime-src\Classes\AppDelegate.cpp文件:
    1. 增加:#include "lb/lb_youmetalk.hpp"
    2. AppDelegate::applicationDidFinishLaunching()方法内加上: register_all_youmetalk(stack->getLuaState();

Android系统开发环境配置

  1. 修改proj.android/jni/Android.mk文件,对应位置增加指定内容,分别对游密实时语音SDK的动态库进行预编译处理、添加头文件路径、链接动态库。
    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/LuaYTalk.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文件, 则不用修改。
  #======修改===========
  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
  1. 复制youme_voice_engine/lib/android/youme_voice_engine.jar到proj.android/libs/ youme_voice_engine.jar。

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

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <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" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
  3. 打开eclipse,导入上一步Android工程,在项目的第一个启动的AppActivity(找到AppActivity.java文件)中导入package:
import  com.youme.voiceengine.mgr.YouMeManager;
import  com.youme.voiceengine.*;

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

 @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需要填入的位置,然后路径会自动生成)。
  2. 添加库文件路径:在Build Settings -> Search Paths -> Library Search Paths中添加../../../youme_voice_engine/lib/ios/Release-universal (建议直接将此Release-universal文件夹拖到xcode需要填入的位置,然后路径会自动生成)。
  3. 添加依赖库:在Build Phases -> Link Binary With Libraries下添加:
    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

初始化

  • 语法
YouMeErrorCode init(
const char* strAppKey,
const char* strAPPSecret,
YOUME_RTC_SERVER_REGION serverRegionId,
const char* strExtServerRegionName);
  • 功能
    初始化语音引擎,做APP验证和资源初始化。

  • 参数说明
    strAPPKey:从游密申请到的 app key, 这个你们应用程序的唯一标识。
    strAPPSecret:对应 strAPPKey 的私钥, 这个需要妥善保存,不要暴露给其他人。
    serverRegionId:设置首选连接服务器的区域码,如果在初始化时不能确定区域,可以填RTC_DEFAULT_SERVER,后面确定时通过 SetServerRegion 设置。如果YOUME_RTC_SERVER_REGION定义的区域码不能满足要求,可以把这个参数设为 RTC_EXT_SERVER,然后通过后面的参数strExtServerRegionName 设置一个自定的区域值(如中国用 "cn" 或者 “ch"表示),然后把这个自定义的区域值同步给游密,我们将通过后台配置映射到最佳区域的服务器。
    strExtServerRegionName:自定义的扩展的服务器区域名。不能为null,可为空字符串“”。只有前一个参数serverRegionId设为RTC_EXT_SERVER时,此参数才有效(否则都将当空字符串“”处理)。

  • 返回值
    返回YOUME_SUCCESS才会有异步回调通知。其它返回值请参考YouMeErrorCode类型定义

  • 异步回调
//涉及到的主要回调事件有:
// YOUME_EVENT_INIT_OK  - 表明初始化成功
// YOUME_EVENT_INIT_FAILED - 表明初始化失败,最常见的失败原因是网络错误或者 AppKey-AppSecret 错误
void  onEvent (const char* strParam);

加入语音频道(单频道)

  • 语法
YouMeErrorCode joinChannelSingleMode (const char* strUserID, const char* strChannelID, int userRole);
  • 功能
    加入语音频道(单频道模式,每个时刻只能在一个语音频道里面)。

  • 参数说明
    strUserID:全局唯一的用户标识,全局指在当前应用程序的范围内。
    strChannelID:全局唯一的频道标识,全局指在当前应用程序的范围内。
    userRole:用户在语音频道里面的角色,见YouMeUserRole定义。

  • 返回值
    返回YOUME_SUCCESS才会有异步回调通知。其它返回值请参考YouMeErrorCode类型定义

  • 异步回调
//涉及到的主要回调事件有:
//YOUME_EVENT_JOIN_OK - 成功进入语音频道
//YOUME_EVENT_JOIN_FAILED - 进入语音频道失败,可能原因是网络或服务器有问题
void  onEvent (const char* strParam);

创建视频渲染

具体用法参见demo。

  • 语法
int createRender(const char * userId);
  • 功能
    根据用户ID创建渲染ID。

  • 参数说明
    userId:用户ID。

  • 返回值
    大于等于0时,为渲染ID;小于0则为错误码,具体的错误码请参考YouMeErrorCode类型定义

开始捕获本机摄像头数据

  • 语法
YouMeErrorCode startCapture();
  • 功能
    捕获本机摄像头数据,以便发送给房间内其他人。

  • 返回值
    如果成功则返回YOUME_SUCCESS,其它具体参见YouMeErrorCode类型定义