来自磁盘的Unity3D流音频文件

时间:2016-03-15 16:07:29

标签: c# unity3d

我正在构建一个音频播放器,它需要能够播放磁盘上的文件,这些文件在构建时是不可用的(因此用户可以自己播放音乐)。 OGG / WAV文件很好,我需要支持Windows和OSX。我已尝试使用WWW类:

using UnityEngine;
using System.Collections;
using System.IO;

public class LoadAudio : MonoBehaviour
{
    AudioSource audioSrc;

    // Use this for initialization
    void Start()
    {
        if(audioSrc == null) audioSrc = new AudioSource();
        StartCoroutine(LoadTrack(Path.Combine(Application.streamingAssetsPath, "Track.ogg")));
    }

    IEnumerator LoadTrack(string filename)
    {
        var www = new WWW(filename);

        while(www.progress < 0.2)
        {
            Debug.LogFormat("Progress loading {0}: {1}", filename, www.progress);
            yield return new WaitForSeconds(0.1f);
        }

        var clip = www.GetAudioClip(false, true, AudioType.OGGVORBIS);

        audioSrc.clip = clip;
        audioSrc.Play();
    }

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

    }
}

然而,当我运行这个时,我的调试日志消息打印出几次进度为0,然后我收到一个在控制台中看不到的错误。在编辑器日志中,我可以看到此错误:

Error: Cannot create FMOD::Sound instance for resource D (Operation could not be performed because specified sound/DSP connection is not ready. )
UnityEngine.WWW:GetAudioClipInternal(Boolean, Boolean, Boolean, AudioType)
UnityEngine.WWW:GetAudioClip(Boolean, Boolean, AudioType) (at C:\buildslave\unity\build\artifacts\generated\common\runtime\UtilsBindings.gen.cs:334)
<LoadTrack>c__Iterator0:MoveNext() (at Assets\LoadAudio.cs:27)

此错误看起来与此Unity bug report中提出的错误类似,但是在版本5.3.0中我认为这已经修复了,我使用的是5.3.4。

假设这不是Unity中的错误,我做错了什么?如果这是一个错误,那么有人知道一个解决方法吗?

编辑:我向Unity提交了一个错误报告,他们确认他们已经复制了这个错误,但它可能需要很长时间才能修复。因此,我希望有办法解决这个问题。

2 个答案:

答案 0 :(得分:2)

file://添加到文件路径的开头已经解决了这个问题。

答案 1 :(得分:1)

在您访问音频文件之前,我看起来没有完全下载 Track.ogg 。使用isDone确保音频完全加载并使用yield return null代替WaitForSeconds(0.1f)等待而不会冻结。 www.progress < 0.2是一种糟糕的方式。

AudioSource audioSrc;

    // Use this for initialization
    void Start()
    {
        if(audioSrc == null) audioSrc = new AudioSource();
        StartCoroutine(LoadTrack(Path.Combine(Application.streamingAssetsPath, "Track.ogg")));
    }

    IEnumerator LoadTrack(string filename)
    {
        var www = new WWW(filename);

        //Wait for file finish loading
        while(!www.isDone)
        {
            Debug.LogFormat("Progress loading {0}: {1}", filename, www.progress);
            yield return null;
        }

        var clip = www.GetAudioClip(false, true, AudioType.OGGVORBIS);

        audioSrc.clip = clip;
        audioSrc.Play();
    }

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

    }

未经测试但应该这样做。