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