如何从URL流式传输/下载和播放音频?

时间:2015-12-02 12:35:46

标签: c# ios audio unity3d

我需要流式传输或下载并播放从iOS3上运行的Unity3D中的URL获取的音频。 音频来自文本到音频服务,我需要在Unity上播放它:

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

我整个上午一直在谷歌搜索,没有找到有效的解决方案...... Unity3D文档中有一个代码段(WWW-audioClipWWW.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();
}

2 个答案:

答案 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个原因;

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

    如果您能够及时了解音频文件,请下载并转码为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();
    }