【问题标题】:Unity3D stream audio file from diskUnity3D 从磁盘流式传输音频文件
【发布时间】:2016-03-19 00:17:56
【问题描述】:

我正在构建一个音频播放器,它需要能够播放构建时不可用的磁盘中的文件(以便用户可以放入自己的音乐)。 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 提交了一份错误报告,他们确认他们已经重现了该错误,但可能需要很长时间才能修复。因此,我希望有一种解决此问题的方法。

【问题讨论】:

  • 不相关 - 如果音频是音效等,这只是关于 Unity 的一件小事,它可能与您相关:碰巧您不能 loop mp3在统一中,你只能loop wav 或 ogg

标签: c# unity3d


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在您访问音频文件之前,我似乎没有完全下载 Track.ogg。使用isDone 确保音频完全加载并使用yield return null 而不是WaitForSeconds(0.1f) 等待而不会冻结。 www.progress &lt; 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()
        {
    
        }
    

    未测试,但应该可以。

    【讨论】:

    • 我已经尝试过您的代码,但仍然遇到同样的错误。另外,我想流式传输声音,这样我就不必等待所有文件完全下载后才能开始播放,我认为这就是 GetAudioClip 的第二个参数应该做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多