友情提示:最近发现腾讯GVoice有另一个官网,叫做腾讯游戏服务,经过对比发现这个网站才是最新的,下面我介绍的那个估计是已经废弃的,但不知道为啥老的网站没有直接链接到新网址而是仍然保留了。不过新官网的文档更加详细,SDK也有所更新,所以建议去新官网下载SDK和Demo,接入流程基本没有啥大变化。

简述

我们项目中用到了实时语音功能,在最初语音 SDK 技术选型的时候测试过融云、声网和腾讯的 GVoice 。融云和声网我都在我们项目中使用过,但是效果都不如王者荣耀游戏中的实时语音效果,这两天好好研究了一下腾讯的 GVoice,终于成功集成。由于腾讯 GVoice 官网的接入流程并不是很详细,如果只懂 不懂 基础知识的朋友,可能接入过程不会一帆风顺。我虽了解一点点 Android 基础,但仍趟过了好几个坑,下面我就分享一下我在 Android 平台接入 GVoice 的过程。

资源准备

进入腾讯GVoice官网下载 GVoice SDK 和 Unity3D Demo。如下图:

接入流程 1. 导入SDK

先创建一个空的 Unity 项目 GVoiceDemo,按照官网的接入流程,我们直接将下载的SDK压缩包解压后将其中的 Plugins 和 Scripts 两个文件夹都拷贝到 Unity 项目中。

2. 创建 Jar 包

将Unity项目导出成安卓项目,导出路径选择某个指定的文件夹,我这里在桌面新建了一个叫 unity_gvoicedemo 的文件夹,将项目导出到该文件夹中,操作如下图:

导出成功后会生成 GCloudVoice 和 GVoiceDemo 两个文件夹,用 eclipse 将这两个项目一起导入,如下图:

导入成功后,在 UnityPlayerActivity 项目下新建一个 MainActivity 类,继承自 UnityPlayerActivity,详细代码如下:

[C#] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
package com.shehweiwei.gvoicedemo;
import android.os.Bundle;
import com.tencent.gcloud.voice.GCloudVoiceEngine;
// 注意:下面这句代码必须有,如果没有可能会导致闪退
import com.unity3d.player.UnityPlayerActivity;
publicclass MainActivity extends UnityPlayerActivity
{
        protectedvoid onCreate(Bundle savedInstanceState)
        {
                super.onCreate(savedInstanceState);
                GCloudVoiceEngine.getInstance().init(getApplicationContext(),this);
        }
}

注意:代码中一定要引入com.unity3d.player.UnityPlayerActivity这个包,如果没有引入则进入应用就闪退,这里是个大坑,我好不容易才爬出来。
然后,选中 MainActivity.java 文件,右键选择 Export -> Java -> JAR file, 然后点击 Next 按钮, 接下来操作如下图:

最后,生成一个 GVoiceDemo.jar 文件。

3. 导入其他文件

将下载的 unity_demo.zip 压缩包解压后将其中的 unity_demo\Assets\Plugins\Android 目录下的 AndroidManifest.xml 和 android-support-v4.jar 两个文件拷贝到项目的 Plugins\Android 目录下。注意还有个GCloudVoiceDemo.jar 文件我们没有拷贝,这里我们使用上一步创建的 GVoiceDemo.jar 文件来替代。注意 jar 包中的包名必须与 AndroidManifest.xml 文件和 Unity 编辑器中PlayerSettings的 Bundle Identifier 包名保持一致。所以,要把 AndroidManifest.xml 文件中的 package="com.example.gcloudu3ddemo" 这一句代码修改成 package="com.shehweiwei.gvoicedemo"。
注意:AndroidManifest.xml 文件中的入口 Activity 的名字必须和创建的 Jar 包中的新建的 Activity 名字保持一致。这里的入口 Activity 叫 MainActivity,所以 AndroidManifest.xml 文件中的代码为android:name=".MainActivity",当然也可以写成 android:name="com.example.gcloudu3ddemo.MainActivity"

4. 构建Unity场景

这里我用uGUI搭建了一个简单的界面,有六个按钮分别调用 GVoice SDK 的六个 API ,然后一个 Text 用来显示回调结果。界面效果如下图:
然后新建一个 GVoiceDemo 的 C# 脚本,脚本代码如下:
[C#] 纯文本查看 复制代码
?
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
usingUnityEngine;
usinggcloud_voice;
usingUnityEngine.UI;
usingSystem;
publicclass GVoiceDemo : MonoBehaviour
{
    // 用来显示调用API返回的结果
    publicText result;
    privateIGCloudVoice m_voiceengine = null;
    // TODO: 这里的appId和appKey使用的是官方提供的测试值,正式项目中可使用申请的值
    privateconst string appId = "932849489";
    privateconst string appKey = "d94749efe9fce61333121de84123ef9b";
    // TODO: 这里使用的是测试账号,所以房间名使用默认的100,正式项目中可根据实际情况赋值
    privatestring roomName = "100";
    voidStart()
    {
        if(m_voiceengine == null)
        {
            m_voiceengine = GCloudVoice.GetEngine();
            TimeSpan ts = DateTime.UtcNow - newDateTime(1970, 1, 1, 0, 0, 0, 0);
            stringstrTime = System.Convert.ToInt64(ts.TotalSeconds).ToString();
            // TODO: 这里用时间模拟了一个openId,在正式项目中应该把这里的strTime换成用户唯一ID
            m_voiceengine.SetAppInfo(appId, appKey, strTime);
            m_voiceengine.Init();
            // 注册SDK常用回调监听
            m_voiceengine.OnJoinRoomComplete += OnJoinRoom;
            m_voiceengine.OnQuitRoomComplete += OnExitRoom;
            m_voiceengine.OnMemberVoice += OnMemberVoice;
        }
    }
    voidUpdate()
    {
        if(m_voiceengine != null)
        {
            // 不断检测GVoice引擎回调
            m_voiceengine.Poll();
        }
    }
    voidOnApplicationPause(boolpauseStatus)
    {
        if(m_voiceengine == null)
        {
            return;
        }
        // 应用暂停时GVoice引擎也暂停,应用重新开始时引擎继续
        if(pauseStatus)
        {
            m_voiceengine.Pause();
        }
        else
        {
            m_voiceengine.Resume();
        }
    }
    /// <summary>
    /// 加入房间,BtnJoin按钮点击调用
    /// </summary>
    publicvoid JoinRoom()
    {
        m_voiceengine.SetMode(GCloudVoiceMode.RealTime);
        intret = m_voiceengine.JoinTeamRoom(roomName, 15000);
        result.text += "\nJoinRoom:"+ ret;
    }
    /// <summary>
    /// 退出房间,BtnExit按钮点击调用
    /// </summary>
    publicvoid ExitRoom()
    {
        intret = m_voiceengine.QuitRoom(roomName, 6000);
        result.text += "\nExitRoom:"+ ret;
    }
    /// <summary>
    /// 打开麦克风,BtnOpenMic按钮点击调用
    /// </summary>
    publicvoid OpenMic()
    {
        intret = m_voiceengine.OpenMic();
        result.text += "\nOpenMic:"+ ret;
    }
    /// <summary>
    /// 关闭麦克风,BtnCloseMic按钮点击调用
    /// </summary>
    publicvoid CloseMic()
    {
        intret = m_voiceengine.CloseMic();
        result.text += "\nCloseMic:"+ ret;
    }
    /// <summary>
    /// 打开扬声器,BtnOpenSpeaker按钮点击调用
    /// </summary>
    publicvoid OpenSpeaker()
    {
        intret = m_voiceengine.OpenSpeaker();
        result.text += "\nOpenSpeaker:"+ ret;
    }
    /// <summary>
    /// 关闭扬声器,BtnCloseSpeaker按钮点击调用
    /// </summary>
    publicvoid CloseSpeaker()
    {
        intret = m_voiceengine.CloseSpeaker();
        result.text += "\nCloseSpeaker:"+ ret;
    }
    /// <summary>
    /// 加入房间回调
    /// </summary>
    /// <param name="code"></param>
    /// <param name="roomName"></param>
    /// <param name="memberID"></param>
    privatevoid OnJoinRoom(IGCloudVoice.GCloudVoiceCompleteCode code, stringroomName, intmemberID)
    {
        result.text += string.Format("\nOnJoinRoom ---> code: {0}, roomName: {1}, memberID: {2}", code, roomName, memberID);
    }
    /// <summary>
    /// 退出房间回调
    /// </summary>
    /// <param name="code"></param>
    /// <param name="roomName"></param>
    /// <param name="memberID"></param>
    privatevoid OnExitRoom(IGCloudVoice.GCloudVoiceCompleteCode code, stringroomName, intmemberID)
    {
        result.text += string.Format("\nOnExitRoom ---> code: {0}, roomName: {1}, memberID: {2}", code, roomName, memberID);
        m_voiceengine.OnJoinRoomComplete -= OnJoinRoom;
        m_voiceengine.OnQuitRoomComplete -= OnExitRoom;
        m_voiceengine.OnMemberVoice -= OnMemberVoice;
    }
    /// <summary>
    /// 有成员说话时回调
    /// </summary>
    /// <param name="members"></param>
    /// <param name="count"></param>
    privatevoid OnMemberVoice(int[] members, intcount)
    {
        result.text += string.Format("\nOnMemberVoice ---> count: {0}, roomName: {1}, memberID: {2}", count);
    }
}

将 GVoiceDemo 脚本添加到Canvas对象上,然后将脚本中对应的方法注册到对应的按钮的OnClick事件上,保存场景,然后运行到手机上,使用两个手机就可以语音聊天了,效果如下图:

其他事项

按照上面的流程集成完的项目并不能在PC上运行,如果要在PC上运行不报错,可以将下载的 unity_demo.zip 文件解压后的 unity_demo\Assets\Plugins 目录下的 X86 和 x86_64 两个文件夹拷贝到项目的 Plugins 文件夹下,这样PC上运行就不会报错。因为我这里没有麦克风设备,不知道在PC上能不能使用语音聊天,有条件的朋友可以试试,有结果了可以反馈给我,先谢过了!

Unity3D集成腾讯语音GVoiceSDK相关推荐

  1. Unity3D集成腾讯语音GVoice SDK

    友情提示:最近发现腾讯GVoice有另一个官网,叫做腾讯游戏服务,经过对比发现这个网站才是最新的,下面我介绍的那个估计是已经废弃的,但不知道为啥老的网站没有直接链接到新网址而是仍然保留了.不过新官网的 ...

  2. uniapp集成腾讯即时通信IM,实现一对一聊天,支持文字、表情、语音、图片、视频

    uniapp集成腾讯即时通信IM,实现一对一聊天,支持文字.表情.语音.图片.视频 原则 拿来即用,节省开发时间 介绍 腾讯的给的例子内容比较乱,我花了好长时间才集成出来,然后对聊天页面做了UI美化. ...

  3. 微信小程序 -- 原生JS集成腾讯IM实时聊天/实时音视频(踩坑及心得)

    原生JS集成腾讯IM实时聊天/实时音视频对话功能 一.腾讯IM集成 前期准备 实例创建及初始化 IM登录 收发消息 二.腾讯音视频实时互动 跑通demo 三.同时集成即时通讯IM 和 音视频直播的 坑 ...

  4. 微信小程序集成腾讯IM,实现实时音视频通话,1V1聊天

    相关文章: 1.小程序聊天群,发送语音,文字,图片. 2.微信小程序集成腾讯IM,实现实时音视频通话,1V1聊天 3.云开发微信小程序聊天群 4.接入网易云信IM即时通讯的微信小程序聊天室 5.微信小 ...

  5. Java集成腾讯云音视频录制功能

    Java集成腾讯云音视频录制功能 为什么要实现音视频录制功能 因为我们做的是一个医院的项目,医生和患者可能进行视频通话和语音通话,为了保证通话的质量以及后续的问题, 我们就需要进行音视频录制,以便后续 ...

  6. Unity3D 集成 Face++ FacePlusPlus httpClient http协议 byte数组转string

    //開始由于要实现跨平台.考虑过用curl封装c++的dll(android *.so)的方式,在c#Dllimport实现 //后来发现Unity3D本身支持http协议.且face++的api都是 ...

  7. Android 项目集成腾讯X5浏览器内核

    1.为什么要集成腾讯 X5 浏览器内核 肯定是事出有因,简单来说,JS代码写的不标准,与部分机型内嵌套的浏览器内核产生矛盾,出现底层(os)bug导致,不得不费事搞一个其它内核进行加载网页,具体原因. ...

  8. 使用springboot集成腾讯云短信服务,解决配置文件读取乱码问题

    使用springboot集成腾讯云短信服务,解决配置文件读取乱码问题 参考文章: (1)使用springboot集成腾讯云短信服务,解决配置文件读取乱码问题 (2)https://www.cnblog ...

  9. 注意!腾讯语音助手也已抵达战场(内部不止这一个)

    李根 发自 凹非寺  量子位 报道 | 公众号 QbitAI 腾讯叮当还不是一个特别广为人知的名字. 相比百度DuerOS,阿里天猫精灵的AliGenie,Rokid背后的若琪,以及给小米.小雅提供语 ...

最新文章

  1. 雷林鹏分享:jQuery EasyUI 数据网格 - 条件设置行背景颜色
  2. 反思不可佛系:刺激身体 刺激神经 目标反馈 定量奖惩 注重氛围
  3. android 监听安装来源_Flutter插件开发之APK自动安装
  4. java rsa算法_求RSA算法JAVA实现源代码(带界面的)
  5. homebrew php70,OSX下安装PHP7教程详解
  6. 你一直在用的Beam Search,是否真的有效?
  7. 分治回溯-分治的应用-全排列问题
  8. H+ Hplus html解决contabs.js未加载完毕时 点击会跳转至菜单框架外的bug
  9. Java项目:SSM高校教职工差旅报销管理系统
  10. quartus ii 虚拟管脚设定
  11. Mybatis+Servlet+jsp
  12. 在imitate中遇到的问题
  13. 20款常用的商业智能(BI)工具分享(最新)
  14. 阿里飞冰的介绍以及使用
  15. postgresql整理
  16. DVB信道编解码与调制解调
  17. 离开华为三年,我才真正认同狼性文化
  18. 使用pyechart生成节点关系图
  19. 堆的c语言实现以及简单应用
  20. [面试] lcy - 箴言

热门文章

  1. FasterTransformer 005 初始化:如何将参数传给模型?
  2. 硬件学习笔记(器件篇)—— 电感(五)
  3. 软件需求与软件需求规约
  4. 敏捷开发修炼之道 (一)高效软件开发之道、态度决定一切
  5. Python中for语句的使用方法
  6. 计算机专业技能测试为什么考美术,河北工艺美术职业学院2019年单独招生考试职业适应性测试(计算机基础知识和实践技能)考试大纲...
  7. jsbridge实现及原理_jsBridge原理解析
  8. amd(超微半导体公司(英语:Advanced Micro Devices, Inc.,缩写:AMD))
  9. 设置多个div横向排列
  10. 线程的生命周期?线程有几种状态