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

Multimédia Java Discussion :

Intégrer du son en Java


Sujet :

Multimédia Java

  1. #1
    Invité
    Invité(e)
    Par défaut Intégrer du son en Java
    Bonjour à tous,
    Je suis en train de developer un petit jeu en java, et j'aimerai y intégrer de bruitages. J'ai regardé sur different forums comment intégrer du son, et je suis arrivé à ceci :
    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
     
    package src;
     
    import java.applet.Applet;
    import java.applet.AudioClip;
     
    import java.net.URL;
     
    public class Sound extends Thread{
        private URL u1;  //l'url du fichier son
        private static AudioClip s1;  //le son créé depuis l'url
     
        public Sound() {
            u1 = this.getClass().getClassLoader().getResource("/src/son/applaudissements.au");
            s1 = Applet.newAudioClip(u1);
        }
        public static void jouer() {
            s1.play();
        }
        public void jouerEnBoucle() {
            s1.loop();
        }
        public void arreter() {
            s1.stop();
        }
    }
    Mais j'ai cette erreur lorsque j'exécute le programme :
    Exception in thread "main" java.lang.NullPointerException
    at src.Sound.jouer(Sound.java:17)

    Je pense donc que la classe Sound n'arrive pas à recuperer le fichier applaudissements.au.
    Je ne sais pas ou mettre ce fichier pour régler ce problème, pourriez vous m'aidez ? Ou il y'a peut être une manière plus simple d'intégrer du son en java ? (Je reste sur quelque chose de basique, c'est pourquoi je trouvais cette manière de faire assez bien).
    Merci !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    septembre 2009
    Messages
    12 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 12 373
    Points : 29 307
    Points
    29 307
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il n'y aucune raison pour que le nom du dossier de sources apparaissent dans un chemin de ressource. Essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    u1 = this.getClass().getClassLoader().getResource("/son/applaudissements.au");
    Par ailleurs, entres autres :

    • il n'est pas nécessaire que ta classe étende Thread : autant enlever le extends Thread.
    • s1 ne devrait pas être static, surtout que u1 ne l'est pas, mais ça fonctionne parce que le chemin est en dur : avec un chemin en paramètre, tu auras des dysfonctionnement, si tu utilises plusieurs sons (plusieurs instances de Sound)
    • Il est incohérent d'avoir des méthodes static et des méthodes non static qui manipule la même variable : si la variable est static, les méthodes de manipulation devrait l'être.
    • inutile de stocker l'URL si tu n'en fait rien d'autre que la stocker


    En résumé :

    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
    public class Sound {
        private final AudioClip audioClip;  //le son créé depuis l'url
     
        public Sound(String name) {
            Url url = Sound.class.getResource("/son/"+name);
            audioClip = Applet.newAudioClip(url);
        }
        public void jouer() {
           audioClip.play();
        }
        public void jouerEnBoucle() {
           audioClip.loop();
        }
        public void arreter() {
            audioClip.stop();
        }
    }
    Mais il vaudrait mieux utiliser la classe Clip, qui n'est pas attachée à la notion d'applet :

    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
     
    import javax.sound.sampled.AudioInputStream;
    import javax.sound.sampled.AudioSystem;
    import javax.sound.sampled.Clip;
    public class Sound implements AutoCloseable {
        private final Clip audioClip;  //le son créé depuis l'url
     
        public Sound(String name) {
            final Url url = Sound.class.getResource("/son/"+name);
            audioClip = AudioSystem.getClip();
            audioClip.open(AudioSystem.getAudioInputStream(url));
        }
        public void jouer() {
           audioClip.start();
        }
        public void jouerEnBoucle() {
           audioClip.loop(Clip.LOOP_CONTINUOUSLY);
        }
        public void jouerPlusieursFois(int nb) {
           audioClip.loop(nb);
        }
        public void arreter() {
            audioClip.stop();
        }
     
        @Override
        public void close() {
            audioclip.close();
        }
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Merci pour votre réponse rapide. J'ai bien pris en compte vos remarques, j'avais cependant une erreur "non-static method cannot be referenced from a static context" car je faisais appel à la méthode jouer dans une autre classe, mais je l'ai fixé en créant une instance de Sound dans cette classe.
    Cependant, mon problème initial est toujours là, j'ai toujours l'erreur :
    Exception in thread "main" java.lang.NullPointerException
    at sun.applet.AppletAudioClip.<init>(AppletAudioClip.java:65)
    at java.applet.Applet.newAudioClip(Applet.java:311)
    at src.Sound.<init>(Sound.java:14)
    at src.Go.main(Go.java:7)
    (Go étant la classe dans laquelle je fais appel à la méthode jouer.)
    Voici le code de la classe Sound :
    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
     
    import java.applet.Applet;
    import java.applet.AudioClip;
     
    import java.net.URL;
     
    public class Sound {
        private final AudioClip audioClip;  //le son créé depuis l'url
     
        public Sound() {
            URL url;
            url = Sound.class.getResource("clap.au");
            audioClip = Applet.newAudioClip(url);
        }
        public void jouer() {
           audioClip.play();
        }
        public void jouerEnBoucle() {
           audioClip.loop();
        }
        public void arreter() {
            audioClip.stop();
        }
    }
    et celui de la classe Go :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Go {
     
        public static void main(String[] args) {
            Game game=new Game();
            Sound sound = new Sound();
            sound.jouer();
        }
    }
    C'est donc apparemment l'emplacement du fichier "clap.au" qui pose problème. Ou dois je le mettre exactement ? Je l'avais mis à la base dans le dossier contenant les dossiers src et classes, mais cela ne marche pas..
    (Est ce peut être le format .au qui est le souci ?)

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    septembre 2009
    Messages
    12 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2009
    Messages : 12 373
    Points : 29 307
    Points
    29 307
    Billets dans le blog
    2
    Par défaut
    Si tu utilises un chemin d'accèse "/son/applaudissements.au", c'est que ton arborescence de sources doit être :

    • src (ton dossier de sources)
      • package.truc (ton/tes package/s)
        • tes sources (*.java)
      • son (ton dossier de sons)
        • applaudissements.au (et autres eventuels)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Intégrer un JDK à son projet Java
    Par Tiétio dans le forum Général Java
    Réponses: 13
    Dernier message: 29/06/2009, 15h06
  2. Intégrer un son ou une image à l'application
    Par avogadro dans le forum Langage
    Réponses: 10
    Dernier message: 06/10/2007, 00h00
  3. carte son et java
    Par ghilen06 dans le forum Multimédia
    Réponses: 2
    Dernier message: 28/03/2007, 18h10
  4. Sons en Java
    Par f2001 dans le forum Multimédia
    Réponses: 5
    Dernier message: 09/10/2006, 18h27
  5. Sons en java
    Par Satch dans le forum Multimédia
    Réponses: 7
    Dernier message: 16/07/2004, 09h20

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