如何流式传输/下载&;播放URL中的音频
本文关键字:URL 播放 音频 amp 传输 何流式 下载 | 更新日期: 2023-09-27 18:25:23
我需要在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)。
所以,你们的首要问题是确保你们的音频源是兼容的格式。
代码示例不正确,原因有三:;
- URL是https:(告诉unity从互联网下载),但随后您将文件:预挂到它(告诉unity从本地文件系统加载)。所以你应该选择其中一个
- 如果你选择https是行不通的,因为那个特定的链接(我知道这只是一个例子),但它需要用户登录该服务(并使用cookie来知道这一点),所以它不会向你发送音频文件,而是向你发送一个HTML页面,告诉用户登录或注册
- 正如@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();
}
这不会在一个帧中发生,并且需要协同程序。
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