這是一個跨平臺的動態(tài)加載MP3方案。支持 WWW 加載 MP3 喲!
GitHub 上的工程多如繁星,有些好的倉庫,但凡不經(jīng)意間錯過了就很難找回,故稍作采擷,希望能幫助到有心人。
本文集以一個小的功能點(diǎn)為單位行文,也便于拾取罷!
簡介:
筆者今天推薦的倉庫叫 Load-Mp3-into-Audioclip。
這是一個用于替換 WWW 加載方案的基于 NLayer解碼器 跨平臺的 MP3 加載方案。
功能:
普遍現(xiàn)象就是用戶都有使用 www 加載過 MP3 ,如下:
WWW www = new WWW("MyMp3File.mp3");
yield return www;
audiosource.clip = www.GetAudioClip();
然而,不管是 MAC 還是 PC 都會報(bào)錯:
Streaming of 'mp3' on this platform is not supported
UnityEngine.WWWAudioExtensions:GetAudioClip(WWW)
<Start>c__Iterator0:MoveNext() (at Assets/TestLoader.cs:16)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
也就是說,目前為止,WWW 對加載 mp3 不友好,所以就有了這個基于 NLayer 的解決方案了。
示例:
熟悉的(偽)鏈?zhǔn)斤L(fēng)格哈:
using NLayer;
using UnityEngine;
public static class Mp3Loader {
public static AudioClip LoadMp3(string filePath) {
string filename = System.IO.Path.GetFileNameWithoutExtension(filePath);
MpegFile mpegFile = new MpegFile(filePath);
// assign samples into AudioClip
AudioClip ac = AudioClip.Create(filename,
(int)(mpegFile.Length / sizeof(float) / mpegFile.Channels),
mpegFile.Channels,
mpegFile.SampleRate,
true,
data => { int actualReadCount = mpegFile.ReadSamples(data, 0, data.Length); },
//上面的回調(diào)不能少,下面的回調(diào)經(jīng)筆者測試,就算不要也能正常搞事情!
position => { mpegFile = new MpegFile(filePath); }
);
return ac;
}
}
Tips:
-
使用該解決方案 API Compatibility Level 必須不能為 .Net 2.0 Subset??!請作如下圖設(shè)置:
否則會報(bào)錯,如下圖:
使用子集會報(bào)這個錯誤 這個倉庫的作者只是做了一個 IO 路徑的 mp3 文件加載,那網(wǎng)絡(luò)的怎么加載呢?
OK,也很容易的,就是把 WWW 加載出來的數(shù)據(jù)使用 MemoryStream 包裹著在創(chuàng)建MPEGFile對象時(shí)給它就好啦。
MpegFile mpegFile = new MpegFile(stream);
具體Demo 見GitHub↓
Bian-Sh/UniMP3RuntimeLoader
鏈接:
結(jié)語:
前些日子總是見有人問Unity怎么加載MP3呀,Unity 加載 Mp3 報(bào)錯呀 這些問題,今天逛github剛好看到了,何不搬出來曬曬太陽呢,說不定就能幫助到有需要的人呢,哈哈??!
筆者認(rèn)為其實(shí)真相并不是Unity 不支持 mp3 而是PC平臺(mac+windows)上的mpeg解碼器不是 unity 適配的那一款,往后應(yīng)該會支持的吧!
擴(kuò)展閱讀:
- unity 播放網(wǎng)絡(luò)MP3的多種方法 - 辣椒醬的博客 - CSDN博客 - 該作者已在留言板申明只適合移動端。
- C# 獲取 mp3文件信息 - 簡書 - 使用Stream時(shí)獲取歌曲名稱能用的上!
-
[Unity 3d] LyricParser(歌詞轉(zhuǎn)換器) - GitHub - 簡書
本文集持續(xù)更新ing,喜歡記得點(diǎn)贊關(guān)注哦!

