在 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