插件接收音频文件

时间:2015-02-16 00:34:01

标签: java android eclipse plugins unity3d

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

目标是让插件播放音频文件,有效地绕过Unity Engine的音频播放,因为统一项目的移动版本会在调用音频播放时引入滞后。

我已经看到它在youtube上实现:https://www.youtube.com/watch?v=NyceOWbr7T4

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

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

3 个答案:

答案 0 :(得分:1)

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

然而,我要指出两件事。 一个。通常,使用MediaPlayer将要求您在UI线程上运行。这意味着游戏将暂停。您需要查看是否存在解决方法

湾Unity的音频解决方案不是最好的,授予。但是有很多可用的插件在资产商店中非常惊人。

答案 1 :(得分:1)

所以,我仍然无法转发实际文件(wav),然后尝试将其转换为SoundPool。我所做的是与众不同的事情:

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

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

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

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

  5. 通过这个过程,我能够最终实现我的目标,并且性能的提升非常激烈。而且我很高兴。

    *注意:但是,这会将包中的文件复制到安装文件夹(例如/data/data/com.example.app/files)。如果文件已存在,我确定您可以选择在写入之前提供检查,以便将文件留在那里以备将来使用,或者只在应用程序关闭时将其删除。

答案 2 :(得分:0)

我刚刚创建了Native Audio资产商店插件,可以从一个中央界面本地调用iOS和Android最快的本地方式。 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来实例化它。