您的位置:首页 > 移动开发 > Unity3D

unity3D学习之音频数据的采集要点-audio菜鸟笔记6

2017-11-21 11:56 543 查看
之前的那些博文都只是很粗糙的知识跟一些自己的练习而已,这次我将介绍一下自己用过的音频数据采集的方法:

1、AudioClip.GetData(a, b)

可以直接从AudioSource组件中的音频文件获取数据,不管是mute是否为true,还是volume为0都能获取到音频的数据,数据长度为第b个数据开始取样,长度为a个数据(最小为64个,关于这个可以去查查api)。

获取某一段音频:

float[] tempclip = new float[audiosource.timeSamples - TSamples];
audiosource.clip.GetData(tempclip, TSamples);
audiosource.clip = AudioClip.Create("newClip", tempclip.Length, 1, frequencyClip, false);
audiosource.clip.SetData(tempclip, 0);


2.AudioSource.GetSpectrumData(a, 0,FFTWindow.BlackmanHarris)

通过音频组件获取音频数据,自由在mute为false,volume不为0的情况下才能获取数据(即:必须音频放出声音才能获取音频数据),a是数据长度(同上),0是声道数,FFTWindow是取样级别,级别越高取样越精确。用法类似于AudioClip.GetData(a, b)。

3.OnAudioFilterRead(float[] data, int channels)

这个是unity自带的方法,有点类似于Update()方法,不过这个方法会不断的获取全局的音频数据(当有多种音频同时播放时,会获取混合声音的数据,可以用做声音的合并)然后再流回去变为声音输出。data是取样数据组,固定为2048个;channels是声道数,默认是2个(即:data[0]和data[1]的数值是一样的)。

使场景全局静音,结合上面2种方法不管是mute为false,还是volume为1,都可以获取到音频数据:

private void OnAudioFilterRead(float[] data, int channels)
{
for (int i = 0; i < data.Length; i++)
{
data[i] = 0;
}
}


同时可以改变音频的数据来达到变声的效果:
private void OnAudioFilterRead(float[] data, int channels)
{
for (int i = 0; i < data.Length; i++)
{
data[i] = data[i]*2f;
}
}


除了我说的这些之外还有很多可以利用这些方法实现的功能,发挥你的想象力吧d=====( ̄▽ ̄*)b
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息