unity 音频加载并播放

本文介绍了一个使用Unity实现的语音播放功能,通过UnityWebRequestMultimedia获取音频文件并播放。提供了两种不同方式的示例代码,包括单个音频文件的播放及多个音频文件的连续播放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好久没更新博客了,利用这十分钟来写篇服务器语音识别后播放的语音功能

PC端
直接上代码:

namespace Jeremy {
    public class AudioPlayCtrl : MonoBehaviour {
        public static AudioPlayCtrl instance { get; private set; }
        public AudioSource audioSource { get; set; }
        private AudioClip _IntroduceClip;
        private void Awake() {
            instance = this;
            audioSource = transform.GetComponent<AudioSource>();
            if (audioSource == null) {
                audioSource = transform.gameObject.AddComponent<AudioSource>();
            }
        }
        Coroutine AudioPlay;
        public void Play(params string[] urls) {
            if (AudioPlay != null)
                StopCoroutine(AudioPlay);// StopAllCoroutines();
            AudioPlay = StartCoroutine(GetIntroduceAudioClip(audioSource, urls));
        }
        IEnumerator GetIntroduceAudioClip(AudioSource _aud, params string[] url) {
            _aud.Stop();
            //  MPEG:mp3    OGGVORBIS:ogg    WAV:wav
            AudioType audioType = AudioType.MPEG;
            for (int i = 0; i < url.Length; i++) {
                if (url[i] != "") {
                    var uwr = UnityWebRequestMultimedia.GetAudioClip(url[i], audioType);
                    yield return uwr.SendWebRequest();      // 完成加载

                    if (!uwr.isNetworkError && uwr.isDone) {
                        _IntroduceClip = DownloadHandlerAudioClip.GetContent(uwr);

                        _aud.clip = _IntroduceClip;       // 样本完成
                        _aud.Play();

                        if (url.Length > 1 && i < url.Length - 1)
                            yield return new WaitForSeconds(_aud.clip.length + 0.5f);
                    }
                    else
                        Debug.LogError(uwr.error);
                }

            }
        }
    }
}

调用:
在这里插入图片描述
效果图:
在这里插入图片描述
WebGL

语音下载播放做法

        Coroutine AudioPlay;
        AudioClip downloadedClip;
        public AudioSource audioSource { get; set; }
        public void Play(params string[] urls) {
            StopPlaying();
            AudioPlay = StartCoroutine(LoadAudioClips(urls));
        }
        IEnumerator LoadAudioClips(string[] audioUrls) {

            foreach (string url in audioUrls) {
                if (url != null && url != "")
                    using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(url, AudioType.MPEG)) {
                        yield return www.SendWebRequest();

                        if (www.result == UnityWebRequest.Result.ConnectionError ||
                            www.result == UnityWebRequest.Result.ProtocolError) {
                            Debug.LogError("Failed to load audio: " + url + ", error: " + www.error);
                        }
                        else {
                            downloadedClip = DownloadHandlerAudioClip.GetContent(www);
                            audioSource.clip = downloadedClip;
                            audioSource.Play();
                            //Debug.Log(url);
                            while (audioSource.isPlaying) {
                                yield return null;
                            }
                        }
                    }
            }
        }
        public void StopPlaying() {
            if (AudioPlay != null) {
                StopCoroutine(AudioPlay);
            }
            audioSource.Stop();
        }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值