Unity实现边录边播

Unity实现边录边播

引言

实现一个小功能,实现录音功能,边录边播,单机版的。

权限申请

现在在安卓端和IOS端使用麦克风时都需要申请权限,所以在麦克风录音之前我们需要先申请权限。


/// <summary>
/// 申请麦克风权限
/// </summary>
private IEnumerator RequestPermission_Microphone(UnityAction endAction)
{
    if (Application.HasUserAuthorization(UserAuthorization.Microphone))
    {
        endAction?.Invoke();
    }
    else
    {
        AsyncOperation asyncOperation = Application.RequestUserAuthorization(UserAuthorization.Microphone);
        yield return asyncOperation;
        asyncOperation.completed += delegate (AsyncOperation async)
        {
            StartCoroutine(RequestPermission_Microphone(endAction));
        };
    }
}

开始录音

录音功能使用unity原生的Microphone来实现。


/// <summary>
/// 游戏开始
/// </summary>
private void GameStart()
{
    Debug.Log("GameStart");
    _RecordDevice = Microphone.devices[0];
    Debug.Log(_RecordDevice);
    //开始录音
    Microphone.End(_RecordDevice);
    _AudioSource.clip = Microphone.Start(_RecordDevice, true, 10, 44100);
    _AudioSource.Play();
}

  • 因为要实现循环录音的功能,所以Microphone.Start里面的loop需要传为true。

  • 这里的采样率时写死的44100,正式使用应该根据不同设备选取不同的采样率(Microphone.GetDeviceCaps)。

  • 选取录音设备的时候也需要根据实际的情况来选取自己想要的录音设备,正式使用时还需要做设备的非空判断。

  • 如果只是这样的话,录音播放一遍之后就会停止,这时候需要在Update方法中调用

    _AudioSource.timeSamples = Microphone.GetPosition(_RecordDevice);
    

音频处理

我们经常需要对播放的音频进行处理,这时候我们可以使用OnAudioFilterRead来进行处理。

比如做一个简单的音频音量放大功能。

private void OnAudioFilterRead(float[] data, int channels)
{
    //音频声音放大5倍
    for (int i = 0; i < data.Length; i++)
    {
        data[i] *= 5;
    }
}

或者可以添加一些去噪的功能,去噪的具体实现就不在这里赘述了。

完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

/// <summary>
/// 主逻辑
/// </summary>
public class TestService : MonoBehaviour
{
    /// <summary>
    /// 音频播放器
    /// </summary>
    [SerializeField]
    private AudioSource _AudioSource;

    /// <summary>
    /// 录音设备
    /// </summary>
    private string _RecordDevice;

    // Start is called before the first frame update
    void Start()
    {
        //StartCoroutine(RequestPermission_Microphone(GameStart));
        GameStart();
    }

    // Update is called once per frame
    void Update()
    {
        _AudioSource.timeSamples = Microphone.GetPosition(_RecordDevice);
    }

    /// <summary>
    /// 申请麦克风权限
    /// </summary>
    private IEnumerator RequestPermission_Microphone(UnityAction endAction)
    {
        if (Application.HasUserAuthorization(UserAuthorization.Microphone))
        {
            endAction?.Invoke();
        }
        else
        {
            AsyncOperation asyncOperation = Application.RequestUserAuthorization(UserAuthorization.Microphone);
            yield return asyncOperation;
            asyncOperation.completed += delegate (AsyncOperation async)
            {
                StartCoroutine(RequestPermission_Microphone(endAction));
            };
        }
    }

    /// <summary>
    /// 游戏开始
    /// </summary>
    private void GameStart()
    {
        Debug.Log("GameStart");
        _RecordDevice = Microphone.devices[0];
        Debug.Log(_RecordDevice);
        //开始录音
        Microphone.End(_RecordDevice);
        _AudioSource.clip = Microphone.Start(_RecordDevice, true, 10, 44100);
        _AudioSource.Play();
    }

    /// <summary>
    /// 音频处理
    /// </summary>
    /// <param name="data"></param>
    /// <param name="channels"></param>
    private void OnAudioFilterRead(float[] data, int channels)
    {
        //音频声音放大5倍
        for (int i = 0; i < data.Length; i++)
        {
            data[i] *= 2;
        }
    }

}

尾语

如果有写的不对的地方,欢迎各位大佬批评指正。

猜你喜欢

转载自blog.csdn.net/yr1102358773/article/details/128223902
今日推荐