2015-12-02 131 views
2

我需要流式处理或下载并播放iOS中运行的Unity3D中的URL。 音频来自一个文本到音频业务,我需要发挥它统一:如何从URL流式传输/下载和播放音频?

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

我一直在谷歌上搜索所有的早上没有找到有效的解决办法... 有Unity3D文档中的代码片段(WWW-audioClip,WWW.GetAudioClip),但不起作用,我已调试过,错误表示无法打开文件。

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

    } 
} 

感谢

SOLUTION

这是我工作的解决方案现在。

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

回答

2

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

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

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

所以,你的第一个问题是确保你的音频源是兼容的格式。

代码示例不正确,原因有三:

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

好的,这是我的建议。

如果你可以知道音频文件的时间头,下载它们并转码到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(); 
} 
+0

对不起,这将iOS上运行的,是的,我对代码的网址是不是最好的例子。我真正需要的是播放来自文本到音频服务的声音,因为它会由AI产生(读取来自Feed等新闻的消息) – MaDowen

+0

通常这样的服务可以让您创建一个帐户,然后为您提供一个令牌和/或密钥。然后,您将通过REST API与JSON进行通信。该API可让您请求翻译并提供一种机制,通过直接链接下载所需的音频文件 - 这就是您在答案中提供给WWW电话的链接。 – peterept

2

甲WWW对象为HTTP请求的包装器,包含在创建连接时,数据的传送和连接(和一些额外的动作)的关闭。

这不会发生在一帧中,并需要一个协程。

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); 
} 
相关问题