首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Unity Android将本地MP3或WAV加载为AudioClip

Unity Android将本地MP3或WAV加载为AudioClip
EN

Stack Overflow用户
提问于 2020-11-23 14:00:52
回答 2查看 1.7K关注 1票数 3

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

代码语言:javascript
运行
复制
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开头的形式而有所不同。

代码语言:javascript
运行
复制
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时,它们看起来是正确的。下面是一个示例路径:

代码语言:javascript
运行
复制
file:///storage/emulated/0/Music/Deorro/Deorro - Five Hours.mp3

我之前用WWW.GetAudioClip成功地从这个网址加载了音频,但那已经过时了。这让我相信URL是正确的。我尝试过使用开发模式和不使用开发模式进行构建。不知道还能尝试什么。我想让它在UnityWebRequestMultimedia上工作,但是如果有一个替代的,更有效的加载本地文件的方法,我是开放的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-15 14:39:48

问题出在新的Android11作用域存储上,它禁用了READ_EXTERNAL_STORAGE。我不得不将以下内容添加到我的AndroidManifest.xml中:

代码语言:javascript
运行
复制
<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

票数 0
EN

Stack Overflow用户

发布于 2020-11-23 16:22:42

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

代码语言:javascript
运行
复制
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 Horizon.mp3“

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64963261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档