1.调用录音设备保存录音
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
public class MicroPhoneManager : MonoBehaviour
{
public int DeviceLength;
private void Awake()
{
DontDestroyOnLoad(this);
au= gameObject.GetComponent<AudioSource>();
if (au == null)
{
au = gameObject.AddComponent<AudioSource>();
}
}
private int Frequency = 16000; //录音频率
private int BitRate = 16; //比特率
private int MicSecond = 180; //每隔2秒,保存一下录音数据
public Button bStart;
public Button bStop;
public Button bPlay;
public Text tTip;
private AudioSource au;
private string[] devices;
private bool isHaveMicrophone = false;
void Start()
{
bStart.onClick.AddListener(OnStartClick);
bStop.onClick.AddListener(OnStopClick);
bPlay.onClick.AddListener(OnPlayClick);
devices = Microphone.devices;
DeviceLength = devices.Length;
if (devices.Length > 0)
{
isHaveMicrophone = true;
tTip.text = "设备有麦克风:" + devices[0];
}
else
{
isHaveMicrophone = false;
tTip.text = "设备没有麦克风";
}
}
void OnStartClick()
{
tTip.text += "\n开始录音....";
au.Stop();
au.loop = false;
au.mute = true;
//au.clip = Microphone.Start(devices[0], false, MicSecond, Frequency);
StartMicrophone();
}
void OnStopClick()
{
tTip.text += "\n停止录音!";
if (!Microphone.IsRecording(devices[0]))
return;
//Microphone.End(devices[0]);
StopMicrophone();
//au.Stop();
Mp3FromClip("d:/test.mp3", au.clip); //将录音保存为mp3
//WavFromClip(ClipPath, au.clip); //将录音保存为wav
}
string ClipPath
{
get
{
return Application.streamingAssetsPath + "/test.wav";
}
}
void OnPlayClick()
{
if (Microphone.IsRecording(null))
return;
if (au.clip == null)
return;
au.mute = false;
au.loop = false;
au.Play();
tTip.text += "\n播放录音....";
}
public delegate void AudioRecordHandle(AudioClip audioClip);
public AudioSource audioSource;
AudioClip micClip;
bool isMicRecordFinished = true;
List<float> micDataList = new List<float>();
float[] micDataTemp;
string micName;
public void StartMicrophone()
{
if (isHaveMicrophone)
{
tTip.text += "\n找不到设备....";
return;
}
StopCoroutine(StartMicrophone(null, PlayAudioRecord));
StartCoroutine(StartMicrophone(null, PlayAudioRecord));
}
IEnumerator StartMicrophone(string microphoneName, AudioRecordHandle audioRecordFinishedEvent)
{
Debug.Log("Start Mic");
micDataList = new List<float>();
micName = microphoneName;
micClip = Microphone.Start(micName, true, 2, 16000);
isMicRecordFinished = false;
int length = micClip.channels * micClip.samples;
bool isSaveFirstHalf = true;//将音频从中间分生两段,然后分段保存
int micPosition;
while (!isMicRecordFinished)
{
if (isSaveFirstHalf)
{
yield return new WaitUntil(() => { micPosition = Microphone.GetPosition(micName); return micPosition > length * 6 / 10 && micPosition < length; });//保存前半段
micDataTemp = new float[length / 2];
micClip.GetData(micDataTemp, 0);
micDataList.AddRange(micDataTemp);
isSaveFirstHalf = !isSaveFirstHalf;
}
else
{
yield return new WaitUntil(() => { micPosition = Microphone.GetPosition(micName); return micPosition > length / 10 && micPosition < length / 2; });//保存后半段
micDataTemp = new float[length / 2];
micClip.GetData(micDataTemp, length / 2);
micDataList.AddRange(micDataTemp);
isSaveFirstHalf = !isSaveFirstHalf;
}
}
micPosition = Microphone.GetPosition(micName);
if (micPosition <= length)//前半段
{
micDataTemp = new float[micPosition / 2];
micClip.GetData(micDataTemp, 0);
}
else
{
micDataTemp = new float[micPosition - length / 2];
micClip.GetData(micDataTemp, length / 2);
}
micDataList.AddRange(micDataTemp);
Microphone.End(micName);
AudioClip newAudioClip = AudioClip.Create("RecordClip", micDataList.Count, 1, 16000, false);
newAudi