我需要流式传输或下载并播放从iOS3上运行的Unity3D中的URL获取的音频。 音频来自文本到音频服务,我需要在Unity上播放它:
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();
}
}
由于
解
这是我现在的工作解决方案。
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();
}
答案 0 :(得分: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);
}
答案 1 :(得分:2)
你没有提到你所在的平台,所以我将假设Windows。
Unity Windows运行时仅支持WAV或OGG。您提供的音频服务文件的链接正在下载为MP2音频文件(在广播中很常见)。 Unity将无法播放(或MP3)。
作为参考,Android和iOS平台支持MP3(但不支持MP2)。
因此,您首先要确保您的音频源是兼容的格式。
代码示例不正确有3个原因;
好的,这就是我的建议。
如果您能够及时了解音频文件,请下载并转码为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();
}