我正在构建一个音频播放器,它需要能够播放磁盘上的文件,这些文件在构建时是不可用的(因此用户可以自己播放音乐)。 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提交了一个错误报告,他们确认他们已经复制了这个错误,但它可能需要很长时间才能修复。因此,我希望有办法解决这个问题。答案 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()
{
}
未经测试但应该这样做。