2016-08-09 88 views
0

Derzeit arbeite ich an Streaming-Audio zu Unity über das Netzwerk, ich integrierte Medienbibliothek (GStreamer) erfolgreich mit Unity und ich konnte das Audio in der Umgebung mit Audio-Filter Rückruffunktion zu spielen Audiosource:Echtzeit-3D-Audio-Streaming und Wiedergabe

void OnAudioFilterRead(float[] data, int channels) 
{ 
     // fill data array with the streamed audio data 
     //.... 
} 

die bisherige Funktion bereitgestellt 2D Audio-Wiedergabe mit sehr geringer Latenz,

in meiner Anwendung mag ich die Audio-in 3D Spatial Raum machen, so dass die Audiowiedergabe wird auf der Kamera abhängig sein (Audio Zuhörer) Orientierung.

I Audiodaten in Audioclip mit der folgenden Stream versucht:

AudioClip TargetClip; 
public AudioSource TargetSrc; 

void Start() 
{ 
    int freq=32000; //streamed audio sampling rate 

    TargetClip = AudioClip.Create ("test_Clip", freq, 1, freq, true,true, OnAudioRead,OnAudioSetPosition); 

    TargetSrc.clip = TargetClip; 
    TargetSrc.Play(); 
} 

void OnAudioRead(float[] data) { 
     // fill data array with the streamed audio data 
     //.... 
} 

void OnAudioSetPosition(int newPosition) { 

} 

Wenn ich den Ton gespielt, das Audio wurde gemacht, als ich in 3D-Raumraum wollte, jedoch gab es eine riesige Latenzzeit (mehr als 2 Sekunden).

Gibt es eine Möglichkeit, das Latenzproblem zu lösen?

+0

Haben Sie sich die [Manual Pages] (https://docs.unity3d.com/Manual/AudioSpatializerSDK.html) angesehen? Es gibt ein sehr gutes Audio-Plugin namens [Propagate] (https://www.assetstore.unity3d.com/en/#!/content/40200), das helfen könnte. – Rob

Antwort

0

Ich habe herausgefunden, wie Sie dieses Problem lösen können.

Für diejenigen mit ähnlichen Problem, war eigentlich die Methode, die ich in erster Linie verwendet wurde nicht effizient durch Füllen der AudioClip-Daten. Ich sollte OnAudioFilterRead() in beiden Fällen verwenden, aber es sollte wie folgt für die räumliche Audio-Berechnungen werden:

public AudioSource TargetSrc; 

void Start() 
{ 
    var dummy = AudioClip.Create ("dummy", 1, 1, AudioSettings.outputSampleRate, false); 

    dummy.SetData(new float[] { 1 }, 0); 
    TargetSrc.clip = dummy; //just to let unity play the audiosource 
    TargetSrc.loop = true; 
    TargetSrc.spatialBlend=1; 
    TargetSrc.Play(); 
} 
void OnAudioFilterRead(float[] data, int channels) 
{ 
    // "data" contains the weights of spatial calculations ready by unity 
    // multiply "data" with streamed audio data 
    for(int i=0;i<data.Length;++i) 
    { 
     data[i]*=internal_getSample(i); 
    } 
} 

Hope this einige sonst helfen würde.