我正在尝试创建一个纯 Java 音频混合库,最好是可以与 Android 一起使用的库,虽然不完全实用,但绝对是一件有趣的事情。我确信它已经完成了,但只是为了我自己的学习经验,我试图用 wav 文件来做这件事,因为通常没有压缩模型可以解决。
鉴于 java.io 的性质,它定义了许多 InputStream 类型的类。每个都实现了主要用于从某些底层资源读取数据的操作。之后您如何处理数据,将其转储或聚合到您自己的地址空间等,取决于您。我希望这是纯Java,例如适用于任何东西(不需要JNI),针对低内存配置进行了优化,并且易于扩展。
我了解 RIFF 格式的性质以及如何组装 PCM 样本数据,但我不知道管理将文件膨胀到内存所需的内存的最佳方法。使用 FileInputStream,一次只能读取这么多数据,具体取决于底层文件系统和读取操作的调用方式。FileInputStream 没有提供一种方法来索引您在文件中的位置,因此无法检索流以供以后混合。我的目标是将 RIFF 文档扩展为允许读取和写入底层块的适当区域的 Java 对象。
如果我为整个事物分配空间,例如所有 PCM 样本数据,那么平均每首歌曲大约 50 MB。在典型的智能手机或平板电脑上,这会影响整体性能的可能性有多大?我会更好地提出我自己的 InputStream 类型,它可能会跟踪块在 InputStream 中的位置吗?对于文件,这将在获取 PCM 样本时导致大量阻塞,但仍会减少系统上的整体内存占用。