这是一个跨平台的 MP3 加载方案。
GitHub 上的工程多如繁星,有些好的仓库,但凡不经意间错过了就很难找回,故稍作采撷,希望能帮助到有心人。
本文集以一个小的功能点为单位行文,也便于拾取罢!
简介:
笔者今天推荐的仓库叫 Load-Mp3-into-Audioclip。
这是一个用于替换 WWW 加载方案的基于 NLayer解码器 跨平台的 MP3 加载方案。
功能:
普遍现象就是用户都有使用 www 加载过 MP3 ,如下:
WWW www = new WWW("MyMp3File.mp3");
yield return www;
audiosource.clip = www.GetAudioClip();
然而,不管是 MAC 还是 PC 都会报错:
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 的解决方案了。
示例:
熟悉的链式风格哈:
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); },
//上面的回调不能少,下面的回调经笔者测试,就算不要也能正常搞事情!
position => { mpegFile = new MpegFile(filePath); }
);
return ac;
}
}
Tips:
-
使用该解决方案 API Compatibility Level 必须不能为 .Net 2.0 Subset!!请作如下图设置:
否则会报错,如下图:
使用子集会报这个错误 -
这个仓库的作者只是做了一个 IO 路径的 mp3 文件加载,那网络的怎么加载呢?
OK,也很容易的,就是把 WWW 加载出来的数据使用 MemoryStream 包裹传到 MPEGFile对象就好啦。
MpegFile mpegFile = new MpegFile(stream);
链接:
结语:
-
前些日子总是见有人问Unity怎么加载MP3呀,Unity 加载 Mp3 报错呀 这些问题,今天逛github刚好看到了,何不搬出来晒晒太阳呢,说不定就能帮助到有需要的人呢,哈哈!!
-
笔者认为其实真相并不是Unity 不支持 mp3 而是PC平台(mac+windows)上的mpeg解码器不是 unity 适配的那一款,往后应该会支持的吧!
扩展阅读:
- unity 播放网络MP3的多种方法 - 辣椒酱的博客 - CSDN博客 - 该作者已在留言板申明只适合移动端。
- C# 获取 mp3文件信息 - 简书 - 使用Stream时获取歌曲名称能用的上!
本文集持续更新ing,喜欢记得点赞关注哦!
网友评论