Partage
  • Partager sur Facebook
  • Partager sur Twitter

Attendre le temps de chargement d'un clip

Oui, mais comment ?

    28 février 2015 à 20:53:36

    Bonsoir à tous.

    Je suis en train de travailler avec les outils "Java Sound" et je me casse les dents sur l'utilisation des "Clips". Mon but est de jouer des fichiers sons de quelques minutes, ce qui correspond à la durée d'une chanson. Mon problème est que dès que mon fichier son - au format wav - fait plus de quelques centaines de ko, j'ai uniquement le début de la chanson qui se joue puis s'arrête. Pire, ce "temps de musique" joué varie aléatoirement d'un lancement de programme à l'autre.

    En cherchant un peu, j'ai lu sur ce forum (http://stackoverflow.com/questions/21874361/clip-plays-wav-file-with-bad-lag-in-java) que le problème était que je devais attendre le chargement total du "clip" avant de l'ouvrir et de le jouer. D'accord... Mais comment fait-on ?

    Voici le code que j'utilise : 

    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    
    import javax.sound.sampled.AudioFormat;
    import javax.sound.sampled.AudioInputStream;
    import javax.sound.sampled.AudioSystem;
    import javax.sound.sampled.Clip;
    import javax.sound.sampled.DataLine;
    import javax.sound.sampled.LineEvent;
    import javax.sound.sampled.LineListener;
    
    public class TestClip {
    	protected static AudioFormat audioFormat;
    
      public static void main(String[] args) throws Exception {
    
        // On specifie le son a jouer
        // (sans controle : on suppose que pour les tests, le fichier peut etre joue sur AudioSystem)
        //File soundFile = new File("chimes.wav");
        File soundFile = new File("test.wav");
        InputStream is = new FileInputStream(soundFile);
        InputStream bufferedIn = new BufferedInputStream(is);
        //AudioInputStream sound = AudioSystem.getAudioInputStream(soundFile);
        AudioInputStream sound = AudioSystem.getAudioInputStream(bufferedIn);
        
        audioFormat = sound.getFormat();
    	System.out.println(audioFormat);
    
        // On charge le son en memoire (un Clip)
        DataLine.Info info = new DataLine.Info(Clip.class, sound.getFormat());
        System.out.println(info);
        Clip clip = (Clip) AudioSystem.getLine(info);
        System.out.println("GetMicrosecondLength : "+(clip.getMicrosecondLength()/(double)1000));
     
        // Verifier avant cette ligne que tout est charge en memoire
        // Oui, mais comment ?
        clip.open(sound);
    
        // En raison d'un bug dans Java Sound,
        // on sort explicitement de la VM quand le son s'arrete
        clip.addLineListener(new LineListener() {
          public void update(LineEvent event) {
            if (event.getType() == LineEvent.Type.STOP) {
            	System.out.println("Methode de sortie");
              event.getLine().close();
              System.exit(0);
            }
          }
        });
        System.out.println("GetFrameLength : "+clip.getFrameLength());
    
        // On joue le clip
        clip.start();
        
        System.out.println("IsActive : "+clip.isActive());
        //clip.close();
    
      }
    } 

    Merci d'avance de votre aide pour me donner une méthode me permettant "d'attendre" puis de vérifier que le clip est bien chargé. Bonne soirée à tous.

    • Partager sur Facebook
    • Partager sur Twitter
    Dr_Click

    Attendre le temps de chargement d'un clip

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown