Unity Android 加载本地 MP3 或 WAV 为 AudioClip

问题描述 投票:0回答:3

我可以使用以下代码在 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# android unity3d audioclip
3个回答
0
投票

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


0
投票

问题出在新的 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


0
投票

async void GetAudioClip(string audioURL, GameObject itemMedia) { 尝试 { audioPlayer.clip = await UnityHttpClient.GetAudioClip(audioURL);

        panelLoading.SetActive(false);
        timeEndAudio.GetComponent<Text>().text = Helper.FormatTime(audioPlayer.clip.length);
        sliderControlAudio.GetComponent<Slider>().maxValue = audioPlayer.clip.length;
        btnControlAudio.interactable = true;
        btnExitAudio.interactable = true;
        IsPlayingAudio = true;
        ControlAudio(IsPlayingAudio);
    }
    catch (Exception exception)
    {
        SetUIErrorNetwork(itemMedia);
        Toast.ShowCommonToast(exception.Message, APIUrlConfig.SERVER_ERROR_RESPONSE_CODE);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.