unity 录音功能

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值