Unity se da cuenta de la grabación y la transmisión

Unity se da cuenta de la grabación y la transmisión

introducción

Realice una pequeña función, realice la función de grabación, grabe y transmita al mismo tiempo, versión independiente.

Acceso requerido

Ahora, tanto Android como IOS deben solicitar permiso al usar el micrófono, por lo que debemos solicitar permiso antes de grabar con el micrófono.


/// <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));
        };
    }
}

empezar a grabar

La función de grabación se implementa utilizando el micrófono nativo de la unidad.


/// <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();
}

  • Debido a que se debe realizar la función de grabación en bucle, el bucle en Microphone.Start debe pasarse como verdadero.

  • La frecuencia de muestreo aquí está codificada 44100. Para uso oficial, se deben seleccionar diferentes frecuencias de muestreo según los diferentes dispositivos (Microphone.GetDeviceCaps).

  • Al elegir un dispositivo de grabación, también debe elegir el dispositivo de grabación que desea de acuerdo con la situación real. Cuando lo usa oficialmente, debe hacer un juicio no vacío del dispositivo.

  • Si este es el caso, la grabación se detendrá después de reproducir una vez. En este momento, debe llamarse en el método de actualización.

    _AudioSource.timeSamples = Microphone.GetPosition(_RecordDevice);
    

procesamiento de audio

A menudo necesitamos procesar el audio reproducido, en este momento podemos usar OnAudioFilterRead para el procesamiento.

Por ejemplo, haga una función de amplificación de volumen de audio simple.

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

O se pueden agregar algunas funciones de eliminación de ruido, y la implementación específica de eliminación de ruido no se repetirá aquí.

código completo

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;
        }
    }

}

epílogo

Si hay algo mal con la escritura, puede criticarme y corregirme.

Supongo que te gusta

Origin blog.csdn.net/yr1102358773/article/details/128223902
Recomendado
Clasificación