Video SDK for Unity3D 快速接入

适用范围

本文档适用于游密实时音视频引擎(Video SDK)Unity3D平台下接入,API接口说明部分同样适用于其他平台,可互相参考。

SDK目录概述

YMRTC SDK提供了以下文件:

  • Plugins库文件,分为Android平台和iOS平台。

    AndroidManifest.xml:可用来配置安卓下SDK所需要的权限、服务等。 Plugins/Android: Android平台使用的动态库,包括ARMv5、ARMv7和 X86 三种 CPU 架 构下的libyoume_voice_engine.so文件,还包括youme_voice_engine.jar。 Plugins/iOS:iOS平台使用的静态库,包含libyoume_voice_engine.a文件。

  • YouMeVoiceEngine文件夹,内含封装SDK的C#接口文件。

    YouMeVoiceAPI.cs:封装了Video SDK 的全部功能接口。 YouMeConstDefine.cs:包含Video SDK 错误码等枚举类型定义。

开发环境集成

从Unity3D开发环境集成

  • 双击 unitypackage包;
  • 在弹出的Import Unity Package对话框中,所有的复选框打勾(如下图所示),但要格外注意AndroidManifest.xml可能与工程已有或将有的同名文件直接覆盖,应先比对合并;

1.png

  • 为应用选择要支持的CPU架构: 在Unity3D的Project View中选中Assets/Plugins/Android/libs下特定的CPU架构,比如armeabi-v7a,勾选右侧的Inspector View中的Select platforms for plugin下的Android右侧的复选框,此处注意armeabi和armeabi-v7a两种ARM架构的库文件,只能勾选其中一种架构,否则会出现库文件冲突的错误

2.png

导出Android工程

  • File->Build Settings…Platform列表中选择Android,酌情点击Switch Platform按钮,然后勾选右侧Google Android Project
  • 点击Build Settings->Export,选择输出的Android工程路径,导出Android工程; 3.gif

导出iOS工程

  • File->Build Settings…的Platform列表中选择iOS,酌情点击Switch Platform按钮;
  • 点击Build Settings->Build,选择输出iOS工程的路径,输入工程名字,导出iOS工程;
  • 在Xcode中打开上一步输出的iOS工程,在工程配置中Build Phases->Link Binary With Libraries下拉菜单中添加添加这几个框架文件:libsqlite3.0.tbdlibz.1.2.5.tbdlibresolv.9.tbdCoreTelephony.framework,VideoToolbox.framework,AudioToolbox.framework
  • ,AVKit.framework,CoreVideo.framework,CoreFoundation.framework
  • ,AVFoundation.framework,SystemConfiguration.framework,CFNetwork.framework
  • ,GLKit.framework
  • 为iOS10以上版本添加录音权限配置 iOS10系统使用录音权限,需要在target的info.plist中新加NSMicrophoneUsageDescription键,值为字符串(授权弹窗出现时提示给用户)。首次录音时会向用户申请权限。配置方式如下: iOS10录音权限配置

API调用说明

接口对象实例需要通过调用YouMe.YouMeVoiceAPI.GetInstance ()来获取,接口使用的基本流程为初始化->收到初始化成功回调通知->加入频道->收到加入频道成功回调通知->使用其它接口->离开频道->反初始化,要确保严格按照上述的顺序使用接口。

设置回调

  • 语法
void SetCallback(string strObjName);
  • 功能 设置接收回调消息的对象名。这个函数必须最先调用,这样才能收到后面所有调用的回调消息。

  • 参数说明 strObjName:string类型,注册的GameObject的名字。

  • 返回值 无。

实现回调函数

上面注册好回调的GameObject类还需实现以下方法:

通用回调:

void OnEvent (string strParam);
  • 代码示例

    //以下代码仅供参考
    void OnEvent (string strParam)
    {
        string[] strSections = strParam.Split (new char[] { ',' });
        if (strSections == null){

            return;
        }

        YouMe.YouMeEvent eventType = (YouMeEvent)int.Parse (strSections [0]);
        YouMe.YouMeErrorCode errorCode = (YouMeErrorCode)int.Parse (strSections [1]);
        string channelID =  strSections [2];
        string userID =  strSections [3];

        switch (eventType) {
        //对eventType的case列举请查询枚举类型YouMeEvent的定义,以下只是部分列举
        //使用者请按需自行添加或删除
        case YouMe.YouMeEvent.YOUME_EVENT_INIT_OK:
            //"初始化成功";
            break;
        case YouMe.YouMeEvent.YOUME_EVENT_INIT_FAILED:
          //"初始化失败,错误码:" + errorCode;
            break;
        case YouMe.YouMeEvent.YOUME_EVENT_JOIN_OK:
            //加入频道成功
            break;
        case YouMe.YouMeEvent.YOUME_EVENT_LEAVED_ALL:
           //"离开所有频道成功";
            break;
        case YouMe.YouMeEvent.YOUME_EVENT_JOIN_FAILED:
            //进入语音频道失败
            break;
        case YouMe.YouMeEvent.YOUME_EVENT_REC_PERMISSION_STATUS:
            //"通知录音权限状态,成功获取权限时错误码为YOUME_SUCCESS,获取失败为YOUME_ERROR_REC_NO_PERMISSION(此时不管麦克风mute状态如何,都没有声音输出)";
            break;
        case YouMe.YouMeEvent.YOUME_EVENT_RECONNECTING:
            //"断网了,正在重连";
            break;
        case YouMe.YouMeEvent.YOUME_EVENT_RECONNECTED:
            //"断网重连成功";
            break;
        case YouMe.YouMeEvent.YOUME_EVENT_MEMBER_CHANGE:
            //房间内成员列表变化,param参数是包含自己的所有用户列表
            List<string> members = new List<string>(12);
               for(int index = 2 ; index < strSections.Length ;index++){
                   //会议内的用户,包括自己
                   members.Add(strSections[index]);
               }
            break;
        case  YouMe.YouMeEvent.YOUME_EVENT_OTHERS_MIC_OFF:
            //其他用户的麦克风关闭:param是关闭用户的userid
            break;
        case YouMe.YouMeEvent.YOUME_EVENT_OTHERS_MIC_ON:
            //其他用户的麦克风打开
            break;
        case YouMe.YouMeEvent.YOUME_EVENT_OTHERS_SPEAKER_ON:
            //其他用户的扬声器打开
            break;
        case YouMe.YouMeEvent.YOUME_EVENT_OTHERS_SPEAKER_OFF:
            //其他用户的扬声器关闭
            break;
        case YouMe.YouMeEvent.YOUME_EVENT_OTHERS_VOICE_ON:
            //其他用户开始讲话
            break;
        case YouMe.YouMeEvent.YOUME_EVENT_OTHERS_VOICE_OFF:
            //其他用户结束讲话
            break;
        case YOUME_EVENT_MY_MIC_LEVEL:
            //麦克风的语音级别
            break;
        case YOUME_EVENT_MIC_CTR_ON:
            //麦克风被其他用户打开
            break;
        case YOUME_EVENT_MIC_CTR_OFF:
            //麦克风被其他用户关闭
            break;
        case YOUME_EVENT_SPEAKER_CTR_ON:
            //扬声器被其他用户打开
            break;
        case YOUME_EVENT_SPEAKER_CTR_OFF:
            //扬声器被其他用户关闭
            break;
        case YOUME_EVENT_LISTEN_OTHER_ON:
            //取消屏蔽某人语音
            break;
        case YOUME_EVENT_LISTEN_OTHER_OFF:
            //屏蔽某人语音
            break;
        //=====================视频相关=========================
        case YOUME_EVENT_OTHERS_VIDEO_ON:
              //收到其他用户的视频流通知,可以开始渲染这个用户的视频流
              //VideoJoin(userid);
              break;
        case YouMe.YouMeEvent.YOUME_EVENT_OTHERS_CAMERA_PAUSE:
            //userid 关闭了摄像头
            break;
        case YouMe.YouMeEvent.YOUME_EVENT_OTHERS_CAMERA_RESUME:
            //userid 打开了摄像头
            break;
        case YouMe.YouMeEvent.YOUME_EVENT_OTHERS_VIDEO_SHUT_DOWN://视频断开事件
            {
                // 这个事件在暂停后、临时断网也会通知,不适合做用户下线通知
                // RemoveUserVideoRender(param);
            }
            break;
        default:
            // "事件类型" + eventType + ",错误码" + errorCode;
            break;
        }

    }

RestApi回调:

void OnRequestRestApi (string strParam);

strParam:json串,包含: requestid:整数类型,回传ID error:错误码 query:回传查询命令,json串(包含command和query字段) result:查询结果,详情见RequestRestApi接口说明文档

获取成员列表及成员变更回调:

void OnMemberChange (string strParam);

strParam:json串,包含: channelid:字符串,频道ID memchange:数字类型,成员列表,或者变更列表。(userid 字符串,用户ID ; isJoin, bool类型,false为离开)

初始化

  • 语法
YouMeErrorCode Init(
string strAppKey,
string strAPPSecret,
YOUME_RTC_SERVER_REGION serverRegionId,
string 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才会有异步回调通知。其它返回值请参考YouNeErrorCode类型定义

  • 异步回调

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

加入语音频道(单频道)

  • 语法

    YouMeErrorCode JoinChannelSingleMode (string strUserID, string strChannelID, YouMeUserRole userRole);
  • 功能 加入语音频道(单频道模式,每个时刻只能在一个语音频道里面)。

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

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

  • 异步回调

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

渲染视频数据

示例:

``` c#
// 开启摄像头
YouMe.YouMeVoiceAPI.GetInstance().StartCapture();
// 根据用户id获取渲染id
int videoRenderID = YouMeTexture.GetInstance ().CreateTexture (selfUserID, gameObject.name);
// 更新视频,目前约15帧每秒
YouMeTexture.GetInstance().SetVideoRenderUpdateCallback(videoRenderID,(Texture2D videoTexture)=>{
    // 把 videoTexture 这个Texture2D对象显示到游戏里即可
});
```

具体方法参见demo

创建渲染

  • 语法
    YouMeErrorCode CreateRender(string userId);
  • 功能 创建渲染

  • 参数说明 userId:用户id

  • 返回值 大于等于0 - renderId 小于0 - 具体错误码

开始摄像头采集

  • 语法
    YouMeErrorCode StartCapture();
  • 功能 开始camera capture

  • 参数说明

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