Unity3D集成腾讯语音GVoice SDK
友情提示:最近发现腾讯GVoice有另一个官网,叫做腾讯游戏服务,经过对比发现这个网站才是最新的,下面我介绍的那个估计是已经废弃的,但不知道为啥老的网站没有直接链接到新网址而是仍然保留了。不过新官网的文档更加详细,SDK也有所更新,所以建议去新官网下载SDK和Demo,接入流程基本没有啥大变化。
简述
我们项目中用到了实时语音功能,在最初语音 SDK 技术选型的时候测试过融云、声网和腾讯的 GVoice 。融云和声网我都在我们项目中使用过,但是效果都不如王者荣耀游戏中的实时语音效果,这两天好好研究了一下腾讯的 GVoice,终于成功集成。由于腾讯 GVoice 官网的接入流程并不是很详细,如果只懂 Unity3D 不懂 Android 基础知识的朋友,可能接入过程不会一帆风顺。我虽了解一点点 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,详细代码如下:
package com.shehweiwei.gvoicedemo;
import android.os.Bundle;
import com.tencent.gcloud.voice.GCloudVoiceEngine;
// 注意:下面这句代码必须有,如果没有可能会导致闪退
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity
{
protected void 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# 脚本,脚本代码如下:
using UnityEngine;
using gcloud_voice;
using UnityEngine.UI;
using System;
public class GVoiceDemo : MonoBehaviour
{
// 用来显示调用API返回的结果
public Text result;
private IGCloudVoice m_voiceengine = null;
// TODO: 这里的appId和appKey使用的是官方提供的测试值,正式项目中可使用申请的值
private const string appId = "932849489";
private const string appKey = "d94749efe9fce61333121de84123ef9b";
// TODO: 这里使用的是测试账号,所以房间名使用默认的100,正式项目中可根据实际情况赋值
private string roomName = "100";
void Start()
{
if (m_voiceengine == null)
{
m_voiceengine = GCloudVoice.GetEngine();
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
string strTime = 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;
}
}
void Update()
{
if (m_voiceengine != null)
{
// 不断检测GVoice引擎回调
m_voiceengine.Poll();
}
}
void OnApplicationPause(bool pauseStatus)
{
if (m_voiceengine == null)
{
return;
}
// 应用暂停时GVoice引擎也暂停,应用重新开始时引擎继续
if (pauseStatus)
{
m_voiceengine.Pause();
}
else
{
m_voiceengine.Resume();
}
}
/// <summary>
/// 加入房间,BtnJoin按钮点击调用
/// </summary>
public void JoinRoom()
{
m_voiceengine.SetMode(GCloudVoiceMode.RealTime);
int ret = m_voiceengine.JoinTeamRoom(roomName, 15000);
result.text += "\nJoinRoom:" + ret;
}
/// <summary>
/// 退出房间,BtnExit按钮点击调用
/// </summary>
public void ExitRoom()
{
int ret = m_voiceengine.QuitRoom(roomName, 6000);
result.text += "\nExitRoom:" + ret;
}
/// <summary>
/// 打开麦克风,BtnOpenMic按钮点击调用
/// </summary>
public void OpenMic()
{
int ret = m_voiceengine.OpenMic();
result.text += "\nOpenMic:" + ret;
}
/// <summary>
/// 关闭麦克风,BtnCloseMic按钮点击调用
/// </summary>
public void CloseMic()
{
int ret = m_voiceengine.CloseMic();
result.text += "\nCloseMic:" + ret;
}
/// <summary>
/// 打开扬声器,BtnOpenSpeaker按钮点击调用
/// </summary>
public void OpenSpeaker()
{
int ret = m_voiceengine.OpenSpeaker();
result.text += "\nOpenSpeaker:" + ret;
}
/// <summary>
/// 关闭扬声器,BtnCloseSpeaker按钮点击调用
/// </summary>
public void CloseSpeaker()
{
int ret = m_voiceengine.CloseSpeaker();
result.text += "\nCloseSpeaker:" + ret;
}
/// <summary>
/// 加入房间回调
/// </summary>
/// <param name="code"></param>
/// <param name="roomName"></param>
/// <param name="memberID"></param>
private void OnJoinRoom(IGCloudVoice.GCloudVoiceCompleteCode code, string roomName, int memberID)
{
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>
private void OnExitRoom(IGCloudVoice.GCloudVoiceCompleteCode code, string roomName, int memberID)
{
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>
private void OnMemberVoice(int[] members, int count)
{
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上能不能使用语音聊天,有条件的朋友可以试试,有结果了可以反馈给我,先谢过了!
项目源码
我把项目的源码托管在了Github上了, 有需要的朋友自取。项目链接点这里
本文作者: Sheh伟伟
本文链接: http://davidsheh.github.io/2017/05/27/Unity3D集成腾讯语音GVoiceSDK/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
Unity3D集成腾讯语音GVoice SDK的更多相关文章
- 微信小程序集成腾讯云 IM SDK
微信小程序集成腾讯云 IM SDK 1.背景 因业务功能需求需要接入IM(即时聊天)功能,一开始想到的是使用 WebSocket 来实现这个功能,然天意捉弄(哈哈)服务器版本太低不支持 wx 协议(也 ...
- Android 讯飞语音听写SDK快速接入(附空指针解决和修改对话框文字方法)
1.账号准备工作 首先要有一个讯飞的账号啦,为后面申请APPID.APPKey等东西做准备.顺带一提:讯飞对不同认证类型用户开 放的SDK的使用次数是有不同的,详情如下图. 账号申请完成后,需要去你自 ...
- 【Unity】讯飞语音识别SDK
1.进入讯飞官网,注册帐号,进入控制台,创建新应用UnityXunfeiDemo,平台选Android.在当前应用这点下载SDK,添加AI能力(添加新服务),选择语音听写,即可下载安卓SDK(下称讯飞 ...
- Unity3D 集成 Face++ FacePlusPlus httpClient http协议 byte数组转string
//開始由于要实现跨平台.考虑过用curl封装c++的dll(android *.so)的方式,在c#Dllimport实现 //后来发现Unity3D本身支持http协议.且face++的api都是 ...
- 安卓开发笔记(二十四):手把手教你一步步集成腾讯X5内核(Tencent TBS X5)
1.为什么要集成腾讯X5内核? X5内核相对于系统webview,具有下述明显优势: 1) 速度快:相比系统webview的网页打开速度有30+%的提升: 2) 省流量:使用云端优化技术使流量节省20 ...
- 使用springboot集成腾讯云短信服务,解决配置文件读取乱码问题
springboot集成腾讯云短信服务: (1)导入依赖 <dependency> <groupId>org.springframework.boot</groupId& ...
- 静态集成腾讯TBS X5内核WebView,从微信提取新版30M浏览器内核打包进apk
目录 前情提要 第一步:下载老版本SDK得到jar 获取SDK 集成SDK 步骤二.下载提取最新TBS X5内核 方法1:从微信中提取 方法2:App内内访问tbs调试页安装新内核 步骤三.集成内核到 ...
- 腾讯即时聊天sdk
一. 初始化 腾讯即时通讯sdk 1. 程序日志注册 2. 连接通知回调 专门的类管理 3. 信息通知回调 专门的类 4. 初始化sdk 5. 注册推送 分ios8/ios以前 注册推送成功回调 发 ...
- Unity3D集成SVN进行版本控制
首先,AssetServer确实很好用,Unity内部集成的管理界面,操作很简单,提交冲突的后还可以进行文件比对.但学习使用过程中,发现文件体积较大的项目文件目录(600M),我提交不上去,会返回没有 ...
随机推荐
- HDU4768:Flyer [ 二分的奇妙应用 好题 ]
传送门 Flyer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- Laravel5.1 报错:控制器不存在
Laravel5.1 报错:控制器不存在 错误提示: Class App\Http\Controllers\Api/UserController does not exist 解决: (1)检查控制器 ...
- GIL锁、死锁、递归锁、定时器
GIL (Global Interpreter Lock) 锁 '''定义:In CPython, the global interpreter lock, or GIL, is a mutex th ...
- Educational Codeforces Round 51 (Rated for Div. 2) The Shortest Statement
题目链接:The Shortest Statement 今天又在群里看到一个同学问$n$个$n$条边,怎么查询两点直接最短路.看来这种题还挺常见的. 为什么最终答案要从42个点的最短路(到$x,y$) ...
- SpringBoot整合freemarker中自定义标签获取字典表的数据
因为在前端要根据字典表中的数据去将1.2这些值转换成对应的文字解释 1.首先要创建一个类去实现 TemplateDirectiveModel 类 @Component public class Dic ...
- UNIDAC不能识别CLIENTDATASET的TSINGLEFIELD
UNIDAC不能识别CLIENTDATASET的TSINGLEFIELD FIREDAC,UNIDAC这些通用的数据引擎,对某种数据库的支持,细节方面总有BUG. UNIDAC6.2.8发现不能识别C ...
- 【postgresql】postgresql中的between and以及日期的使用
在postgresql中的between and操作符作用类似于,是包含边界的 a BETWEEN x AND y 等效于 a >= x AND a <= y 在postgresql中比较 ...
- Go -- RPC 之 Thrift
Thrift 简介: Thrift 是一款高性能.开源的 RPC 框架,产自 Facebook 后贡献给了 Apache,Thrift 囊括了整个 RPC 的上下游体系,自带序列化编译工具,因为 Th ...
- 【转】 nginx rewrite 伪静态配置参数详细说明
nginx rewrite 伪静态配置参数和使用例子 附正则使用说明 正则表达式匹配,其中: * ~ 为区分大小写匹配 * ~* 为不区分大小写匹配 * !~和!~*分别为区分大小写不匹配及不区分 ...
- vim中末行去掉^M
在Ubuntu系统中打开文件,发现文件中每一个末行都有^M,我们要做的是知道这一个无关的字符是什么作用,然后删除掉这一个无关的字符. 工具/原料 ubuntu操作系统 Vim编辑器 方法/步骤 ...