将音频字节[]保存到wav文件

use*_*177 9 java audio

在最近几天试图让它工作时遇到了一些麻烦.但我想要的是我们有一个通过网络发送原始数据的应用程序.然后,我读入了这个二进制数据,并希望将其保存到wav(任何音频)文件中.以后可能会看压缩.

所以有问题的代码:

byte[] allBytes = ...
InputStream b_in = new ByteArrayInputStream(allBytes);

try
{
     AudioFormat format = new AudioFormat(8000f, 16, 1, true, true);
     AudioInputStream stream = new AudioInputStream(b_in, format, allBytes.length);
     //AudioInputStream stream = AudioSystem.getAudioInputStream(b_in);                
Run Code Online (Sandbox Code Playgroud)

试图使用上面的语句,但我得到了例外:javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from stream.所以我认为正在发生的是因为我的流是原始音频数据并且没有波头,这会引发异常吗?

File newPath = new File(SystemConfiguration.getLatest().voiceNetworkPathDirectory + currentPhoneCall.fileName);
if (!AudioSystem.isFileTypeSupported(Type.WAVE, stream))
{
    Logger.error("Audio System file type not supported");
}

AudioSystem.write(stream, Type.WAVE, newPath);
Run Code Online (Sandbox Code Playgroud)

该文件没有写成功,但它是所有静态的,我需要创建使用类似的输出波形标题.当我在记事本中查看输出的wav文件时,它似乎有一个标题,因为它以"RIFF"开头.

我是否需要在输入流中添加假标题?我应该只创建自己的输出标题,并用二进制编写器保存它?

use*_*177 6

所以我最终让它工作了,不太确定为什么,但这是有效的代码:

InputStream b_in = new ByteArrayInputStream(resultArray);
try {
        DataOutputStream dos = new DataOutputStream(new FileOutputStream(
                "C:\\filename.bin"));
        dos.write(resultArray);
        AudioFormat format = new AudioFormat(8000f, 16, 1, true, false);
        AudioInputStream stream = new AudioInputStream(b_in, format,
                resultArray.length);
        File file = new File("C:\\file.wav");
        AudioSystem.write(stream, Type.WAVE, file);
        Logger.info("File saved: " + file.getName() + ", bytes: "
                + resultArray.length)
Run Code Online (Sandbox Code Playgroud)

所以它一定是我的签名/未签名/小端设置。我最终做的是将数据保存到二进制文件中。然后以大胆的方式将该文件作为原始数据导入。这告诉了我一切,除了我已经新的费率。我现在唯一的问题是标题计算。我保存了生成 4 秒 wav 的二进制数据,但它只有 2 秒的声音。就好像它计算我的标题错误一样。不知道是不是跟柳岩说的帧长有关。

如果我的数组长度为 160。这是否意味着我的帧长度为 10?160 / 1 / 16。如果我这样做,那么我只将 10 个字节的数据存储到我的二进制文件中。