【问题标题】:How to stream/download&play an audio from URL?如何从 URL 流式传输/下载和播放音频?
【发布时间】:2015-12-02 12:35:46
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# ios audio unity3d


    【解决方案1】:

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

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

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

    因此,您的首要任务是确保您的音频源格式兼容。

    代码示例不正确有 3 个原因;

    1. URL 是 https:(它告诉 unity 从 Internet 下载),但是您预先将 file: 附加到它(它告诉 unity 从本地文件系统加载)。所以你应该选择其中一个。
    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();
    }
    

    【讨论】:

    • 对不起,它将在 iOS 上运行,是的,我在代码上的 url 不是最好的例子。我真正需要的是播放来自文本到音频服务的声音,因为它将由人工智能动态生成(从提要中读取新闻等)
    • 通常这样的服务会让您创建一个帐户,然后为您提供令牌和/或密钥。然后,您将通过通常以 JSON 格式的 REST API 与它进行通信。 API 将允许您请求翻译并提供一种机制来通过直接链接下载所需的音频文件 - 这是您将在答案中提供给 WWW 调用的链接。
    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2018-08-27
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多