直接掛載到組件上面扔仓,打包apk測試即可
using UnityEngine;
/// <summary>
/// 錄音播放
/// </summary>
public class MicroPhoneManager : MonoBehaviour
{
/// <summary>
/// 設(shè)備長度
/// </summary>
public int DeviceLength;
/// <summary>
/// 錄音頻率
/// </summary>
public string Frequency = "5000";
/// <summary>
/// 錄音采樣率
/// </summary>
public int Samplerate = 44100;
public int MicSecond = 2;
string infoLog = "";
AudioSource _curAudioSource;
AudioSource CurAudioSource
{
get
{
if (_curAudioSource == null)
{
_curAudioSource = gameObject.AddComponent<AudioSource>();
}
return _curAudioSource;
}
}
#region [public Way]
/// <summary>
/// 獲取麥克風(fēng)設(shè)備
/// </summary>
public void GetMicrophoneDevice()
{
string[] mDevice = Microphone.devices;
DeviceLength = mDevice.Length;
if (DeviceLength == 0)
ShowInfoLog("找不到麥克風(fēng)設(shè)備!");
}
/// <summary>
/// 開始錄音
/// </summary>
public void StartRecordAudio()
{
CurAudioSource.Stop();
CurAudioSource.loop = false;
CurAudioSource.mute = true;
CurAudioSource.clip = Microphone.Start(null, true, MicSecond, int.Parse(Frequency));
while (!(Microphone.GetPosition(null) > 0))
{
}
CurAudioSource.Play();
ShowInfoLog("開始錄音.....");
}
/// <summary>
/// 停止錄音
/// </summary>
public void StopRecordAudio()
{
ShowInfoLog("結(jié)束錄音.....");
if (!Microphone.IsRecording(null))
return;
Microphone.End(null);
CurAudioSource.Stop();
}
/// <summary>
/// 回放錄音
/// </summary>
public void PlayRecordAudio()
{
if (Microphone.IsRecording(null))
return;
if (CurAudioSource.clip == null)
return;
CurAudioSource.mute = false;
CurAudioSource.loop = false;
CurAudioSource.Play();
ShowInfoLog("播放錄音.....");
}
/// <summary>
/// 打印錄音信息
/// </summary>
public void PrintRecordData()
{
if (Microphone.IsRecording(null))
return;
byte[] data = GetClipData();
string infoLog = "total length:" + data.Length + " time:" + CurAudioSource.time;
ShowInfoLog(infoLog);
}
/// <summary>
/// 獲取音頻數(shù)據(jù)
/// </summary>
/// <returns>The clip data.</returns>
public byte[] GetClipData()
{
if (CurAudioSource.clip == null)
{
ShowInfoLog("缺少音頻資源施敢!");
return null;
}
float[] samples = new float[CurAudioSource.clip.samples];
CurAudioSource.clip.GetData(samples, 0);
byte[] outData = new byte[samples.Length * 2];
int reScaleFactor = 32767;
for (int i = 0; i < samples.Length; i++)
{
short tempShort = (short)(samples[i] * reScaleFactor);
byte[] tempData = System.BitConverter.GetBytes(tempShort);
outData[i * 2] = tempData[0];
outData[i * 2 + 1] = tempData[1];
}
if (outData == null || outData.Length <= 0)
{
ShowInfoLog("獲取音頻數(shù)據(jù)失敗军洼!");
return null;
}
return outData;
}
#endregion
void OnGUI()
{
if (DeviceLength == 0)
{
if (ShowGUIButton("獲取麥克風(fēng)設(shè)備"))
{
GetMicrophoneDevice();
}
}
else if (DeviceLength > 0)
{
GUILayout.Label("錄音頻率:");
Frequency = GUILayout.TextField(Frequency, GUILayout.Width(Screen.width / 5), GUILayout.Height(Screen.height / 20));
GUILayout.BeginVertical();
if (ShowGUIButton("開始錄音"))
{
StartRecordAudio();
}
if (ShowGUIButton("結(jié)束錄音"))
{
StopRecordAudio();
}
if (ShowGUIButton("回放錄音"))
{
PlayRecordAudio();
}
if (ShowGUIButton("獲取錄音數(shù)據(jù)"))
{
PrintRecordData();
}
GUILayout.EndVertical();
}
GUILayout.Label(infoLog);
}
#region [Private Way]
/// <summary>
/// 顯示GUI 按鈕
/// </summary>
/// <returns><c>true</c>, if GUI button was shown, <c>false</c> otherwise.</returns>
/// <param name="buttonName">Button name.</param>
bool ShowGUIButton(string buttonName)
{
return GUILayout.Button(buttonName, GUILayout.Height(Screen.height / 20), GUILayout.Width(Screen.width / 5));
}
void ShowInfoLog(string info)
{
infoLog += info;
infoLog += "\r\n";
}
#endregion
}