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 還支持直接調用電腦聲卡進行播放音頻,這里就不做過多描述了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM