是否可以使用 Java 将实时音频流从混音器转换为 MP3?
- 它必须逐块转换,否则内存将被耗尽。
- 我已经知道如何录制,但仅限于无损格式,例如 wav 和 aiff。
- 当音频进来时,我需要转换。
也许你可以使用LAMEOnJ,它是一个 100% Java API 包装了标准 LAME API(LAME 是一个 MP3 编码器)。
我不确定它是否会“逐块”编码......
使用 Xuggler 来做到这一点。它是免费的、开源的 (LGPL),并且在后台使用 libmp3lame。Xuggler 中的MediaTool API提供了很多如何使用它的示例:
Lame 确实是 MP3 编码的事实上的标准,部分原因是它的高质量(编码 MP3 很难做到正确......这是一门主观艺术),部分原因是法律问题(MP3 是一项专利技术,AFAIK,这就是为什么您从有限数量的站点获取 Lame 二进制文件的原因,其中大多数位于这些法律问题较少(或未执行)强制执行的国家/地区)。
VonC 发现的 LAMEOnJ 项目似乎使用了非自由的 JNI 实现,但我想您可以自己绑定 JNI 甚至 JNA,特别是如果您针对的是精确系统。
至于第一个问题 - 是否有可能,我能看到的唯一限制是处理器速度。如果您使用的算法和您的处理器都足够快,那么就没有理由不可能。
我知道这不是 Java 源代码,但它可能会让你走上正轨——试试看Lame MP3 Encoder。
据我所知,所有 MP3 转换算法都是逐块工作的。他们不需要读取整个 WAV 文件即可开始转换,但他们可以即时转换。
在 Java 中创建一个新进程,然后将流写入到SoX等工具的标准输入中,让它即时将音频数据转换为 MP3。
尝试使用环形缓冲区对原始音频缓冲区进行实时编码。