IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Lire un son WAV


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Par défaut Lire un son WAV
    Bonjour à tous,
    j'ai récupéré sur Internet un code source qui permet en théorie d'ouvrir un fichier audio et de l'arrêter. Seulement je n'arrive même pas à le faire fonctionner Donc je vous mets le code, dites moi s'il faut des import particuliers (autres que ceux présents xD) , installer des bibliothèques pour l'audio, ou autre chose ^^ ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    import java.io.File;
     
     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;
     
     
     public class WavPlayer {    
     
         private Clip clip = null;
         private AudioInputStream audioStream = null;
     
         public WavPlayer(File f) throws Exception{
             audioStream = AudioSystem.getAudioInputStream(f);//recuperation d'un stream de type audo sur le fichier
             AudioFormat audioFormat = audioStream.getFormat();//recuperation du format de son
             //recuperation du son que l'on va stoquer dans un oblet de type clip
             DataLine.Info info = new DataLine.Info(
                     Clip.class, audioStream.getFormat(),
                     ((int) audioStream.getFrameLength() * audioFormat.getFrameSize()));
             //recuperation d'une instance de type Clip
             clip = (Clip) AudioSystem.getLine(info);
     
         }
     
         /**
          * Ouverture du flux audio
          * @return On retourne <code>false</code> si il y a eu une erreure
          */
         public boolean open(){
             if(clip != null && !clip.isOpen())//teste pour ne pas le faire dans le vent
                 try {
                     clip.open(audioStream);
                 } catch (Exception e) {
                     e.printStackTrace();//pour le debugage
                     return false;
                 }
             return true;
         }
     
         /**
          * Fermeture du flux audio
          */
         public void close(){
             if(clip != null && clip.isOpen())//teste pour ne pas le faire dans le vent
                 clip.close();
         }
     
         /**
          * On joue le son
          */
         public void play(){
             if(clip != null && clip.isOpen())
                 clip.start();
         }
     
         /**
          * On arrete le son
          */
         public void stop(){
             if(clip != null && clip.isOpen())
                 clip.stop();
         }
     
     
         public static void main(String [] args){
     
     
        	 try {
                 WavPlayer wp = new WavPlayer(new File("musique1.wav"));
                 wp.open();//ouverture du flux
                 wp.play();//lecture
                 wp.stop();//arret
                 wp.close();//pour etre propre on ferme le flux quand il n'est plus utile :D
             System.out.println("debug0");
        	 } catch (Exception e) {
                 e.printStackTrace();
             }
     
         }
     }
    mon compilateur m'affiche très bien mon petit "debug0" donc à priori pas d'erreurs de codage ^^

    Voili voilou, merci d'avance pour vos réponses

  2. #2
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    quand tu dit ça ne fonctionne pas

    a tu un message d'erreur quelque part ? si oui poste le

    sinon ton fichier musique1.wav est-il bien dans le même dossier que tes source ? en gros le chemin d'accès est-il le bon pour accéder à ce fichier ?

    Aussi je viens de voir, dans le main tu fait un wp.play() suivi d'un wp.stop()

    en fait tu lance la musique et tu l'arrête tout de suite après c'est peu être pour ça que ça ne tourne pas ? peut-être faut-il mettre une condition avant de stopper ta musique ? (attendre la fin de la chanson ?)

    je n'ai jamais utiliser ses lib, mais tout les import on l'air bon (sinon ça ne compilerai pas de toute manière)

    cdlt

  3. #3
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Par défaut
    ben j'ai testé avec la musique dans le répertoire "src" , "bin", et dans la racine du projet, mais toujours rien ...
    D'autre part, quand je dis que ça ne "marche pas", c'est en réalité que je n'entends aucun son
    J'ai bien sur essayé en mettant l'appel des fonctions stop() et close() en commentaire, mais ça n'a rien donné ...

    En tout cas merci de m'avoir répondu

  4. #4
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    bon ben je test ton code en rentrant du boulot, et je posterai à la suite pour te donner le résultat de mes test

    petit edit : à tout hasard a tu essayé de mettre des petit println dans tes fonction open() play() ... juste pour être sur que tu rentre dedans ?

    par exemple si tu récupère un null sur ton clip tu ne pourra pas ouvrir le fichier ... ce qui peut être causé a mon avis si le format de ton son n'est pas reconnu

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Par défaut
    j'ai placé tout plein de println , tous sont executés ^^
    ...

  6. #6
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    bon après vérification le problème vient bien du temps de lecture du main

    en gros il fait play suivi de stop suivi de close et tout ca se fait très rapidement et donc ne te fait pas écouter grand chose

    si juste après le play() tu ajoute

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    int i = 0;
    while(i<10){
    Thread.sleep(1000); // fait patienter une seconde
    }
    ...
    tu entendra les 10 première seconde de ton enregistrement.

    maintenant pour entendre toute la durée de l'enregistrement essaye ceci (sans devoir spécifier le temps de lecture par toi même ^^ ce sera plus utile):

    je n'utilise plus le Clip
    je te poste le code final qui fonctionne chez moi, à toi de tester maintenant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    import java.io.File;
    import java.io.IOException;
     
     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.LineUnavailableException;
    import javax.sound.sampled.SourceDataLine;
     
     
     public class WavPlayer {    
     
         private AudioInputStream audioStream = null;
         private SourceDataLine line = null;
         private AudioFormat audioFormat = null;
     
         public WavPlayer(File f) throws Exception{
             audioStream = AudioSystem.getAudioInputStream(f);
             audioFormat = audioStream.getFormat();
             DataLine.Info info = new DataLine.Info(SourceDataLine.class,audioFormat);
     
             try {
             line = (SourceDataLine) AudioSystem.getLine(info);
             } catch (LineUnavailableException e) {
    		     e.printStackTrace();
             }		
         }
     
         /**
          * Ouverture du flux audio
          * @return On retourne <code>false</code> si il y a eu une erreure
          */
         public boolean open(){
     
                 try {
                	 line.open(audioFormat);
                 } catch (Exception e) {
                     e.printStackTrace();//pour le debugage
                     return false;
                 }
             return true;
         }
     
         /**
          * Fermeture du flux audio
          */
         public void close(){
             line.stop();
         }
     
         /**
          * On joue le son
          */
         public void play(){
        	 line.start();
             try {
     			byte bytes[] = new byte[1024];
     				int bytesRead=0;
     				while (((bytesRead = audioStream.read(bytes, 0, bytes.length)) != -1)) {
     					line.write(bytes, 0, bytesRead);
     				}
     			} catch (IOException io) {
     				io.printStackTrace();
     				return;
     			}
     
         }
     
         /**
          * On arrete le son
          */
         public void stop(){
        	 line.close();
         }
     
     
         public static void main(String [] args){
     
     
        	 try {
                 WavPlayer wp = new WavPlayer(new File("D:\\Documents and Settings\\...\\Bureau\\musique.wav"));
                 wp.open();
                 wp.play();           
                 wp.stop();
                 wp.close();
             System.out.println("debug0");
        	 } catch (Exception e) {
                 e.printStackTrace();
             }
     
         }
     }
    ce que j'ai changé donc :

    1) je n'utilise plus les clip, ca ne fonctionnait pas sur ma machine
    2) changer le DataLine.Info info pour ne plus utliser le clip
    3) créer variable SourceDataLine line pour la lecture du fichier audio
    3 bis) remplacement de tout ce qui faisait appel au "clip" par mon "line"
    4) rajout d'une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    byte bytes[] = new byte[1024];
     				int bytesRead=0;
     				while (((bytesRead = audioStream.read(bytes, 0, bytes.length)) != -1)) {
     					line.write(bytes, 0, bytesRead);
    cette boucle permet de lire tout le fichier avant de s'areter ( après a toi de regler des bouton ou des evenement pour couper le son quand tu le désire si tu ne veux pas jouer le son en entier)


    voila je pensse que c'est tout

    n'hésite pas si tu as des questions

  7. #7
    Membre confirmé
    Inscrit en
    Novembre 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Novembre 2006
    Messages : 150
    Par défaut
    nikel j'arrive à lancer la musique
    par contre je n'arrive pas à l'arrêter ...
    la fonction ne fonctionne pas ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/12/2010, 23h30
  2. Lire un son .wav depuis un serveur ftp
    Par mimi51340 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 08/04/2008, 21h32
  3. Réponses: 5
    Dernier message: 05/04/2008, 17h19
  4. Lire un fichier son wav... un peu d' aide svp
    Par pilouface dans le forum C
    Réponses: 10
    Dernier message: 13/05/2006, 16h36
  5. Comment lire une partie du son *.wav
    Par ryosaebafr2000 dans le forum MFC
    Réponses: 5
    Dernier message: 08/06/2005, 16h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo