首页 > 解决方案 > Unity Android 将本地 MP3 或 WAV 加载为 AudioClip

问题描述

我可以使用 Unity 编辑器中的 UnityWebRequestMultimedia.GetAudioClip 和以下代码加载音频,但是当我在 Android 上运行它时,我无法从用户的设备加载任何文件。

void Start() {
    audio = GetComponent<AudioSource>();
    string fullPath = Path.Combine("file://" + previewSong);
    StartCoroutine(GetAudioClip(fullPath));
}

IEnumerator GetAudioClip(string fullPath)
{
    using (var uwr = UnityWebRequestMultimedia.GetAudioClip(fullPath, AudioType.MPEG))
    {
        ((DownloadHandlerAudioClip)uwr.downloadHandler).streamAudio = true;

        yield return uwr.SendWebRequest();

        if (uwr.isNetworkError || uwr.isHttpError)
        {
            debugSongPath2.text = uwr.error;
            yield break;
        }

        DownloadHandlerAudioClip dlHandler = (DownloadHandlerAudioClip)uwr.downloadHandler;

        if (dlHandler.isDone)
        {
            audio.clip = dlHandler.audioClip;

            if (audio.clip != null)
            {
                audio.clip = DownloadHandlerAudioClip.GetContent(uwr);

                Debug.Log("Playing song using Audio Source!");
            }
            else
            {
                Debug.Log("Couldn't find a valid AudioClip.");
            }
        }
        else
        {
            Debug.Log("The download process is not completely finished.");
        }
    }
}

我遇到的错误取决于我如何形成 URL 的开头。

Path.Combine("file:/" + previewSong);
malformed URL

Path.Combine("file://" + previewSong); 
http:/1.1 404 not found

Path.Combine("file:///" + previewSong);
unknown error

Path.Combine("file:////" + previewSong);
unknown error

当我在手机上输出 URL 时,它们看起来是正确的。这是一个示例路径:

file:///storage/emulated/0/Music/Deorro/Deorro - Five Hours.mp3

我以前使用 WWW.GetAudioClip 成功地从这个 URL 加载音频,但这已经过时了。这让我相信 URL 是正确的。我尝试过使用和不使用开发模式进行构建。不知道还有什么可以尝试的。我想让它与 UnityWebRequestMultimedia 一起工作,但如果有另一种更有效的加载本地文件的方法,我愿意接受。

标签: c#androidunity3daudioclip

解决方案


更改您的构建设置以授予对外部 sd 卡的写入权限。我正在使用下面的代码从 android 中的指定位置获取音频。我试过你的代码,但不知何故它不起作用。

IEnumerator GetAudioClip2(string fullPath)
{
    debugSongPath2.text = previewSong;
    using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(fullPath, AudioType.MPEG))
    {
        yield return www.SendWebRequest();

        if (www.isNetworkError || www.isHttpError)
        {
            Debug.Log(www.error);
        }
        else
        {
            AudioClip myClip = DownloadHandlerAudioClip.GetContent(www);
            audioSource.clip = myClip;
            audioSource.Play();
        }
    }
}

我的完整路径是“file:///storage/emulated/0/Samsung/Music/Over the Horizo​​n.mp3”


推荐阅读