Можно ли получить аудиоданные с аудиоустройства пользователя с помощью NAudio для передачи в Unity3D для визуализации - PullRequest
1 голос
/ 03 апреля 2012

То, что я пытаюсь сделать, это взять необработанный звук с аудиовыхода пользователя, взять эти данные и получить спектр аудиосигнала и выходной массив, аналогичный unity3d, и передать эти данные моему визуализатору.

Итак, паравещи, которые мне нужно знать:

  1. Могу ли я получить необработанный звук с устройства пользователя?До сих пор я обнаружил, что да, используя waveinstream, который по умолчанию получает аудиоданные со всех устройств.
  2. Можно ли получить спектр аудиосигнала и выводить эти данные аналогично методам Unity3D GetOutputData () и GetSpectrumData ()?Демонстрация NAudio предоставляет аналогичную функциональность, но не совсем то, что мне нужно.

Я новичок в кодировании naudio, в то время как API от Unity и чрезвычайно тщательная документация делают это проще, у naudio, кажется, есть пара уроков и примеров., ничего из того, что мне нужно, и никаких определений API.В конце концов я это выясню, но мне нужно знать, возможно ли то, что я пытаюсь сделать, кроме того, что любая помощь приветствуется.

Я предоставил свою попытку решения задачи 1, которая дает, казалось бы, случайные данные, которые япытаюсь разобраться в использовании WaveFileReader, но он вылетает


using UnityEngine;
using System.Collections;
using System;
using NAudio.Wave;
using NAudio.CoreAudioApi;
using NAudio.Utils;

public class myNAudio : MonoBehaviour {

private WaveIn waveInStream;
private WaveFileReader reader;
private WaveStream readerStream;

void waveInStream_DataAvailable(object sender, WaveInEventArgs e){
    //reader.Read(e.Buffer,0,e.BytesRecorded);
    //Debug.Log(e.Buffer);

    float tempDB = 0;
    for(int i = 0; i < e.Buffer.Length; i++){
        //Debug.Log(i + " = " +e.Buffer[i]);
        tempDB += (float)e.Buffer[i]/255;
    }
    Debug.Log(e.Buffer.Length + ", " +tempDB);  
}

void OnApplicationQuit(){
    waveInStream.StopRecording();
    waveInStream.Dispose();
    waveInStream = null;
}

void OnDisable(){
    waveInStream.StopRecording();
    waveInStream.Dispose();
    waveInStream = null; 
}

// Use this for initialization
void Start () {

    waveInStream = new WaveIn();
    waveInStream.DeviceNumber = 0;

    waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable);
    waveInStream.StartRecording();
}

// Update is called once per frame
void Update () {
}
}
...