WWW讀取安卓外部音樂文件


需求分析

使用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上對中文路徑的敏感所致。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM