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



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

http://api.ispeech.org/api/rest?apikey=...&action=转换&voice=欧洲雌性&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();
}

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

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

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

所以,你们的首要问题是确保你们的音频源是兼容的格式。

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

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

好的,这是我的建议。

如果你能提前知道音频文件,下载它们并转码为OGG(如果是windows)或MP3(如果是移动设备),然后上传到你自己的服务器(比如亚马逊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);
}

WWW包已被弃用,Unity3D建议将UnityWebRequest包用于API通信。

尝试以下代码片段从URL下载音频,并使用AudioSource gameObject进行播放。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class DownloadAndPlay : MonoBehaviour
{
    public AudioSource audioSource;
    // Start is called before the first frame update
    void Start()
    {
        string URL = "http://api.ispeech.org/api/rest?apikey=...&action=convert&voice=eurspanishfemale&text=hola+que+tal";
        StartCoroutine(DownloadAudio(URL));
    }
    // Update is called once per frame
    void Update()
    {
        
    }
    IEnumerator DownloadAudio(string URL) {
        using (UnityWebRequest www_audio = UnityWebRequestMultimedia.GetAudioClip(URL, AudioType.MPEG)) {
            yield return www_audio.SendWebRequest();
            if (www_audio.isNetworkError) {
                Debug.Log(www_audio.error);
            } else {
                AudioClip clip = DownloadHandlerAudioClip.GetContent(www_audio);
                audioSource.clip = clip;
                audioSource.Play();
            }
        }
    }
}

更多信息:https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest.html

最新更新