在不使用临时文件的Java中将音频流转换为WAV字节数组

给定一个包含压缩格式音频数据(例如MP3或OGG)的InputStream被叫in,我希望创建一个byte包含输入数据的WAV转换的数组。不幸的是,如果您尝试执行此操作,JavaSound会给您以下错误:

java.io.IOException: stream length not specified

通过将wav写入一个临时文件,然后将其读回,我设法使其正常工作,如下所示:

AudioInputStream source = AudioSystem.getAudioInputStream(new BufferedInputStream(in, 1024));

AudioInputStream pcm = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, source);

AudioInputStream ulaw = AudioSystem.getAudioInputStream(AudioFormat.Encoding.ULAW, pcm);

File tempFile = File.createTempFile("wav", "tmp");

AudioSystem.write(ulaw, AudioFileFormat.Type.WAVE, tempFile);

// The fileToByteArray() method reads the file

// into a byte array; omitted for brevity

byte[] bytes = fileToByteArray(tempFile);

tempFile.delete();

return bytes;

显然这是不太理想的。有没有更好的办法?

回答:

问题是,大多数AudioFileWriters在写入OutputStream时需要提前知道文件大小。因为您不能提供此功能,所以它总是会失败。不幸的是,默认的Java

sound API实现没有其他选择。

但是您可以尝试使用Tritonus插件中的AudioOutputStream体系结构(Tritonus是Java声音API的开源实现):http

://tritonus.org/plugins.html

以上是 在不使用临时文件的Java中将音频流转换为WAV字节数组 的全部内容, 来源链接: utcz.com/qa/427277.html

回到顶部