Python社区  »  Git

[Unity 3D]Load Mp3 into Audioclip(跨平台的Mp3加载方案) - Github

雨落随风 • 2 月前 • 23 次点击  

这是一个跨平台的 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:

  1. 使用该解决方案 API Compatibility Level 必须不能为 .Net 2.0 Subset!!请作如下图设置:



    否则会报错,如下图:


    使用子集会报这个错误
  2. 这个仓库的作者只是做了一个 IO 路径的 mp3 文件加载,那网络的怎么加载呢?
    OK,也很容易的,就是把 WWW 加载出来的数据使用 MemoryStream 包裹传到 MPEGFile对象就好啦。

        MpegFile mpegFile = new MpegFile(stream);

链接:

Load-Mp3-into-Audioclip

结语:

  • 前些日子总是见有人问Unity怎么加载MP3呀,Unity 加载 Mp3 报错呀 这些问题,今天逛github刚好看到了,何不搬出来晒晒太阳呢,说不定就能帮助到有需要的人呢,哈哈!!

  • 笔者认为其实真相并不是Unity 不支持 mp3 而是PC平台(mac+windows)上的mpeg解码器不是 unity 适配的那一款,往后应该会支持的吧!

扩展阅读:

  1. unity 播放网络MP3的多种方法 - 辣椒酱的博客 - CSDN博客 - 该作者已在留言板申明只适合移动端。
  2. C# 获取 mp3文件信息 - 简书 - 使用Stream时获取歌曲名称能用的上!

本文集持续更新ing,喜欢记得点赞关注哦!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/34833
 
23 次点击  
分享到微博