目标实现录音功能、保存为wav、播放、保存为int16[]发送网络数据流、接收Int16[]播放数据流
MicroPhoneInput类
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Text;
- using UnityEngine;
- using System.Collections;
- [RequireComponent (typeof(AudioSource))]
- public class MicroPhoneInput : MonoBehaviour {
- private static MicroPhoneInput m_instance;
- public float sensitivity=100;
- public float loudness=0;
- private static string[] micArray=null;
- const int HEADER_SIZE = 44;
- const int RECORD_TIME = 10;
- // Use this for initialization
- void Start () {
- }
- public static MicroPhoneInput getInstance()
- {
- if (m_instance == null)
- {
- micArray = Microphone.devices;
- if (micArray.Length == 0)
- {
- Debug.LogError ("Microphone.devices is null");
- }
- foreach (string deviceStr in Microphone.devices)
- {
- Debug.Log("device name = " + deviceStr);
- }
- if(micArray.Length==0)
- {
- Debug.LogError("no mic device");
- }
- GameObject MicObj=new GameObject("MicObj");
- m_instance= MicObj.AddComponent<MicroPhoneInput>();
- }
- return m_instance;
- }
- void OnGUI()
- //GUI.Label(new Rect(10,10,200,100),"loudness = "+loudness);
- //GUI.Label(new Rect(10,210,200,100),"Microphone.GetPosition = "+Microphone.GetPosition(null));
- }
- public void StartRecord()
- {
- audio.Stop();
- if (micArray.Length == 0)
- {
- Debug.Log("No Record Device!");
- return;
- }
- audio.loop = false;
- audio.mute = true;
- audio.clip = Microphone.Start(null, false, RECORD_TIME, 44100); //22050
- while (!(Microphone.GetPosition(null)>0)) {
- }
- audio.Play ();
- Debug.Log("StartRecord");
- //倒计时
- StartCoroutine(TimeDown());
- }
- public void StopRecord()
- {
- if (micArray.Length == 0)
- {
- Debug.Log("No Record Device!");
- return;
- }
- if (!Microphone.IsRecording(null))
- {
- return;
- }
- Microphone.End (null);
- audio.Stop();
- Debug.Log("StopRecord");
- // PlayRecord();
- //调试Int16[] 数据的转化与播放
- //PlayClipData(GetClipData());
- }
- public Byte[] GetClipData()
- {
- if (audio.clip == null)
- {
- Debug.Log("GetClipData audio.clip is null");
- return null;
- }
- float[] samples = new float[audio.clip.samples];
- audio.clip.GetData(samples, 0);
- Byte[] outData = new byte[samples.Length * 2];
- //Int16[] intData = new Int16[samples.Length];
- //converting in 2 float[] steps to Int16[], //then Int16[] to Byte[]
- int rescaleFactor = 32767; //to convert float to Int16
- for (int i = 0; i < samples.Length; i++)
- {
- short temshort = (short)(samples[i] * rescaleFactor);
- Byte[] temdata=System.BitConverter.GetBytes(temshort);
- outData[i*2]=temdata[0];
- outData[i*2+1]=temdata[1];
- }
- if (outData == null || outData.Length <= 0)
- {
- Debug.Log("GetClipData intData is null");
- return null;
- }
- //return intData;
- return outData;
- }
- public void PlayClipData(Int16[] intArr)
- {
- string aaastr = intArr.ToString();
- long aaalength=aaastr.Length;
- Debug.LogError("aaalength=" + aaalength);
- string aaastr1 = Convert.ToString (intArr);
- aaalength = aaastr1.Length;
- Debug.LogError("aaalength=" + aaalength);
- if (intArr.Length == 0)
- {
- Debug.Log("get intarr clipdata is null");
- return;
- }
- //从Int16[]到float[]
- float[] samples = new float[intArr.Length];
- int rescaleFactor = 32767;
- for (int i = 0; i < intArr.Length; i++)
- {
- samples[i] = (float)intArr[i] / rescaleFactor;
- }
- //从float[]到Clip
- AudioSource audioSource = this.GetComponent<AudioSource>();
- if (audioSource.clip == null)
- {
- audioSource.clip = AudioClip.Create("playRecordClip", intArr.Length, 1, 44100, false, false);
- }
- audioSource.clip.SetData(samples, 0);
- audioSource.mute = false;
- audioSource.Play();
- }PlayRecord()
- {
- if (audio.clip == null)
- {
- Debug.Log("audio.clip=null");
- return;
- }
- audio.mute = false;
- audio.loop = false;
- audio.Play ();
- Debug.Log("PlayRecord");
- }
- public void LoadAndPlayRecord()
- {
- string recordPath ="your path";
- SavWav.LoadAndPlay (recordPath);
- }
- public float GetAveragedVolume()
- {
- float[] data=new float[256];
- float a=0;
- audio.GetOutputData(data,0);
- foreach(float s in data)
- {
- a+=Mathf.Abs(s);
- }
- return a/256;
- }
- // Update is called once per frame
- void Update ()
- {
- loudness = GetAveragedVolume () * sensitivity;
- if (loudness > 1)
- {
- Debug.Log("loudness = "+loudness);
- }
- }
- private IEnumerator TimeDown()
- {
- Debug.Log(" IEnumerator TimeDown()");
- int time = 0;
- while (time < RECORD_TIME)
- {
- if (!Microphone.IsRecording (null))
- { //如果没有录制
- Debug.Log ("IsRecording false");
- yield break;
- }
- Debug.Log("yield return new WaitForSeconds "+time);
- yield return new WaitForSeconds(1);
- time++;
- }
- if (time >= 10)
- {
- Debug.Log("RECORD_TIME is out! stop record!");
- StopRecord();
- }
- yield return 0;
- }
- }
目标实现录音功能、保存为wav、播放、保存为int16[]发送网络数据流、接收Int16[]播放数据流
MicroPhoneInput类
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Text;
- using UnityEngine;
- using System.Collections;
- [RequireComponent (typeof(AudioSource))]
- public class MicroPhoneInput : MonoBehaviour {
- private static MicroPhoneInput m_instance;
- public float sensitivity=100;
- public float loudness=0;
- private static string[] micArray=null;
- const int HEADER_SIZE = 44;
- const int RECORD_TIME = 10;
- // Use this for initialization
- void Start () {
- }
- public static MicroPhoneInput getInstance()
- {
- if (m_instance == null)
- {
- micArray = Microphone.devices;
- if (micArray.Length == 0)
- {
- Debug.LogError ("Microphone.devices is null");
- }
- foreach (string deviceStr in Microphone.devices)
- {
- Debug.Log("device name = " + deviceStr);
- }
- if(micArray.Length==0)
- {
- Debug.LogError("no mic device");
- }
- GameObject MicObj=new GameObject("MicObj");
- m_instance= MicObj.AddComponent<MicroPhoneInput>();
- }
- return m_instance;
- }
- void OnGUI()
- //GUI.Label(new Rect(10,10,200,100),"loudness = "+loudness);
- //GUI.Label(new Rect(10,210,200,100),"Microphone.GetPosition = "+Microphone.GetPosition(null));
- }
- public void StartRecord()
- {
- audio.Stop();
- if (micArray.Length == 0)
- {
- Debug.Log("No Record Device!");
- return;
- }
- audio.loop = false;
- audio.mute = true;
- audio.clip = Microphone.Start(null, false, RECORD_TIME, 44100); //22050
- while (!(Microphone.GetPosition(null)>0)) {
- }
- audio.Play ();
- Debug.Log("StartRecord");
- //倒计时
- StartCoroutine(TimeDown());
- }
- public void StopRecord()
- {
- if (micArray.Length == 0)
- {
- Debug.Log("No Record Device!");
- return;
- }
- if (!Microphone.IsRecording(null))
- {
- return;
- }
- Microphone.End (null);
- audio.Stop();
- Debug.Log("StopRecord");
- // PlayRecord();
- //调试Int16[] 数据的转化与播放
- //PlayClipData(GetClipData());
- }
- public Byte[] GetClipData()
- {
- if (audio.clip == null)
- {
- Debug.Log("GetClipData audio.clip is null");
- return null;
- }
- float[] samples = new float[audio.clip.samples];
- audio.clip.GetData(samples, 0);
- Byte[] outData = new byte[samples.Length * 2];
- //Int16[] intData = new Int16[samples.Length];
- //converting in 2 float[] steps to Int16[], //then Int16[] to Byte[]
- int rescaleFactor = 32767; //to convert float to Int16
- for (int i = 0; i < samples.Length; i++)
- {
- short temshort = (short)(samples[i] * rescaleFactor);
- Byte[] temdata=System.BitConverter.GetBytes(temshort);
- outData[i*2]=temdata[0];
- outData[i*2+1]=temdata[1];
- }
- if (outData == null || outData.Length <= 0)
- {
- Debug.Log("GetClipData intData is null");
- return null;
- }
- //return intData;
- return outData;
- }
- public void PlayClipData(Int16[] intArr)
- {
- string aaastr = intArr.ToString();
- long aaalength=aaastr.Length;
- Debug.LogError("aaalength=" + aaalength);
- string aaastr1 = Convert.ToString (intArr);
- aaalength = aaastr1.Length;
- Debug.LogError("aaalength=" + aaalength);
- if (intArr.Length == 0)
- {
- Debug.Log("get intarr clipdata is null");
- return;
- }
- //从Int16[]到float[]
- float[] samples = new float[intArr.Length];
- int rescaleFactor = 32767;
- for (int i = 0; i < intArr.Length; i++)
- {
- samples[i] = (float)intArr[i] / rescaleFactor;
- }
- //从float[]到Clip
- AudioSource audioSource = this.GetComponent<AudioSource>();
- if (audioSource.clip == null)
- {
- audioSource.clip = AudioClip.Create("playRecordClip", intArr.Length, 1, 44100, false, false);
- }
- audioSource.clip.SetData(samples, 0);
- audioSource.mute = false;
- audioSource.Play();
- }PlayRecord()
- {
- if (audio.clip == null)
- {
- Debug.Log("audio.clip=null");
- return;
- }
- audio.mute = false;
- audio.loop = false;
- audio.Play ();
- Debug.Log("PlayRecord");
- }
- public void LoadAndPlayRecord()
- {
- string recordPath ="your path";
- SavWav.LoadAndPlay (recordPath);
- }
- public float GetAveragedVolume()
- {
- float[] data=new float[256];
- float a=0;
- audio.GetOutputData(data,0);
- foreach(float s in data)
- {
- a+=Mathf.Abs(s);
- }
- return a/256;
- }
- // Update is called once per frame
- void Update ()
- {
- loudness = GetAveragedVolume () * sensitivity;
- if (loudness > 1)
- {
- Debug.Log("loudness = "+loudness);
- }
- }
- private IEnumerator TimeDown()
- {
- Debug.Log(" IEnumerator TimeDown()");
- int time = 0;
- while (time < RECORD_TIME)
- {
- if (!Microphone.IsRecording (null))
- { //如果没有录制
- Debug.Log ("IsRecording false");
- yield break;
- }
- Debug.Log("yield return new WaitForSeconds "+time);
- yield return new WaitForSeconds(1);
- time++;
- }
- if (time >= 10)
- {
- Debug.Log("RECORD_TIME is out! stop record!");
- StopRecord();
- }
- yield return 0;
- }
- }