在 Android 中从内存中加载声音

Posted

技术标签:

【中文标题】在 Android 中从内存中加载声音【英文标题】:Load sound from memory in Android 【发布时间】:2014-11-10 13:21:42 【问题描述】:

有没有办法使用SoundPool.load 方法从内存中加载声音样本?

不幸的是,SoundPool 中提供的所有methods 都使用真实文件的参数。 问题是我想从 SD 卡上的 zip 文件中加载声音,并且提取 zip(如在this 解决方案中)不是一个选项。

此外,还有一个 solution 用于从未压缩的 zip 文件加载,但我的文件已压缩(并且将使用密码)。

那么有没有办法让java.io.FileDescriptor 代表一个虚拟文件,这样我就可以实现一些抽象类来放置我自己的流?

最好的问候。

【问题讨论】:

【参考方案1】:

我得到了这个问题的最终答案。 这是 android 平台上缺少的功能。 Android 媒体播放框架已经很久不支持了。谷歌也注意到了,所以Android6.0(API Level23)引入了android.media.MediaDataSource,可以作为纯内存字节数组数据源。在 API Level23 之前,我们仍然需要将内存数据复制到文件系统中的一个临时文件中。

以下网址提供了有关此问题的更多线索,其解释对音频和视频都是正确的: how to play video from byte array in media player

【讨论】:

【参考方案2】:

我本来想建议你使用MemoryFile,但检查后发现MemoryFile 没有getFileDescriptor() 方法,这意味着我们不能将它用作SoundPool.load() 中的参数。 但我发现了这个帖子: what is the use of MemoryFile in android

一个人实现了 MemoryFileUtil.getFileDescriptor(memFile),他在那里发布了他的代码。 如果他的代码真的可以工作,这意味着我们可以使用 SoundPool.load() 从内存中加载声音样本。 唯一的问题是将我们的内存数据写入该内存文件。 以下站点显示了如何将内存数据(来自 SQLITE 查询结果)写入内存文件: http://www.programcreek.com/java-api-examples/index.php?api=android.os.MemoryFile

我会在测试后给你更新。

【讨论】:

我没有使用MemoryFile的FileDescriptor作为MediaPlayer setDataSource和SoundPool.load()的参数,总是报如下错误:java.io.IOException: setDataSourceFD failed.: status=0x80000000

以上是关于在 Android 中从内存中加载声音的主要内容,如果未能解决你的问题,请参考以下文章

在 C/C++ (Win64) 中从内存中加载 64 位 DLL

当我在我的 android 应用程序中从图库中加载图像时,为啥位图返回较小的图像?

SoundPool 中的声音不会在 android 中加载

在扩展片段活动android的类中加载soundpool

Admob横幅广告未在Android P中加载

无法在android中加载视频流