unity Android 加载本地 MP3 或 WAV 为 AudioClip

Unity Android load local MP3 or WAV as 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

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

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

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

更改构建设置以授予对外部 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”

问题出在新的 Android 11 范围存储中,它禁用了 READ_EXTERNAL_STORAGE。我必须将以下内容添加到我的 AndroidManifest.xml:

<manifest ... >
<!-- This attribute is "false" by default on apps targeting Android 10 or higher. -->
  <application android:requestLegacyExternalStorage="true" ... >
    ...
  </application>
</manifest>

https://developer.android.com/training/data-storage/use-cases#opt-out-scoped-storage