接收音频文件的插件

plugin to receive Audio file

我是 Java 和 Android 的新手,我正在尝试使用 Eclipse 为 Unity 制作一个 Android 插件。

目标是让插件播放音频文件,有效绕过 Unity 引擎的音频播放,因为 unity 项目的移动构建会在调用音频播放时引入延迟。

我在 youtube 上看过它的实现:https://www.youtube.com/watch?v=NyceOWbr7T4

我想你可以从 Unity 发送一个抽象文件到插件,问题是,你如何将文件解释为音池对象(或资源?)以便播放它?

*音频文件将在 Unity 项目中,但在 jar 文件之外。

您可以将音频文件粘贴到项目的流媒体资产文件夹中,然后使用 Media Player class 访问和播放文件。

但是,我要指出两点。 一种。通常,使用 MediaPlayer 需要您在 UI 线程上 运行。这意味着游戏将暂停。您需要查看是否有解决方法

b。 Unity 的音频解决方案并不是最好的,这是理所当然的。但是 Asset store 上有很多非常棒的插件可用。

因此,我仍然无法转发实际文件 (wav),然后尝试将其转换为 SoundPool。我所做的有所不同:

  1. 我将音频文件放入 StreamingAssets 文件夹中,这样当项目打包时,我仍然可以访问这些原始文件(尽管在 Android 中,它们被压缩成 jar 文件) . (就像 Axiom Studios 的 Venkat 所说,我希望我能早点看到那个答案,但我花了一些时间来发现 StreamingAssets 是什么。)

  2. 使用 WWW,我能够从 jar 文件中检索原始文件。这是来自 "Application.streamingAssetsPath"。

  3. 有了这些文件,我将它们写入了一个新目录,插件可以使用 File.WriteAllBytes 轻松访问该目录。我使用了 "Application.persistentDataPath" 目录。

  4. 在插件端,SoundPool能够从提供的URL获取资源,即目标目录+文件名。

通过这个过程,我最终能够完成我想要的,并且性能的提升是巨大的。我对此非常满意。

*注意:但是,这会将包内的文件复制到安装文件夹(例如 /data/data/com.example.app/files)。我确定您可以选择在写入之前检查文件是否已经存在,这样您就可以将文件留在那里以备将来使用,或者在应用程序关闭时删除它们以进行清理。

我刚刚制作了 Native Audio asset store plugins which can make a native call to both iOS and Android's fastest native way from one central interface. https://www.assetstore.unity3d.com/#!/content/107067(它使用 AudioTrack 而不是 SoundPool,因为从我的测试来看它更快)

两个平台都通过Unity的StreamingAssets特殊文件夹接收音频文件。在 Java 端,您可以通过以下方式引用该文件。

在 Unity 中:Assets/StreamingAssets/Assist.wav

在 Java 中:

    Context context = UnityPlayer.currentActivity;
    AssetManager assetManager = context.getAssets();

    try {
        AssetFileDescriptor descriptor = assetManager.openFd(audioPath);
        byte[] music = new byte[(int) descriptor.getLength()];

        InputStream is = assetManager.open(audioPath);
        is.read(music);
        is.close();
        //Do whatever you want with "music"

    } catch (IOException e) {
        Log("Error reading audio file " + audioPath);
        e.printStackTrace();
        return -1;
    }

您现在有一个 byte[] 音频数组。 audioPath 这里只是 "Assist.wav"。我猜你可以把它放到 SoundPool 来实例化它。