Java 音频系统 : Reading 32 Bit Wav Files

标签 java wav javax.sound.sampled

我正在读取 16 位和 24 位采样位深度的音频文件,并毫不费力地解析它们以确定它们的长度。但是,当读取 32 位文件时,我得到

javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file
at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1170)
...

32 位测试文件以与其他文件相同的方式手动编码(线性 PCM)。我想知道 AudioSystem 是否不支持 32 位 Wavs,或者是否有解决方法。作为引用,这是我的类(class):

import java.io.*;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;

public class soundUtility {
    public static double getWavDuration(File filename)
    {   
        AudioInputStream stream = null;
        try 
        {
            stream = AudioSystem.getAudioInputStream(filename);
            AudioFormat format = stream.getFormat();
            return filename.length() / format.getSampleRate() / (format.getSampleSizeInBits() / 8.0) / format.getChannels();
        }
        catch (Exception e) 
        {
            e.printStackTrace();
            return -1;
        }
        finally
        {
            try { stream.close(); } catch (Exception ex) { }
        }
    }

    public static void main(String[] args) {

    try {
        // ===== TESTS: toggle these calls to test the included files =====
        // File soundFile = new File("16bit.mono.441k.30secs.wav");
        // File soundFile = new File("24bit.48k.11secs.stereo.wav");
        File soundFile = new File("32bit.Floating.Stereo.48k.wav");
        // ===========

        System.out.println(getWavDuration(soundFile));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

感谢您的任何见解。

最佳答案

老问题,但这是我自己正在研究的问题。我的测试可以确认 16 位 48kHz PCM 工作,而 32 位不工作。

但是我的测试也表明 24 位不起作用:

 No line matching interface Clip supporting format PCM_SIGNED 48000.0 Hz, 24 bit, stereo, 6 bytes/frame, little-endian is supported.

这是一个以 96Khz、32 位创建并从 Audacity 导出的 .wav 文件,在 Audacity 中它被渲染为 24 位 48Khz wav。

这似乎反射(reflect)在文档中:https://docs.oracle.com/javase/8/docs/technotes/guides/sound/

“声音格式:8 位和 16 位音频数据,单声道和立体声,采样率从 8 kHz 到 48 kHz”

所以,恐怕没有 32 位 float 可用,而且我无法重现 24 位 float 有效的结果。

关于Java 音频系统 : Reading 32 Bit Wav Files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15261812/

相关文章:

java - WAV 到 MP3 - Java 库示例

android - 如何将声音保存为铃声/通知?

android - 如何在 Android 上将 WAV 转换为 AAC

java - 使用 JLayer 将 MP3 解码为 PCM 来检测幅度

java - 在将声音写入文件之前,如何在不使用 java 中的 'clip' 的情况下循环播放声音

java - Hibernate:@AuditTable 和 @AuditJoinTable 之间有什么区别

java - 如何将 CSV 文件中的 NaN 值转换为 0?

java - jsp获取http错误描述

java - 改造具有空字段的获取对象