unity 播放网络MP3的多种方法

作者: 咸鱼的酱 | 来源:发表于2017-12-02 15:22 被阅读102次

    以下所有内容在unity5.6.2测试。如果是之前版本,不能保证可行型。

    因为程序需要,需要使用unity加载网络的MP3音乐,但是网上一查。发现已有的结论是无法直接解析MP3,需要使用其他的库将MP3转换为wav,ogg等其他格式。但是我看文章的发表日期也十分久远,心想,MP3这种全世界使用最多的音乐格式,unity没有理由不支持啊。

    终于在仔细的后发现了其支持mp3的蛛丝马迹。

    clipboard.png

    如图,是unity支持的audio格式。大眼一看似乎真的是不支持MP3。但当我们一一点开注释你会发现,

    111.png

    原来,MP3,mpeg同属于Mpeg,虽然不清楚为什么他两个会属于一种类型(可能都是mp开头。哈哈,也可能是因为他们的编码方式相同)。不管怎么说,已经有很明显的证据证明了。MP3是可以直接播放的。

    网络加载MP3的方法分为两种,一种是使用WWW ,另外一种是使用UnityWebRequest。

    我估计应该是版本迭代的原因。这两种方式加载的MP3方式并不能很好的兼容。就是说,因为WWW是较老的加载方式,(unity也有意抛弃)。所以有些情况下WWW是不能实现的。下文会详细列出。

    播放的路径大致分为三种。

    一、在StreamingAssets文件夹下播放

    二、在网络上服务器,根据url播放

    三、在PersistentDataPath文件夹下播放(用于缓存音乐)

    这些地址也有很大的坑。这里就简单说下,关于unity地址的一些坑,这里不深入写,网上很多详细的讲解。

    如果使用StreamingAssets加载 则必须加"file://"

    WWW www = new WWW("file://"+Application.streamingAssetsPath + "/music.mp3"); OK

    WWW www = new WWW(Application.streamingAssetsPath + "/music.mp3"); XXX(不可以)

    使用PersisDataPah则不需要。

    使用WWW的方式播放MP3音乐。

    IEnumerator LoadMusic()
    {
    string path = Application.persistentDataPath + "/MusicData" + "/Always.mp3";
     //WWW www = new WWW("http://www.xxx.com/music.mp3");(网络)
    WWW www = new WWW(path);
    yield return www;
    if (www.error!=null)
    {
    Debug.Log(www.error);
    }
    AudioClip ac = www.GetAudioClip(true,true,AudioType.MPEG);
    audioS.clip = ac;
    audioS.Play();
    }
    

    重点:!!WWW 的方法只适用用于一,二种方法。!!!注意。第三种用WWW是不可以的。!!
    也就是说如果你想要做缓存的话,必须使用unitywebrequest
    使用UnityWebRequest加载MP3音乐的方式

    IEnumerator GetAudioClip()
    {
    string path = Application.persistentDataPath + "/MusicData" + "/Always.mp3";
    using (var uwr = UnityWebRequest.GetAudioClip(path, AudioType.MPEG))
    {
    yield return uwr.Send();
    if (uwr.isError)
    {
    Debug.LogError(uwr.error);
    yield break;
    }
    AudioClip clip = DownloadHandlerAudioClip.GetContent(uwr);
    // use audio clip
    audioS.clip = clip;
    audioS.Play();
    }
    }
    

    UnityWebRequset 是3种都可以的。如果你是WWW的使用者就需要注意啦。

    如果你觉得我的文章对你有所帮助或有什么意见千万不要吝啬评论噢。

    相关文章

      网友评论

      • 阿布多12:2018 都不可以啊
        咸鱼的酱:@阿布多12 2018没有试过。还有这个支持的是android,如果是pc需要用其他的方法
      • 咸鱼的酱:经后来测试,文中所述第三种方法是有问题的。将MP3下载到Application.persistentDataPath后在加载是不能播放的。这也就不能实现将音乐缓存的功能,这点着实让人郁闷。但是直接播放网络的MP3.以及在本地StreamingAssets文件夹下是绝对可以播放的!
        superowner:@咸鱼的酱 pc我现在的思路是用NAudio转换mp3为wav比特流,不过过程会产生wav临时文件,洁癖比较不舒服,不够优雅
        咸鱼的酱:@superowner 额。PC这我还真没试过,主要一直在移动端做,也没注意这点。谢谢你的建议。
        superowner:你写之前先分清楚平台吧,mp3只能移动平台支持,window是不支持的,其他部分平台也是不支持的
      • superowner:楼主胡说八道什么呢,mp3一直不支持的
        咸鱼的酱:文章写的是当时理解的情况,后来再测发现有一些情况mp3的确是不可以。比如直接从网络下载到Application.persistentDataPath后再加载是不可以。但是!在上文所述的情况下是绝对可以的。我是跑的通才来写的东西。点开你一看,亏你还分享那么多东西,猛一看还以为是文化人呢。你不知道不代表不可以。在我们这行,在不能百分百确定人家写的内容正确与否的时候,就评价胡说八道,我想那可能你也是个辣鸡吧。

      本文标题:unity 播放网络MP3的多种方法

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