Java 接收音频文件的插件

Java 接收音频文件的插件,java,android,eclipse,plugins,unity3d,Java,Android,Eclipse,Plugins,Unity3d,我对Java和Android相当陌生,我正在尝试使用Eclipse为Unity制作一个Android插件 目标是让插件播放音频文件,有效地绕过Unity引擎的音频播放,因为Unity项目的移动构建在调用音频播放时引入了延迟 我在youtube上看到了它的实现: 我想你可以从Unity向插件发送一个抽象文件,问题是,你如何将该文件解释成一个声音池对象(或资源?)以便播放 *音频文件将在Unity项目中,但在jar文件之外。您可以将音频文件粘贴到项目的streaming assets文件夹中,然后使

我对Java和Android相当陌生,我正在尝试使用Eclipse为Unity制作一个Android插件

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

我在youtube上看到了它的实现:

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


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

您可以将音频文件粘贴到项目的streaming assets文件夹中,然后使用类访问和播放该文件

然而,我要指出两件事。 A.通常,使用MediaPlayer需要在UI线程上运行。这意味着游戏将暂停。你需要看看是否有解决办法


b。诚然,Unity的音频解决方案不是最好的。但是,在资产商店中有很多插件非常棒。

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

  • 我将音频文件放在StreamingAssets文件夹中,这样当项目打包时,我仍然可以访问这些原始文件(尽管在Android中,它们被压缩为jar文件)。(正如Axiom工作室的文卡特所说,我希望我能早点看到答案,花些时间去发现什么是StreamingAssets。)

  • 使用WWW,我能够从jar文件中检索原始文件。这来自“Application.StreamingAssetPath”

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

  • 在插件端,SoundPool可以从提供的URL获取资源,URL是目标目录+文件名

  • 通过这个过程,我最终能够完成我的目标,并且性能的提高是巨大的。我对此很满意

    *注意:但是,这会将文件从软件包内部复制到安装文件夹(例如/data/data/com.example.app/files)。我相信你可以选择在写文件之前检查文件是否已经存在,这样你就可以将文件留在那里供将来使用,或者在应用程序关闭时将其删除作为清理。

    我刚刚制作了asset store插件,它可以从一个中央接口以本机方式调用iOS和Android最快的本机方式。(虽然它使用了
    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;
        }
    

    现在您有了一个
    字节[]
    音频数组<代码>音频路径这里只有“Assist.wav”。我想你可以把它放到
    SoundPool
    来实例化它。

    为什么你需要通过插件来实现呢?Unity有自己的音响系统,而且非常直截了当。@JuanjoVega移动设备上的音频播放滞后是荒谬的,用户界面按钮的按下和声音效果不会在点上播放,这只是对用户体验的干扰。然而,我确实找到了一种不同的方法来实现这一点。我们的解决方案中类似的是使用StreamingAssets。请投那个一票!呜呜!(但我还没有足够的代表投票)