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

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

易宏阔
2023-03-14
问题内容

在过去的几天里,尝试使其正常工作时遇到了麻烦。但是我想要的是我们有一个可以通过网络发送原始数据的应用程序。然后,我读入此二进制数据并将其保存到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);

也尝试过使用上述声明,但是我得到了例外:javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from stream。因此,我认为正在发生的事情是因为我的流是原始音频数据,并且没有wave报头,所以抛出异常?

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);

该文件确实可以成功写入,但是它都是静态的,是否需要使用类似这样的东西在输出上创建wave头。当我在记事本中查看输出的wav文件时,它似乎有一个标头,因为它以’RIFF’开头。

我是否需要在输入流中添加假标头?我应该只创建自己的输出标头,然后将其保存为二进制编写器吗?


问题答案:

所以我最终使它工作,但不确定为什么,但是这是起作用的代码:

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)

所以它一定是我的签名/未签名/小端序设置。我最终要做的是将数据保存到二进制文件中。然后以大胆的态度将该文件作为原始数据导入。这告诉了我一切,除了我已经很新的速度。我现在唯一的问题与标头计算有关。我保存了生成4秒波形的二进制数据,但是只有2秒的声音。好像是在计算我的标题错误。我不确定是否与刘岩提到的帧长有关。

如果我的数组长度为160。这是否意味着我的帧长度为10?160/1 /16。如果执行此操作,则仅将10个字节的数据存储到二进制文件中。



 类似资料:
  • 我一直在寻找保存音频到SdCard。 我还试图保存以下内容: 在这两种情况下,它都起作用,但会保存到内部存储中。从不使用SD卡 我使用getExternalFilesDirs()来创建。但如果用户卸载应用程序,则会丢失文件。 我不想那样。 如何将音频保存在SD卡公用文件夹中或创建新文件夹。 任何时候它都会创建到内部存储中。 有什么解决办法吗??? 我尝试了这个,我可以在SD卡中创建一个文档。还有一

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

  • 我正在使用IBM的文本到语音API来运行说话人检测。我使用pydub将几个。wav文件连接成一个文件,但是我不能将音频段传递给IBM。 我的问题是: null

  • 我正在尝试从麦克风录制,添加一些效果,并将其保存到文件中 我已经从AndroidNDK中包含的本地音频示例开始。我设法添加了一些混响并播放它,但我没有找到任何关于如何完成此操作的示例或帮助。 任何帮助都是受欢迎的。

  • 问题内容: 嗨,我需要将wav音频文件的采样率从44.1kHz下采样到8kHz。我必须使用字节数组手动完成所有工作…这是出于学术目的。 我目前正在使用2个类(接收器和源)来弹出和推送字节数组。一切顺利,直到到达需要使用线性插值对数据块进行下采样的部分为止。 由于我是从44100降采样到8000 Hz,因此我该如何插入一个包含约128000000字节的字节数组?现在,我弹出5、6或7个字节,具体取决