錄音類
MicrophoneManager包含開始錄音,停止錄音,播放錄音以及錄音的保存等。
public partial class MicrophoneManager : MonoBehaviour { private static MicrophoneManager m_instance; private static string[] micArray = null; //錄音設備列表 private AudioClip audioClip; private DateTime beginTime; public float sensitivity=100; public float loudness=0; const int HEADER_SIZE = 44; const int RECORD_TIME = 10; const int RECORD_RATE = 44100; //錄音采樣率 //void Awake() //{ // m_instance = this; //} public static MicrophoneManager GetInstance() { if (m_instance == null) { micArray = Microphone.devices; if (micArray.Length == 0) { Debug.LogError("no mic device"); } foreach (string deviceStr in Microphone.devices) { Debug.Log("device name = " + deviceStr); } GameObject micManager=new GameObject("MicManager"); m_instance= micManager.AddComponent<MicrophoneManager>(); } return m_instance; } /// <summary> /// 開始錄音 /// </summary> public void StartRecord() { if (micArray.Length == 0) { Debug.Log("No Record Device!"); return; } Microphone.End(null);//錄音時先停掉錄音,錄音參數為null時采用默認的錄音驅動 beginTime = DateTime.Now; audioClip = Microphone.Start(null, false, RECORD_TIME, RECORD_RATE); while (!(Microphone.GetPosition(null)>0)) { } Debug.Log("StartRecord"); } /// <summary> /// 停止錄音 /// </summary> public void StopRecord() { if (micArray.Length == 0) { Debug.Log("No Record Device!"); return; } if (!Microphone.IsRecording(null)) { return; } Microphone.End (null); Debug.Log("StopRecord"); } /// <summary> ///播放錄音 /// </summary> public void PlayRecord() { PlayRecord(audioClip); } public void PlayRecord(AudioClip clip) { PlayRecord(clip,Vector3.zero); } public void PlayRecord(AudioClip clip, Vector3 pos) { if (clip == null) { Debug.Log("audioClip is null"); return; } AudioSource.PlayClipAtPoint(clip, pos); Debug.Log("PlayRecord"); } public byte[] Save() { if (audioClip == null) return null; return WavUtility.FromAudioClip(audioClip); } public void Save(string path,string filename) { Save(audioClip,path,filename); } public void Save(AudioClip clip, string path, string filename) { if (clip == null) { Debug.Log("clip is null,can't be saved"); return; } WavUtility.FromAudioClip(clip, path, filename, true); } public AudioClip Read(string path) { return WavUtility.ToAudioClip(path); } public AudioClip Read(byte[] data) { return WavUtility.ToAudioClip(data); } public JObject SaveAudioClip() { JObject jd = new JObject(); jd["time"] = beginTime.ToString("yyMMdd-HHmmss-fff"); //jd["time"] = beginTime.ToFileTime(); //使用Unicode編碼,其他編碼格式會有問題 jd["audioclip"] = Encoding.Unicode.GetString(Save()); return jd; } }
錄音的保存
WavUtility是對錄音數據的保存和讀取,可以保存為本地文件.wav或者byte數組進行傳輸。這個東東是我從github上發現的,由於代碼太長就不貼了,網址放上:https://github.com/deadlyfingers/UnityWav
重要的方法
/// - Use "ToAudioClip" method for loading wav file / bytes.
/// Loads .wav (PCM uncompressed) files at 8,16,24 and 32 bits and converts data to Unity's AudioClip.
/// - Use "FromAudioClip" method for saving wav file / bytes.
/// Converts an AudioClip's float data into wav byte array at 16 bit.
public static AudioClip ToAudioClip (string filePath)
public static AudioClip ToAudioClip (byte[] fileBytes, int offsetSamples = 0, string name = "wav")
public static byte[] FromAudioClip (AudioClip audioClip)
public static byte[] FromAudioClip (AudioClip audioClip,string filepath,string filename, bool saveAsFile = true)
錄音的回放
為了方便回放,又不額外引入其他文件來記錄回放時間與錄音的對應信息,將錄音時間作為文件名(ex:170515-114114-676),並在開始的時候錄一個空錄音作為起始時間,回放代碼如下:
IEnumerator PlayAudioClip() { string[] files = Directory.GetFiles(savePath); if (files.Length > 0) { List<string> temp = new List<string>(); for (int i = 0; i < files.Length; i++) { if (!files[i].Contains(".meta")) temp.Add(files[i]); } string[] audioFiles = temp.ToArray(); Array.Sort(audioFiles); float interval = 0f; for (int i = 0; i < audioFiles.Length - 1; i++) { AudioClip clip = MicrophoneManager.GetInstance().Read(audioFiles[i]); MicrophoneManager.GetInstance().PlayRecord(clip); interval = (float)(GetTime(audioFiles[i + 1]) - GetTime(audioFiles[i])).TotalSeconds; Debug.Log(interval); yield return new WaitForSeconds(interval); } MicrophoneManager.GetInstance().PlayRecord ( MicrophoneManager.GetInstance().Read(audioFiles[audioFiles.Length - 1]) ); } }
