Unity3D 实现简单的语音聊天 [Android版本]

Posted 游戏基

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D 实现简单的语音聊天 [Android版本]相关的知识,希望对你有一定的参考价值。

上次简单说了iOS版本的聊天功能 Unity3D 实现简单的语音聊天 [iOS版本]

这次我们接着上篇来说下Android版本来实现简单的语音聊天,流程和iOS基一样的 @_@

 

在这里我们可能会遇到一下问题:

1.U3D C# 与 Android Java之间是怎么通讯

2.Android怎么调用原生的录音功能和播放功能

 

好,我们逐一解决问题

 

1.U3D C# 与 Android Java之间是怎么通讯

 

相比iOS,Android这边会比较简单些

再C# 中这样调用Android的接口

AndroidJavaClass javaclass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject javaobject = javaclass.GetStatic<AndroidJavaObject>(“currentActivity");

javaobject.Call (methodName);

 

所以在com.unity3d.player.UnityPlayer中定义的接口都可以通过上述方法去调用,值得注意的是,如果要U3D直接修改Android界面上的东西,不用能直接在接口中修改,可以在Android接口中用这样调用

this.runOnUiThread(new Runnable() {

@Override

public void run() {

//调用Android接口逻辑

}

});

 

或者是用Message

//设置消息

Message msg = new Message();

msg.what =“methodName”;

 

Handler messageHandler = new Handler() {

public void handleMessage(Message e){

//调用Android接口逻辑

}

//发送事件消息

messageHandler.sendMessage(msg);

 

好了,反过来,如果Android要发送消息给U3D,可以调用unity-class.jar提供的接口

UnityPlayer.UnitySendMessage(String a,String b,String c);

和iOS一样,第一个参数是场景中的GameObject名字,第二个参数是组件中的方法名字,第三个参数是任意的消息参数。这样,U3D和Android相互间的消息发送就完成了。

 


2.Android怎么调用原生的录音功能和播放功能

 

与iOS类似,我们需要引入安卓原生的录音类和音频播放类

import android.media.MediaRecorder;

import android.media.MediaPlayer;


MediaRecorder

我们创建MediaRecorder对象来录制音频

MediaRecorder  mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置音频来源(MIC表示麦克风) mRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); // 设置音频输出格式

mRecorder.setOutputFile(voiceDataPath);//设置输出文件 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 设置音频编码为AMR

mRecorder.setMaxDuration(20300);//设置录音时长

mRecorder.setAudioEncodingBitRate(4000);

mRecorder.setAudioSamplingRate(8000);//采样率

mRecorder.prepare();

//开始录制

mRecorder.start();

 

//结束录制

mRecorder.stop();

mRecorder.release();

 

voiceDataPath路径为录制文件输出路径,与iOS不同,录制文件格式可以直接输出为ARM格式。同时可以设置录制事件的回调函数

mRecorder.setOnInfoListener(new MediaRecorder.OnInfoListener() {

//设置回调

@Override

public void onInfo(MediaRecorder arg0, int arg1, int arg2) {

  if(arg1 == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED){//到达最长录音时间限制

    speakStop( );

  }

}

});

  

MediaPlayer

播放音频更加简单,传入音频文件路径就可以了

MediaPlayer mPlayer = new MediaPlayer();

mPlayer.setDataSource(voiceDataPath);

mPlayer.prepare();

//开始播放

mPlayer.start();

 

//结束播放

mPlayer.stop();

mPlayer.release();

 也可以设置播放完成的事件回调

mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {//播放完毕回调监听

@Override

public void onCompletion(MediaPlayer arg0) {

  stopPlay( );

}

});

与iOS不同,Android中不需要把ARM格式的音频转为wav,MediaPlayer类可以直接播放ARM格式的音频。

 

好了,Android版的语音聊天大概就点到这里来了,流程基本和iOS的类似,只是Android的API可以直接支持ARM音频格式的录制和播放,用起来也相当的方便。

以上是关于Unity3D 实现简单的语音聊天 [Android版本]的主要内容,如果未能解决你的问题,请参考以下文章

Socket之简单的Unity3D聊天室__TCP协议

Unity3D 通用提示窗口实现分析(Inventory Pro学习总结)

Unity3d 中创建实时视频聊天

Unity3d 中创建实时视频聊天

Unity3d 中创建实时视频聊天

Unity3D 语音接入适用于pciosandroid