2013-03-07 1 views
2

Je lis des fichiers audio en profondeur de bits d'échantillonnage de 16 et 24 bits et les analyse pour déterminer leurs longueurs sans difficulté. Cependant lors de la lecture d'un fichier de 32 bits, je meJava AudioSystem: Lecture de fichiers Wav 32 bits

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

le fichier de test de 32 bits est codé manuellement de la même manière que les autres (PCM linéaire). Je me demande si AudioSystem ne supporte pas les Wavs 32 bits, ou s'il pourrait y avoir une solution de contournement. Pour référence, voici ma classe:

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

Merci pour toute perspicacité.

Répondre

0

Vieille question, mais c'est quelque chose que je regardais juste pour moi-même. Mes tests peuvent confirmer que PCM 16 bits 48kHz fonctionne, et 32 ​​bits ne fonctionne pas.

Cependant mes tests impliquent aussi que 24 bits ne fonctionne pas:

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

Ce fichier .wav créé à 96Khz, 32bit et exportés d'Audacity où il a été rendu en 24bit 48Khz wav.

Cela semble reflété dans le doc: https://docs.oracle.com/javase/8/docs/technotes/guides/sound/

"Formats audio: données audio 8 bits et 16 bits, en mono et stéréo, avec des fréquences d'échantillonnage de 8 kHz à 48 kHz"

Donc, pas de flottement 32 bits disponible, je le crains, et je ne peux pas reproduire votre résultat que fonctionne le flottant 24 bits.

Questions connexes