【Unity学习】使用Unity自带API录制音频,自动根据录制时间调整音频大小

using Cysharp.Threading.Tasks;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using UnityEngine;


    public class VoiceInputs : MonoBehaviour
    {
        /// <summary>
        /// 录制的最大音频长度
        /// </summary>
        public int m_MaxRecordingLength = 60;
        [SerializeField] private AudioClip m_TrimmedClip;
        private AudioClip m_OrigionRecording;
        private int m_RecordingFrequency = 16000;
        [SerializeField] private float _time;
        private CancellationTokenSource _cancelToken;

        private void Start()
        {
            _cancelToken = new CancellationTokenSource();
        }

        /// <summary>
        /// 开始录制声音
        /// </summary>
        public void StartRecordAudio()
        {
            m_OrigionRecording = Microphone.Start(null, false, m_MaxRecordingLength, m_RecordingFrequency);
            GetRecordingTime().Forget();
        }

        private async UniTaskVoid GetRecordingTime()
        {
            _time = 0;
            while (true)
            {
                await UniTask.Yield(cancellationToken: _cancelToken.Token);
                _time += Time.deltaTime;
            }
        }

        /// <summary>
        /// 结束录制,返回audioClip
        /// </summary>
        /// <param name="_callback"></param>
        public void StopRecordAudio(Action<AudioClip> _callback)
        {
            // 停止录制
            Microphone.End(null);
            _cancelToken.Cancel();
            _cancelToken.Dispose();
            _cancelToken = new CancellationTokenSource();
            TrimAudioClip(_callback);
        }

        private void TrimAudioClip(Action<AudioClip> _callback)
        {
            // 计算截取的样本数
            int startSample = Mathf.FloorToInt(0 * m_OrigionRecording.frequency);
            int endSample = Mathf.FloorToInt(_time * m_OrigionRecording.frequency);
            int length = endSample - startSample;

            // 创建截取后的音频数据数组
            float[] data = new float[length * m_OrigionRecording.channels];
            m_OrigionRecording.GetData(data, startSample * m_OrigionRecording.channels);

            for (int i = 0; i < data.Length; ++i)
            {
                data[i] = data[i] * 0.5f;
            }

            // 创建截取后的AudioClip
            m_TrimmedClip = AudioClip.Create("TrimmedClip", length, m_OrigionRecording.channels, m_OrigionRecording.frequency, false);
            m_TrimmedClip.SetData(data, 0);

            // 可以将trimmedClip用于播放或保存等操作
            _callback?.Invoke(m_TrimmedClip);
        }

        private void OnDestroy()
        {
            _cancelToken.Cancel();
            _cancelToken.Dispose();
        }
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值