接收音频文件的插件
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。我所做的有所不同:
我将音频文件放入 StreamingAssets 文件夹中,这样当项目打包时,我仍然可以访问这些原始文件(尽管在 Android 中,它们被压缩成 jar 文件) . (就像 Axiom Studios 的 Venkat 所说,我希望我能早点看到那个答案,但我花了一些时间来发现 StreamingAssets 是什么。)
使用 WWW,我能够从 jar 文件中检索原始文件。这是来自 "Application.streamingAssetsPath"。
有了这些文件,我将它们写入了一个新目录,插件可以使用 File.WriteAllBytes 轻松访问该目录。我使用了 "Application.persistentDataPath" 目录。
在插件端,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
来实例化它。
我是 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。我所做的有所不同:
我将音频文件放入 StreamingAssets 文件夹中,这样当项目打包时,我仍然可以访问这些原始文件(尽管在 Android 中,它们被压缩成 jar 文件) . (就像 Axiom Studios 的 Venkat 所说,我希望我能早点看到那个答案,但我花了一些时间来发现 StreamingAssets 是什么。)
使用 WWW,我能够从 jar 文件中检索原始文件。这是来自 "Application.streamingAssetsPath"。
有了这些文件,我将它们写入了一个新目录,插件可以使用 File.WriteAllBytes 轻松访问该目录。我使用了 "Application.persistentDataPath" 目录。
在插件端,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
来实例化它。