0

我正在尝试创建一个纯 Java 音频混合库,最好是可以与 Android 一起使用的库,虽然不完全实用,但绝对是一件有趣的事情。我确信它已经完成了,但只是为了我自己的学习经验,我试图用 wav 文件来做这件事,因为通常没有压缩模型可以解决。

鉴于 java.io 的性质,它定义了许多 InputStream 类型的类。每个都实现了主要用于从某些底层资源读取数据的操作。之后您如何处理数据,将其转储或聚合到您自己的地址空间等,取决于您。我希望这是纯Java,例如适用于任何东西(不需要JNI),针对低内存配置进行了优化,并且易于扩展。

我了解 RIFF 格式的性质以及如何组装 PCM 样本数据,但我不知道管理将文件膨胀到内存所需的内存的最佳方法。使用 FileInputStream,一次只能读取这么多数据,具体取决于底层文件系统和读取操作的调用方式。FileInputStream 没有提供一种方法来索引您在文件中的位置,因此无法检索流以供以后混合。我的目标是将 RIFF 文档扩展为允许读取和写入底层块的适当区域的 Java 对象。

如果我为整个事物分配空间,例如所有 PCM 样本数据,那么平均每首歌曲大约 50 MB。在典型的智能手机或平板电脑上,这会影响整体性能的可能性有多大?我会更好地提出我自己的 InputStream 类型,它可能会跟踪块在 InputStream 中的位置吗?对于文件,这将在获取 PCM 样本时导致大量阻塞,但仍会减少系统上的整体内存占用。

4

1 回答 1

1

我不确定我是否理解你的所有问题,但我会尽可能回答。随时在评论中澄清,我会编辑。

不要将所有文件数据保存在内存中,以用于 DAW 类型的应用程序或任何需要播放大文件的文件/视频播放器。这可能适用于某些设备,具体取决于内存型号,但您是在自找麻烦。

相反,根据需要(即按需)阅读文件的所需部分。它实际上比这要复杂一些,因为您不想在音频播放线程中读取文件(您不希望低延迟的音频播放依赖于高延迟的文件 IO )。为了解决这个问题,您可能必须提前缓冲一些文件。(这取决于您使用的是回调模型还是阻塞模型)

使用 FileInputStream 可以正常工作,您只需要自己跟踪文件中所有内容的位置(这涉及将毫秒或其他任何内容转换为字节并考虑标头的大小 [1])。一个稍微好一点的选择是 RandomAccessFile,因为它允许你来回跳转。

我关于音频软件编程的演讲中的幻灯片可能会有所帮助,特别是如果您对回调 v 阻塞感到困惑:http: //blog.bjornroche.com/2011/11/slides-from-fundamentals-of-audio.html

[1] 或者更准确地说,知道文件中音频数据的偏移量。

于 2012-05-26T23:48:23.933 回答