以下所有内容在unity5.6.2测试。如果是之前版本,不能保证可行型。
因为程序需要,需要使用unity加载网络的MP3音乐,但是网上一查。发现已有的结论是无法直接解析MP3,需要使用其他的库将MP3转换为wav,ogg等其他格式。但是我看文章的发表日期也十分久远,心想,MP3这种全世界使用最多的音乐格式,unity没有理由不支持啊。
终于在仔细的后发现了其支持mp3的蛛丝马迹。
如图,是unity支持的audio格式。大眼一看似乎真的是不支持MP3。但当我们一一点开注释你会发现,
原来,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的使用者就需要注意啦。
如果你觉得我的文章对你有所帮助或有什么意见千万不要吝啬评论噢。