using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
using System.IO;
public class AudioRecorder : MonoBehaviour
{
[Header("UI References")]
public Button recordButton;
public Button pauseButton;
public Button stopButton;
public Button saveButton;
public Button CloseBt;
public InputField FileName;
public Text statusText;
public GameObject RecorderInterface;
[Header("Settings")]
public int sampleRate = 44100;
public int maxRecordingTime = 300; // 单次最大录音时长(秒)
private List<float> recordedSamples = new List<float>();
private AudioClip currentClip;
private string microphoneDevice;
private bool isRecording;
private bool isPaused;
void Start()
{
// 初始化UI状态
pauseButton.interactable = false;
stopButton.interactable = false;
saveButton.interactable = false;
FileName.gameObject.SetActive(false);
// 检查麦克风
if (Microphone.devices.Length == 0)
{
statusText.text = "未检测到麦克风";
recordButton.interactable = false;
return;
}
// 绑定事件
recordButton.onClick.AddListener(StartRecording);
pauseButton.onClick.AddListener(PauseRecording);
stopButton.onClick.AddListener(StopRecording);
saveButton.onClick.AddListener(SaveRecording);
CloseBt.onClick.AddListener(CloseRecorder);
}
void CloseRecorder()
{
if (isRecording)
{
Microphone.End(microphoneDevice);
}
if (currentClip != null)
{
Destroy(currentClip);
}
RecorderInterface.SetActive(false);
}
void StartRecording()
{
// 如果是继续录制,保留之前数据
if (!isPaused)
{
recordedSamples.Clear();
}
currentClip = Microphone.Start(microphoneDevice, false, maxRecordingTime, sampleRate);
isRecording = true;
isPaused = false;
// 更新UI
recordButton.interactable = false;
pauseButton.interactable = true;
stopButton.interactable = true;
saveButton.interactable = false;
FileName.gameObject.SetActive(false);
statusText.text = "录音中...";
}
void PauseRecording()
{
if (!isRecording) return;
// 获取当前录音数据
float[] samples = new float[currentClip.samples * currentClip.channels];
currentClip.GetData(samples, 0);
// 计算有效录音长度
int position = Microphone.GetPosition(microphoneDevice);
float[] validSamples = new float[position];
System.Array.Copy(samples, validSamples, position);
// 保存到缓存
recordedSamples.AddRange(validSamples);
// 停止麦克风
Microphone.End(microphoneDevice);
Destroy(currentClip);
isRecording = false;
isPaused = true;
// 更新UI
recordButton.interactable = true;
pauseButton.interactable = false;
statusText.text = $"已暂停 (总时长: {recordedSamples.Count / sampleRate:F1}秒)";
}
void StopRecording()
{
// 更新UI
recordButton.interactable = false;
pauseButton.interactable = false;
FileName.gameObject.SetActive(true);
// 生成最终音频
if (recordedSamples.Count > 0)
{
saveButton.interactable = true;
statusText.text = $"准备保存 (总时长: {recordedSamples.Count / sampleRate:F1}秒) - 请输入文件名";
}
}
void SaveRecording()
{
if (recordedSamples.Count == 0) return;
// 检查文件名是否为空
if (string.IsNullOrWhiteSpace(FileName.text))
{
statusText.text = "请输入有效的文件名!";
return;
}
// 创建最终AudioClip
AudioClip finalClip = AudioClip.Create(
"CombinedRecording",
recordedSamples.Count,
1, // 单声道
sampleRate,
false
);
finalClip.SetData(recordedSamples.ToArray(), 0);
// 处理文件名(移除非法字符)
string safeFileName = string.Join("_", FileName.text.Split(Path.GetInvalidFileNameChars()));
// 保存为WAV
string filePath = Path.Combine(
Application.persistentDataPath,
$"{safeFileName}.wav"
);
byte[] wavData = WavUtility.FromAudioClip(finalClip);
File.WriteAllBytes(filePath, wavData);
// 更新UI
statusText.text = $"已保存到: {filePath}";
saveButton.interactable = false;
FileName.text = "";
FileName.gameObject.SetActive(false);
RecorderInterface.SetActive(false);
// 清理
Destroy(finalClip);
}
void OnDestroy()
{
if (isRecording) Microphone.End(microphoneDevice);
if (currentClip != null) Destroy(currentClip);
}
}
unity 录音功能
最新推荐文章于 2026-03-22 00:50:06 发布

1252

被折叠的 条评论
为什么被折叠?



