需求分析
使用Everyplay(2121-1540版本)錄屏,在升級SDK之后,遇到個問題,調用安卓原生的mediaplay進行播放音樂,在錄屏時無法錄制到聲音,所以想到的解決辦法是在Unity中播放音樂文件。
大概解釋:
當在手機上選擇一首歌(手機上的其它音樂文件)之后,直接在Unity中進行播放。這里需要注意的是這首音樂的格式,大小,存儲位置是未知的。
測試環境
Windows 7 x64
Unity 5.3.6 f1 X64
華為 安卓4.2.2 (未ROOT)
三星NOTE3 安卓4.3(未ROOT)
播放其它目錄的音頻文件(可以是中文文件名,例:千里之外.mp3)
測試代碼
以下代碼中的音樂文件路徑,在測試時,請換成自己的路徑。
- "/storage/emulated/0/music/千里之外.mp3";
- "/storage/emulated/0/music/愛上你萬歲.ogg";
- "/storage/emulated/0/music/梁靜茹_寧夏.wav";
using System; using UnityEngine; using System.Collections; using System.IO; /// <summary> /// Detail : 使用WWW播放音頻文件 /// Author : qingqing-zhao(569032731@qq.com) /// CreateTime : #CreateTime# /// </summary> public class PlayAudioByWWW : MonoBehaviour { private AudioSource curAudioSource; public AudioSource CurAudioSource { get { if (curAudioSource != null) return curAudioSource; curAudioSource = gameObject.GetComponent<AudioSource>(); if (curAudioSource == null) { curAudioSource = gameObject.AddComponent<AudioSource>(); curAudioSource.playOnAwake = false; curAudioSource.maxDistance = 1.1f; } return curAudioSource; } } public void OnGUI() { if (GUI.Button(new Rect(100, 200, 150, 90), "Stop")) { if (CurAudioSource != null) CurAudioSource.Stop(); } if (GUI.Button(new Rect(300, 200, 150, 90), "Play-MP3")) { string audioPath = "/storage/emulated/0/music/千里之外.mp3"; PlayLocalFile(audioPath); } if (GUI.Button(new Rect(100, 300, 150, 90), "Play-OGG")) { string audioPath = "/storage/emulated/0/music/愛上你萬歲.ogg"; PlayLocalFile(audioPath); } if (GUI.Button(new Rect(300, 300, 150, 90), "Play-wav")) { string audioPath = "/storage/emulated/0/music/梁靜茹_寧夏.wav"; PlayLocalFile(audioPath); } } void PlayLocalFile(string audioPath) { var exists = File.Exists(audioPath); Debug.LogFormat("{0},存在:{1}", audioPath, exists); StartCoroutine(LoadAudio(audioPath, (audioClip) => { CurAudioSource.clip = audioClip; CurAudioSource.Play(); })); } IEnumerator LoadAudio(string filePath, Action<AudioClip> loadFinish) { //安卓和PC上的文件路徑 filePath = "file:///" + filePath; Debug.LogFormat("local audioclip :{0}", filePath); WWW www = new WWW(filePath); yield return www; if (string.IsNullOrEmpty(www.error)) { AudioClip audioClip = null; //OGG文件會報:Streaming of 'ogg' on this platform is not supported //if (filePath.EndsWith("ogg")) //{ // audioClip = www.GetAudioClip(false, true, AudioType.OGGVORBIS); //} //else { audioClip = www.audioClip; } loadFinish(audioClip); } else { Debug.LogErrorFormat("www load file error:{0}", www.error); } } }
代碼文件:https://github.com/zhaoqingqing/blog_samplecode/blob/master/technical-research/PlayAudioByWWW.cs
我的總結
我們知道使用WWW加載Assetbundle時,是不可以有中文名和中文路徑的,但上面使用的方法,為什么中文文件可以正常加載並播放?
上述僅僅是通過WWW加載文件,而加載的文件並非Unity的Assetbundle格式,所以寫法上和加載Assetbundle不一樣。
存在的問題
通過WWW加載ogg格式的音樂文件時,會報 “Streaming of 'ogg' on this platform is not supported “
至於這個Error的解決,目前我的解決辦法是:在選擇音樂時,如果是ogg格式文件彈出提示。
我嘗試使用過 AudioClip audioClip = www.GetAudioClip(false, true, AudioType.OGGVORBIS); 還是得到一樣的錯誤提示。
IOS平台
ios平台上使用此段代碼,會報:unsupported URL
猜測是由於ios上對中文路徑的敏感所致。
