社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

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

雨落随风 • 4 年前 • 410 次点击  

这是一个跨平台的 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
 
410 次点击