Как читать данные из AudioClip с помощью PCMReaderCallback, когда первый создается Microphone.Start в Unity? - PullRequest
0 голосов
/ 19 ноября 2018

Как изменить приведенный ниже код, чтобы использовать PCMReaderCallback для чтения данных из аудиоклипа, созданного Microphone.Start?

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

public class NewBehaviourScript : MonoBehaviour
{
    private string m_deviceName = null;
    private AudioClip m_audioClip;

    void Start()
    {
        bool loop = true;
        int lengthSec = 10;
        int frequency = 44100;

        m_audioClip = Microphone.Start(m_deviceName, loop, lengthSec, frequency);
    }

    void Stop()
    {
        Microphone.End(m_deviceName);
        m_audioClip = null;
    }
}

1 Ответ

0 голосов
/ 19 ноября 2018

Вы не можете использовать API микрофона с PCMReaderCallback.Это связано с тем, что PCMReaderCallback регистрируется путем передачи функции PCMReaderCallback в функцию AudioClip.Create, которая возвращает новый AudioClip.Функция Unity Microphone.Start возвращает AudioClip, но не принимает PCMReaderCallback в качестве аргумента.

Если это не микрофон, а простой аудиоклип, вы можете использовать следующий пример:

public int lengthSamples = 400;
public int channels = 2;
public int frequency = 16000;

AudioSource adSource;

void Start()
{
    adSource = GetComponent<AudioSource>();
    AudioClip clip = AudioClip.Create("clip", lengthSamples, channels, frequency, true, OnAudioRead);
    adSource.clip = clip;
    adSource.Play();
}

//PCMReaderCallback callback
void OnAudioRead(float[] data)
{

}

Если вы просто хотите прочитать аудиоданные с микрофона,вы все еще можете использовать OnAudioFilterRead или функцию AudioSource.clip.GetData.Ниже приведен пример для OnAudioFilterRead.

string m_deviceName = null;
AudioSource adSource;

void Start()
{
    adSource = GetComponent<AudioSource>();
    bool loop = true;
    int lengthSec = 10;
    int frequency = 44100;

    AudioClip clip = Microphone.Start(m_deviceName, loop, lengthSec, frequency);
    adSource.clip = clip;
    while (!(Microphone.GetPosition(null) > 0)) { }

    adSource.Play();
}

void OnAudioFilterRead(float[] data, int channels)
{

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...