试图将我从库中获得的 AudioInputStream 管道传输到此过程:
oggenc - -o wtf.ogg
通过
AudioSystem.write(audio, AudioFileFormat::Type::WAVE, process.getOutputStream());
给我错误:
IOException
stream length not specified
file: com.sun.media.sound.WaveFileWriter.write(WaveFileWriter.java)
line: 129
因此,似乎需要指定音频流长度。这是一个 44.8 kHz 立体声 PCM 格式的音频,未指定长度。我从库中得到了这个,所以我无法修改他们的代码。我尝试从这个流创建另一个音频输入流,但我找不到合适的长度。那么我该如何指定长度呢?
所以,我发现你正在从未知的地方阅读audio
,然后尝试将其写入WAV
格式。但是WAV
格式需要写入标头,标头应包含文件长度。无论如何,如果由流馈送而不知道长度,WaveFileWriter
会引发异常。
我想你的方向是Java -> oggenc
.
因此,您将学习oggenc
并知道它是否接受无头WAV
流。如果是这样,那么只需将您的audio
传递到输出流,而无需使用 AudioSystem.write()
进行处理,这是用于标题WAV
根据这里 http://www.linuxcommand.org/man_pages/oggenc1.html 您可以接受RAW
oggenc
.
如果您重新实现 AudioSystem.write 方法,您将能够解决长度问题。由于标头中的数据长度,它不适用于流和 WAVE 格式。您应该将音频数据写入某个数组,然后准备正确的 WAVE 标头。示例:如何将音频录制到字节数组