То, что я пытаюсь сделать, это взять необработанный звук с аудиовыхода пользователя, взять эти данные и получить спектр аудиосигнала и выходной массив, аналогичный unity3d, и передать эти данные моему визуализатору.
Итак, паравещи, которые мне нужно знать:
- Могу ли я получить необработанный звук с устройства пользователя?До сих пор я обнаружил, что да, используя waveinstream, который по умолчанию получает аудиоданные со всех устройств.
- Можно ли получить спектр аудиосигнала и выводить эти данные аналогично методам 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 () {
}
}