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

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


这是自己写的功能代码:

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;
    }
}


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值