实时3D音频流和播放

时间:2016-08-09 06:18:03

标签: audio unity3d

目前,我正致力于通过网络将音频流传输到Unity,我成功地将媒体库(GStreamer)与Unity集成,并且我能够使用连接到AudioSource的音频过滤器回调函数在环境中播放音频:

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

之前的功能提供了具有极低延迟的2D音频播放,

在我的应用程序中,我想在3D Spatial空间中渲染音频,因此音频渲染将取决于摄像机(音频监听器)方向。

我尝试使用以下内容将音频数据流式传输到AudioClip:

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) {

}

当我播放音频时,音频在3D空间空间中呈现为我想要的,但是有很长的延迟(超过2秒)。

有没有办法解决延迟问题?

1 个答案:

答案 0 :(得分:0)

我想出了如何解决这个问题。

对于那些面临类似问题的人来说,实际上我首先使用的方法是填写AudioClip数据效率不高。在任何一种情况下我都应该使用OnAudioFilterRead(),但它应该如下用于空间音频计算:

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

希望这会对其他人有所帮助。