美文网首页unity
[Unity 3D]Load Mp3 into Audiocli

[Unity 3D]Load Mp3 into Audiocli

作者: 雨落随风 | 来源:发表于2019-06-17 22:25 被阅读2次

    这是一个跨平台的 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,喜欢记得点赞关注哦!

    相关文章

      网友评论

        本文标题:[Unity 3D]Load Mp3 into Audiocli

        本文链接:https://www.haomeiwen.com/subject/kahtqctx.html