如何从URL流式传输/下载和播放音频?
问题描述:
我需要流式处理或下载并播放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();
}
答
你没有提到你所在的平台,所以我将假定Windows。
Unity Windows运行时只支持WAV或OGG。您提供的音频服务文件的链接是作为MP2音频文件下载(在广播中常见)。 Unity将无法播放该(或MP3)。
作为参考,Android和iOS平台确实支持MP3(但不支持MP2)。
所以,你的第一个问题是确保你的音频源是兼容的格式。
代码示例不正确,原因有三:
- URL是https:(它告诉统一从网上下载),但是然后你预先挂接file:它(它告诉统一从本地文件系统加载)。所以你应该选择一个或另一个。
- 如果你选择https是因为这个特定的链接(我知道这只是一个例子),但它需要用户登录到服务(并使用cookie来知道),所以它不会工作,所以它不会向你发送一个音频文件,它会向你发送一个告诉用户登录或注册的HTML页面。
- 正如@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();
}
答
甲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);
}
对不起,这将iOS上运行的,是的,我对代码的网址是不是最好的例子。我真正需要的是播放来自文本到音频服务的声音,因为它会由AI产生(读取来自Feed等新闻的消息) – MaDowen
通常这样的服务可以让您创建一个帐户,然后为您提供一个令牌和/或密钥。然后,您将通过REST API与JSON进行通信。该API可让您请求翻译并提供一种机制,通过直接链接下载所需的音频文件 - 这就是您在答案中提供给WWW电话的链接。 – peterept