Unity3d录音
2015-07-28 14:46
369 查看
之前项目有玩家之间语音的功能需求,所以研究了下,由于之前Baidu/Google能搜到的资料较少,所以我来总结下
由于我们Unity3d是跨平台工作的,所以尽量用Unity3d的api,查了下Unity3的documetation,只有个Microphone可以用。
static AudioClip Start(string deviceName, bool loop, int lengthSec, int frequency);
开始录音,第一个参数是麦克风的名字,当有多个麦克风(通过devices接口可获得麦克风名字列表)的时候可以用指定的麦克风进行录音,一般使用默认的麦克风(参数null)就行;
第二个参数是否循环录制;
第三个参数为录音长度,单位为秒;
第四个参数为音频的音质,即采样率,一般的无损音质是44100,即每秒用44100个float来表示1秒的音频内容,但是我们的语音8000就够了,不然录制出来的音频特别大,不利传输。
其他接口直接上代码,我尽量在注释中写清楚。
关于音频的压缩,有很多压缩算法,已不再本文涉及的范围内,会用到的接口:
1、AudioClip.GetData接口可以将audilClip转化为float[] samples。
2、AudioClip.Creat()创建AudioClip,,然后AudioClip.SetData将float[] samples数据设置到clip
个人建议:在实际项目中需要好的语音效果,可以植入第三方语音sdk,为避广告嫌疑就不指明了,但是如果有音频编码的底子,用u3d原生的接口效果也不耐,笔者的项目中已使用。
由于我们Unity3d是跨平台工作的,所以尽量用Unity3d的api,查了下Unity3的documetation,只有个Microphone可以用。
static AudioClip Start(string deviceName, bool loop, int lengthSec, int frequency);
开始录音,第一个参数是麦克风的名字,当有多个麦克风(通过devices接口可获得麦克风名字列表)的时候可以用指定的麦克风进行录音,一般使用默认的麦克风(参数null)就行;
第二个参数是否循环录制;
第三个参数为录音长度,单位为秒;
第四个参数为音频的音质,即采样率,一般的无损音质是44100,即每秒用44100个float来表示1秒的音频内容,但是我们的语音8000就够了,不然录制出来的音频特别大,不利传输。
其他接口直接上代码,我尽量在注释中写清楚。
private AudioClip clip; private byte[] recordData; //通常的无损音质的采样率是44100,即每秒音频用44100个float数据表示,但是语音只需8000(通常移动电话是8000)就够了 //不然音频数据太大,不利于传输和存储 public const int SamplingRate = 8000; //按钮按下开始录音,弹起结束录音 void OnRecording(GameObject goSender, bool flag){ if(flag){//按钮按下开始录音 Microphone.End(null);//这句可以不需要,但是在开始录音以前调用一次是好习惯 clip = Microphone.Start(null,false,10,SamplingRate); }else{//按钮弹起结束录音 int audioLength;//录音的长度,单位为秒,ui上可能需要显示 int lastPos = Microphone.GetPosition(null); if(Microphone.IsRecording(null)){//录音小于10秒 audioLength = lastPos/SamplingRate;//录音时长 }else{ audioLength = 10; } Microphone.End(null);//此时录音结束,clip已可以播放了 if(audioLength<1.0f)return;//录音小于1秒就不处理了 //如果要便于传输还需要进行压缩,压缩后的recordData就可以用于网络传输了 recordData = AudioClipCompressor.CompressAudioClip(clip); //本地可以用sqlit存储, int soundId = string.Format("{0}{1}",player.ID, System.DateTime.Now.ToString()); DbSound dbs = new DbSound(); dbs.InsertSound(soundId , audioLength, recordData); dbs.CloseSqlConnection(); } }
关于音频的压缩,有很多压缩算法,已不再本文涉及的范围内,会用到的接口:
1、AudioClip.GetData接口可以将audilClip转化为float[] samples。
2、AudioClip.Creat()创建AudioClip,,然后AudioClip.SetData将float[] samples数据设置到clip
个人建议:在实际项目中需要好的语音效果,可以植入第三方语音sdk,为避广告嫌疑就不指明了,但是如果有音频编码的底子,用u3d原生的接口效果也不耐,笔者的项目中已使用。
相关文章推荐
- 小韵游戏开发学习笔记——第三期:Unity工程创建及界面功能的基本介绍
- Unity笔记 脚本执行顺序 life and times
- 小韵游戏开发学习笔记——第二期:初识Unity3D
- UnityShader:HSV(色相,饱和度,亮度)转换
- 游戏开发学习笔记——第二期:初识Unity3D
- Unity3d程序必备的几种设计模式
- Unity 利用itextSharp导出pdf文档
- unity 制作2d动画
- Unity3D之Audio
- unity3d v5.1.2 如何顺序播放音乐
- 讲解如何在Unity的Inspector面板实现类似摄像机层次遮罩的多选效果
- Unity3D在Windows的全屏和跨屏(双屏)方案
- 【Unity游戏开发之三】Sprite Packer使用方法
- Unity插件研究院之ResourceChecker
- 【Unity NGUI游戏开发之四】NGUI的DrawCall数量
- 学习零碎整理-unity创建序列帧的一种办法
- 关于Unity Package无法导入的问题
- Unity Mono IDE Setting
- 【Unity游戏开发之二】定制Debug.log输出
- UNITY 5.1.2发行说明 中文版