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

unity3D学习之音频测试-audio菜鸟笔记4

2017-08-08 11:48 295 查看
这些代码都是自己测试所用,希望能够跟大家共同学习,有什么疑问或建议,可以给我评论留言........

这是自己写的功能代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using SoundTouch;
#if SOUNDTOUCH_INTEGER_SAMPLES
using TSampleType = System.Int16;
using TLongSampleType = System.Int64;
#else
using TSampleType = System.Single;
using TLongSampleType = System.Double;
#endif

public class MicRecord : MonoBehaviour {
private AudioSource Aud;

void Awake(){
Aud = GetComponent<AudioSource> ();
}

//开始录音
public void startRecording(){

if (Microphone.devices.Length < 1){
Debug.Log ("找不到设备!");
return;
}
Microphone.End (null);//停止记录,指定设备

//单纯的创建录音到输出有一定的时间延迟,true可以一直录音,false规定一定录音时间
//创建后已经保存在内存(RAM)临时储存
Aud.clip = Microphone.Start (null, false, 10, 44100);

//在记录样品中获取位置,可以控制延迟
//0秒播放==实时播放录音
while (Microphone.GetPosition (null) <= 0) {};

Aud.Play ();

}

public void stopRecording(){
//录音过程中,从0到时长*频率(44100*10)
//Debug.Log (Aud.timeSamples);
Microphone.End(null);
Aud.Stop();
//#region 音频数据压缩、修改与解压
////临时存储,采样(采样率*时间)*声道数
//float[] temporarysave = new float[Aud.clip.samples*Aud.clip.channels];

////获取剪辑采样数据,可以将音频转化为float[]数组,进行压缩、变声处理,从offsetsample开始截取
////如果从偏移值读取的长度比剪辑长,读取将环绕从剪辑开始读取剩余部分
//Aud.clip.GetData (temporarysave, 0);//从什么时候保存(确认采集数)

//var soundchanger = new SoundTouch<TSampleType,TLongSampleType> ();
//soundchanger.SetSampleRate (44100);
//soundchanger.SetChannels (1);
//soundchanger.SetPitch (2);
//soundchanger.SetRate (2);
//soundchanger.SetTempo (2);
//      //快速查找(是否使用快速查找法)
//      soundchanger.SetSetting(SettingId.UseQuickseek, 0);
//      //抗锯齿过滤器(是否使用AA滤波器)
//soundchanger.SetSetting(SettingId.UseAntiAliasFilter,  0 );
//      //滤波器阶数
//      soundchanger.SetSetting(SettingId.AntiAliasFilterLength,32);
//      //序列持续时间(帧长),用于确定原声在时间延伸算法的切割(速度越慢,数值越大越好)
//      soundchanger.SetSetting(SettingId.SequenceDurationMs, 40);
//      //查找win持续时间(叠加时寻找窗的范围长度),数值越大越容易获得最佳混音位置,可能会有伪音
//      soundchanger.SetSetting(SettingId.SeekwindowDurationMs, 15);
//      //重叠持续时间(叠加范围),末端重叠程度
//      soundchanger.SetSetting(SettingId.OverlapDurationMs, 8);
//      //samp.Length可输入的最大值
//      soundchanger.PutSamples (temporarysave, temporarysave.Length);
//float[] resamp = new float[temporarysave.Length];
//      //samp.Length可输出的最大值
//      soundchanger.ReceiveSamples (resamp, temporarysave.Length);
//soundchanger.Flush ();
////Debug.Log(GetComponent<GUILay>().pitchsam);

////创建一个给定名称、采样长度、声道和频率的用户音频剪辑。true为流媒体(在iternet上以流式传输的媒体格式)
//Aud.clip = AudioClip.Create("myclip",temporarysave.Length,1,44100,false);
//Aud.clip.SetData (temporarysave,0);//从什么时候播放

//      #endregion

#region 测试所用
int duo = Aud.clip.samples * Aud.clip.channels;
Aud.clip = GetComponent<GUILay>().VoiceChanger(Aud.clip, duo);
#endregion
Aud.clip.LoadAudioData ();//加载音频
Debug.Log(Aud.timeSamples);
Aud.Play ();

}

public void SaveRecording(){

}

public void SoundChangering(){

}

}


这是格式代码,主要用了onGUI来写:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using SoundTouch;
#if SOUNDTOUCH_INTEGER_SAMPLES
using TSampleType = System.Int16;
using TLongSampleType = System.Int64;
#else
using TSampleType = System.Single;
using TLongSampleType = System.Double;
#endif

public class GUILay : MonoBehaviour {
private MicRecord MicRe;

public float pitchsam = 1f;
public float playbackRate = 1f;
public float tempo = 1f;

void Start(){
MicRe = GetComponent<MicRecord> ();
}

void OnGUI(){
GUILayout.BeginHorizontal();
GUILayout.BeginVertical();
if (GUILayout.Button("Recording",GUILayout.Height(80),GUILayout.Width(200))) {
MicRe.startRecording ();
}
if (GUILayout.Button("Play",GUILayout.Height(80),GUILayout.Width(200))) {
MicRe.stopRecording ();
}
if (GUILayout.Button("Save",GUILayout.Height(80),GUILayout.Width(200))) {
MicRe.SaveRecording ();
}
if (GUILayout.Button("Reset",GUILayout.Height(80),GUILayout.Width(200))) {

}
GUILayout.EndVertical();
GUILayout.Space (100);
GUILayout.BeginVertical();

GUILayout.Label ("Pitch/音调" + pitchsam);
pitchsam = GUILayout.HorizontalSlider(pitchsam,-6,6,GUILayout.Width(300),GUILayout.Height(50));

GUILayout.Label ("playbackRate/回调率" + playbackRate);
playbackRate = GUILayout.HorizontalSlider(playbackRate,0,6,GUILayout.Width(300),GUILayout.Height(50));

GUILayout.Label ("tempo/节拍" + tempo);
tempo = GUILayout.HorizontalSlider(tempo,0,6,GUILayout.Width(300),GUILayout.Height(50));

GUILayout.EndVertical();

GUILayout.EndHorizontal();
}

public AudioClip VoiceChanger( AudioClip mycli, int count) {
#region 音频数据压缩、修改与解压
//临时存储,采样音频数据长度*声道数
float[] temporarysave = new float[count];

//获取剪辑采样数据,可以将音频转化为float[]数组,进行压缩、变声处理,从offsetsample开始截取
//如果从偏移值读取的长度比剪辑长,读取将环绕从剪辑开始读取剩余部分
mycli.GetData(temporarysave, 0);//从什么时候保存

var soundchanger = new SoundTouch<TSampleType, TLongSampleType>();
soundchanger.SetSampleRate(44100);
soundchanger.SetChannels(1);
soundchanger.SetPitchSemiTones(pitchsam);
soundchanger.SetRate(playbackRate);
soundchanger.SetTempo(tempo);

//快速查找(是否使用快速查找法)
soundchanger.SetSetting(SettingId.UseQuickseek, 0);
//抗锯齿过滤器(是否使用AA滤波器)
soundchanger.SetSetting(SettingId.UseAntiAliasFilter, 0);

//滤波器阶数
//soundchanger.SetSetting(SettingId.AntiAliasFilterLength, 32);

//序列持续时间(帧长),用于确定原声在时间延伸算法的切割(速度越慢,数值越大越好)
soundchanger.SetSetting(SettingId.SequenceDurationMs, 40);
//查找win持续时间(叠加时寻找窗的范围长度),数值越大越容易获得最佳混音位置,可能会有伪音
soundchanger.SetSetting(SettingId.SeekwindowDurationMs, 15);
//重叠持续时间(叠加范围),末端重叠程度
soundchanger.SetSetting(SettingId.OverlapDurationMs, 8);

//samp.Length可输入的最大值
soundchanger.PutSamples(temporarysave, temporarysave.Length);
float[] resamp = new float[temporarysave.Length];
//samp.Length可输出的最大值
soundchanger.ReceiveSamples(resamp, temporarysave.Length);
soundchanger.Flush();
//Debug.Log(GetComponent<GUILay>().pitchsam);

//创建一个给定名称、采样长度、声道和频率的用户音频剪辑。true为流媒体(在iternet上以流式传输的媒体格式)
AudioClip myclip = AudioClip.Create("myclip", temporarysave.Length, 1, 44100, false);
myclip.SetData(temporarysave, 0);//从什么时候播放
#endregion
Debug.Log(myclip);
return myclip;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: