如何stream式传输/下载和播放来自URL的audio?

我需要在iOS上运行的Unity3D中stream式传输或下载播放从URL中获取的audio。 audio来自文本到audio服务,我需要在Unity上播放:

http://api.ispeech.org/api/rest?apikey=…&action=convert&voice=eurspanishfemale&text=hola+que+tal

我一直在Google上search,没有find一个有效的解决scheme… Unity3D文档( WWW-audioClip , WWW.GetAudioClip )中有一个代码片段,但不工作,我已经debugging,错误说它可以打开文件。

using UnityEngine; using System.Collections; public class AudioURLScript : MonoBehaviour { public string url = "http://api.ispeech.org/api/rest?apikey=...&action=convert&voice=eurspanishfemale&text=hola+que+tal"; public AudioSource source; void Start() { WWW www = new WWW("file://"+url); source = GetComponent<AudioSource>(); source.clip = www.GetAudioClip(false,true); } void Update() { if (!source.isPlaying && source.clip.isReadyToPlay) source.Play(); } } 

谢谢

这是我现在的工作解决scheme。

 void Start(){ StartCoroutine(DownloadAndPlay("http://api.ispeech.org/api/rest?apikey=...&action=convert&voice=eurspanishfemale&text=Hola+que+tal")); } IEnumerator DownloadAndPlay(string url) { WWW www = new WWW(url); yield return www; AudioSource audio = GetComponent<AudioSource>(); audio.clip = www.GetAudioClip(false, true,AudioType.MPEG); audio.Play(); } 

你没有提到你所在的平台,所以我将假设Windows。

Unity Windows运行时只支持WAV或OGG。 您提供的audio服务文件的链接是作为MP2audio文件(在广播中常见)下载。 Unity将无法播放该(或MP3)。

作为参考,Android和iOS平台确实支持MP3(但不支持MP2)。

所以,你首先要确保你的audio源是兼容的格式。

代码示例不正确有三个原因。

  1. 该URL是https:(它告诉统一从互联网上下载),然后你预先挂起file:它(它告诉统一从本地文件系统加载)。 所以你应该select一个或另一个。
  2. 如果你selecthttps是因为这个特定的链接(我知道这只是一个例子),但它需要用户login到服务(并使用cookie来知道),所以它不会工作,所以它不会发送给你audio文件,它发送给你一个HTML页面,告诉用户login或注册。
  3. 正如@fafase所说,WWW必须放在一个协同例程中,以便它可以下载多个帧。

好的,这是我的build议。

如果你可以知道audio文件的时间,下载并转码到OGG(如果是Windows)或MP3(如果是移动的),并将它们上传到自己的服务器(比如Amazon S3,或者每月10美元的无限制网站)。

然后,使用此代码下载并播放它:

 StartCoroutine(DownloadAndPlay("http://myserver.com/audio/test.ogg")); IEnumerator DownloadAndPlay(string url) { WWW www = new WWW(url); yield return www; AudioSource audio = GetComponent<AudioSource>(); audio.clip = www.GetAudioClip(false, false); audio.Play(); } 

WWW对象是HTTP请求的包装,包含连接的创build,数据的传输以及连接的closures(以及一些额外的操作)。

这不会发生在一个框架,并需要一个协程。

 void Start() { StartCoroutine(GetAudio(url)); } private IEnumerator GetAudio(string url) { WWW www = new WWW("file://"+url); yield return www; if(string.IsNullOrEmpty(www.error) == false) { Debug.Log("Did not work"); yield break; } source = GetComponent<AudioSource>(); source.clip = www.GetAudioClip(false,true); }