在不使用临时文件的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