• Unity3D动态加载音频文件


    Unity3D支持的音频格式有WAV、OGG、MP3等格式。

    动态加载音频分为加载内部音频和加载外部音频。

    加载内部音频,使用 Resources.Load<AudioClip>("audio") 方法就可以轻松搞定,没什么好说的。

    加载外部音频,我们需要使用 WWW 类或者是 UnityWebRequestMultimedia 类,代码分别如下:

     1     private IEnumerator IELoadExternalAudioWebRequest(string _url, AudioType _audioType)
     2     {
     3         UnityWebRequest _unityWebRequest = UnityWebRequestMultimedia.GetAudioClip(_url, _audioType);
     4         yield return _unityWebRequest.SendWebRequest();
     5         if (_unityWebRequest.isHttpError || _unityWebRequest.isNetworkError)
     6         {
     7             Debug.Log(_unityWebRequest.error.ToString());
     8         }
     9         else
    10         {
    11             AudioClip _audioClip = DownloadHandlerAudioClip.GetContent(_unityWebRequest);
    12             audioSource.clip = _audioClip;
    13             audioSource.Play();
    14         }
    15     }
    16     private IEnumerator IELoadExternalAudioWWW(string _url, AudioType _audioType)
    17     {
    18         WWW _www = new WWW(_url);
    19         yield return _www;
    20         if (_www.error == null)
    21         {
    22             AudioClip _audioClip = _www.GetAudioClip(true, true, _audioType);
    23             audioSource.clip = _audioClip;
    24             audioSource.Play();
    25         }
    26         else
    27         {
    28             Debug.Log(_www.error);
    29         }
    30     }

    上面的方法可以正常加载WAV和OGG格式的音频,但是对于MP3格式的音频就有一些问题了,加载过程中会报错。

    网上有的帖子说 UnityWebRequestMultimedia 已经支持MP3格式了,博主亲测后,发现的确是支持了,但并不是全平台支持,至少PC端不支持,安卓平台支持,被坑的不浅。

    如果PC端我们想要解决这个问题,就需要使用 NAudio.dll 类库(下载地址:https://github.com/naudio/NAudio/releases),将MP3格式的音频转为WAV或者OGG格式后,再去加载。代码实现如下:

        private IEnumerator IELoadExternalAudioWebRequest2(string _url, AudioType _audioType)
        {
            string _tempURL = _url.Replace(".mp3", ".wav");
            Debug.Log(_tempURL);
            if (!File.Exists(_tempURL))
            {
                FileStream _fileStream = File.Open(_url, FileMode.Open);
                Mp3FileReader _mp3FileReader = new Mp3FileReader(_fileStream);
                WaveFileWriter.CreateWaveFile(_tempURL, _mp3FileReader);
            }
            yield return null;
            UnityWebRequest _unityWebRequest = UnityWebRequestMultimedia.GetAudioClip(_tempURL, _audioType);
            yield return _unityWebRequest.SendWebRequest();
            if (_unityWebRequest.isHttpError || _unityWebRequest.isNetworkError)
            {
                Debug.Log(_unityWebRequest.error.ToString());
            }
            else
            {
                AudioClip _audioClip = DownloadHandlerAudioClip.GetContent(_unityWebRequest);
                audioSource.clip = _audioClip;
                audioSource.Play();
            }
        }

    代码实现需要导入 NAudio.dll 类库,同时引用 using NAudio.Wave 命名空间。

    通过上面的代码可以看出,我们是先将音频格式进行转换,再进行加载,这样有点过于浪费性能。所以在PC端加载音频,除非有特殊要求,不然不要使用MP3格式的音频,因为PC平台并不支持MP3格式的音频。

    除了转化格式以外,NAudio.dll 还支持直接调用电脑声卡进行播放音频,这里就不做过多描述了。

  • 相关阅读:
    iOS 记录近期遇到的几个bug
    iOS转场动画封装
    iOS 页面滑动与标题切换颜色渐变的联动效果
    Realm数据持久化方案的简单介绍和使用(二)
    某互联网科技公司的一道逻辑面试题
    js获取本月,本季度,上个季度,本周,上周的起始和结束时间
    CSS样式说明
    a标签的样式
    CSS3的> 和@
    CSS中的position定位
  • 原文地址:https://www.cnblogs.com/xiaoyulong/p/13019750.html
Copyright © 2020-2023  润新知