【问题标题】:Access file from StreamingAssets as an AudioClip Android - Unity从 StreamingAssets 作为 AudioClip Android 访问文件 - Unity
【发布时间】:2020-07-02 20:38:17
【问题描述】:

我正在尝试从 StreamingAssets 文件夹中存在的“.mp3”或“.wav”文件创建音频剪辑

我正在尝试使用 BetterStreamingAssets 包从文件中获取字节数组,然后将字节数组转换为 audioClip,但许多文件没有正确转换。

所以,我尝试使用 WWW 或 UnityWebRequest 来获取它,所以这是我的代码

public static IEnumerator PlayAudioClip(AudioSource audioSource, string path)
{
    using (UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(path, AudioType.UNKNOWN))
    {
        yield return www.SendWebRequest();
        if (www.isNetworkError)
        {
            Debug.Log(www.error);
        }
        else
        {
            AudioClip myClip = DownloadHandlerAudioClip.GetContent(www);
            audioSource.clip = myClip;
            audioSource.Play();
        }
    }
}

我这样称呼它

StartCoroutine(PlayAudioClip(audio, BetterStreamingAssets.Root + "/" + soundPath));

但发生的情况是代码在编辑器或 pc 平台上完美运行,但在 android 平台上没有声音工作。

那么,如何在安卓平台播放语音呢?

【问题讨论】:

  • 您确定是音频再现的问题,还是android平台上的streamingassets路径不同?
  • 你能包括BetterStreamingAssets.Root + "/" + soundPath 的值吗?对于每个构建目标,流媒体资产的路径都不同。在安卓上是`"jar:file://" + Application.dataPath + "!/assets"`docs.unity3d.com/Manual/StreamingAssets.html

标签: c# unity3d


【解决方案1】:

您的路径是否正确完全取决于BetterStreamingAssets.RootsoundPath ...您没有显示。

我刚刚查看了Asset,这对我来说似乎没有必要。

只需使用正确的内置Application.streamingAssetsPath,这对于相应的目标平台始终是正确的。

您还试图访问BetterStreamingAssets.Root,它在 android 上转换为

BetterStreamingAssets.ApkImpl.s_root

这是用Application.dataPath初始化的不是Application.streamingAssetsPath

/*line 39*/ BetterStreamingAssetsImp.Initialize(Application.dataPath, Application.streamingAssetsPath);

哪个调用

/*line 341*/ public static void Initialize(string dataPath, string streamingAssetsPath)

设置位置

/*line 343*/ s_root = dataPath;

另外:从不对系统文件路径使用简单的字符串 concat (+ "/")!

而是使用Path.Combine,它根据设备使用的存储系统插入正确的路径分隔符

StartCoroutine(PlayAudioClip(audio, Path.Combine(Application.streamingAssetsPath, soundPath));

这 - 再次 - 也很大程度上取决于soundPath ...


我也很确定您必须根据您的文件结尾找出正确的AudioType 参数并将其传递给UnityWebRequestMultimedia.GetAudioClip。除了确实是 3rd party / unknown plugin format. 在这种情况下,我不希望 Unit 能够重现它。


一般情况

您想从StreamingAssets 读取音频有什么特殊原因吗?

为什么不简单地将它放在资产中并在某个地方引用它,这样您就可以确定它确实被正确导入了?或者如果你有多个,例如

public class AudioDataController : MonoBehaviour
{
    [SerializeField] private AudioSource audioSource;

    [SerializeField] private AudioClip someClip;
    [SerializeField] private AudioClip someOtherClip;

    public void PlaySomeSound()
    {
        audioSource.clip = someClip;
        audioSource.Play();
    }

    public void PlayOtherSound()
    {
        audioSource.clip = someOtherClip;
        audioSource.Play();
    }
}

我猜这样你就不会遇到这样的麻烦了。

【讨论】:

  • 感谢您的回答,实际上您的回答对我非常有用,关键在于 Path.Combine 技巧而不是“/”,所以我意识到 BetterStreamingAssets.GetFile() 正在与我合作,因为他们在内部处理路径合并,所以我不再需要这个包了,谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多