2013-03-07 137 views
2

我正在读取16位和24位采样位深度的音频文件并解析它们以确定它们的长度没有困难。然而,当读取32位文件时,我得到Java AudioSystem:读取32位WAV文件

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,或者可能有解决方法。作为参考,这里是我的班级:

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

感谢您的任何见解。

回答

0

老问题,但这是我只是为自己寻找的东西。我的测试可以证实16bit 48kHz PCM工作,而32bit不能。

但是我的测试也意味着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位创建和无畏出口.wav文件它被渲染为24bit的WAV 48Khz的。

这似乎反映在文档:https://docs.oracle.com/javase/8/docs/technotes/guides/sound/

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

因此,恐怕没有32位可用的浮点数,我无法再现24位浮点工作的结果。