当前位置: 首页 > 面试题库 >

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

饶铭
2023-03-14
问题内容

给定一个包含压缩格式音频数据(例如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



 类似资料:
  • 这是我的问题,有人给了我一个函数,如果我理解得很好,它会把一些声音样本放入数组列表中。 我想创建一个。wav文件的音频曲目,我真的不知道如何做到这一点。 这是代码,因为也许我根本不懂。。。 下面是示例,在上面的代码中导入。

  • 我有音频数据记录从麦克风这样:(ndarray的浮动) 这是我的代码: 但当我播放音频时,它就坏了,只有噪音。。。如何将其转换为。wav音频文件?

  • 我得到以下错误: WindowserRor:[错误2]系统找不到指定的文件

  • 问题内容: 在过去的几天里,尝试使其正常工作时遇到了麻烦。但是我想要的是我们有一个可以通过网络发送原始数据的应用程序。然后,我读入此二进制数据并将其保存到wav(任何音频)文件中。稍后可以查看压缩。 所以有问题的代码: 也尝试过使用上述声明,但是我得到了例外:。因此,我认为正在发生的事情是因为我的流是原始音频数据,并且没有wave报头,所以抛出异常? 该文件确实可以成功写入,但是它都是静态的,是否

  • 我曾尝试将4个单独的字节数组合并到一个文件中,但我只得到空指针异常,我不知道为什么。我的音频格式是16位PCM签名的,我知道我应该使用short而不是bytes,但老实说,我完全迷茫了。 这就是我目前正在尝试的,但它正在以

  • IBM speech to text-我如何将MP3音频文件转换成字节数组,然后发送到IBM Watson服务器,使用speech to text API将音频转换成文本