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

EDT/SwingWorker Java Discussion :

Thread lecture audio


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 469
    Par défaut Thread lecture audio
    Bonjour,
    après avoir lu des tonnes de documentation sur EDT, les threads, SwingWorker, après avoir essayé de comprendre beaucoup d'exemples, j'en suis toujours au même point : c'est à dire que je ne sais par quel bout prendre le problème. Je pense donc que je n'ai pas vraiment compris malgré quelques réalisations qui marchent.

    Mon problème est le suivant : je veux lire un fichier mp3 à l'aide de JavaZoom (si quelqu'un connait un autre lecteur de MP3 open source et simple, je suis preneur). Je veux bien entendu que mon interface graphique continue à réagir en particulier comme expliquer dans la solution de kox2ee avec qui j'ai beaucoup échangé. Il me faudrait en plus une barre de progression qui indique où l'on en est du morceau.
    Ce qui me gène dans les exemples que j'ai trouvé c'est que la tache longue considéré est toujours une boucle qui effectue de nombreuses fois une opération atomique. Je ne pense pas pouvoir faire la même chose car l'opération atomique est la lecture du morceau de musique. Je ne vois comme solution que de rentrer dans le code de javazoom pour voir comment est traité le thread de lecture (j'espère ne pas dire trop de conneries).

  2. #2
    Membre chevronné
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Par défaut
    Bonjour,
    effectivement, avec la lecture d'un flux audio ou vidéo, l'exemple de gestion des Threads que j'ai donné n'est d'aucune utilité...

    Si tu restes sur la solution javaZoom, tu as de quoi agir sur les évènements lors de la lecture en implémentant l'interface BasicPlayerListener :

    Méthodes à implémenter avec BasicPlayerListener :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //à l'ouverture du flux
    @Override
    public void opened(Object stream, Map properties)
     
    //pendant la lecture
    @Override
    public void progress(int bytesread, long microseconds, byte[] pcmdata, Map properties)
     
    //En cas de changement d'état
    @Override
    public void stateUpdated(BasicPlayerEvent event)
    Peux tu mettre ton code de lecture, qu'on puisse voir comment utiliser ces évènements ?

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 469
    Par défaut
    Voici donc une classe test minimale. Il faudrait lui rajouter une JProgressBar mais je ne pense pas que mon incompréhension vienne de là.
    La classe de test avec sa fenêtre
    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    package TacheLongue;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.GridBagLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
     
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    import test.Lecteur1;
    import test.Son;
     
     
     
    public class TestSon extends JFrame implements ActionListener
    {
    	static Son chant;
        //les actions
    	private JButton lancer;
    	private JButton stop;
    	private JButton rejoue;
     
    	public static void main(String[] args)
    	{
            javax.swing.SwingUtilities.invokeLater(new Runnable() 
            {
                private TestSon fenetre;
     
    			public void run() 
                {
                	fenetre = new TestSon();
                    fenetre.setVisible(true);
                }
            });
    	}
     
    	public TestSon()
    	{
    		super("test son");
     
    		this.setSize (516,400);
    		//fenêtre centrée
            setLocationRelativeTo(null);
            //fermeture du programme
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
            Lecteur1 lecteur = new Lecteur1();
            JPanel bas = new JPanel(new FlowLayout());
     
            JPanel gauche = new JPanel(new GridBagLayout ());
            gauche.setPreferredSize (new Dimension(500, this.getHeight ()));
            gauche.setBackground (Color.CYAN);
            gauche.setBorder (BorderFactory.createLineBorder(Color.black,3));
     
     
            //lancer le programme
            lancer = new JButton("Lancement");
            lancer.addActionListener (this);
            //arrêter le programme
            stop = new JButton("Arrêt");
            stop.addActionListener (this);
            stop.setEnabled(false);
            //pause
            rejoue = new JButton("rejouer");
            rejoue.addActionListener (this);
            rejoue.setEnabled(false);
     
            //la construction de la fenêtre
            gauche.add(lecteur);
            bas.add (lancer);
            bas.add (stop);
            bas.add (rejoue);
     
            getContentPane().setLayout (new BorderLayout()) ;
            getContentPane ().add (gauche, BorderLayout.WEST);
            getContentPane ().add (bas,BorderLayout.SOUTH);
     
     
            String fichierSon = "." + File.separator + "donnees" + File.separator + "black bird - merle noir - Turdus merula.mp3";
            chant = new Son(fichierSon) ;
    	}
     
    	public void actionPerformed(ActionEvent arg0)
    	{
            //on arrête le programme
            if (arg0.getSource () == stop) 
            {
            	arreter();
            	return;
            }
     
            if (arg0.getSource () == lancer)
            {
            	lancer();
            	return;
            }
     
            if (arg0.getSource () == rejoue)
            {
            	rejouer();
            	return;
            }
    	}
     
    	private void rejouer()
    	{
    		// TODO Auto-generated method stub
     
    	}
     
    	private void lancer()
    	{
    		chant.start();
     
    	}
     
    	private void arreter()
    	{
    		// TODO Auto-generated method stub
     
    	}
    }
    La classe Lecteur1
    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
    package test;
     
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.beans.PropertyChangeEvent;
    import java.beans.PropertyChangeListener;
     
    import javax.swing.JPanel;
    import javax.swing.JProgressBar;
     
     
     
    public class Lecteur1 extends JPanel 
    {
        JProgressBar barre = new JProgressBar(0,100);
        Son son; // sons
    //    JButton bouton;
     
        public Lecteur1() 
        { // Constructeur
        	setPreferredSize(new Dimension(400,20));
        	setLayout(new BorderLayout());
        	barre.setStringPainted(true);
        	//barre.setPreferredSize(new Dimension(280,10));
        	add(barre,BorderLayout.CENTER);
            //ajouter un écouteur sur la barre
        	addPropertyChangeListener(new PropertyChangeListener()
            {
                public void propertyChange(PropertyChangeEvent evt) 
                {
                    if("progress".equals(evt.getPropertyName())) 
                    {
                        barre.setValue((Integer) evt.getNewValue());
                    }
                }
            });
        }
     
     
        public void lire()
        {
        	son.start();
        }
     
        public void arret()
        {
        	son.arret();
        }
     
        public boolean fini()
        {
        	return !(son.isAlive());
        }
    }
    La classe pour les sons
    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
    package test;
     
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
     
    import javax.swing.JButton;
    import javax.swing.JProgressBar;
     
    import javazoom.jl.decoder.Bitstream;
    import javazoom.jl.decoder.Header;
    import javazoom.jl.decoder.JavaLayerException;
    import javazoom.jl.player.AudioDevice;
    import javazoom.jl.player.FactoryRegistry;
    import javazoom.jl.player.Player;
     
    public class Son extends Thread
    {
    //    AdvancedPlayer lecteur; // lecteur
    	Player lecteur;
    	InputStream stream; // flux
        File fichier;
        Boolean roule;
        public float duree;
        JButton bouton;
        JProgressBar barre;
     
        public Son(String chemin)
        { // Constructeur
     
            fichier = new File(chemin); // fichier
            try
            {
                AudioDevice dev = getAudioDevice();
                stream = getInputStream();
                lecteur = new Player(stream);
    			Bitstream bs = new Bitstream(stream);
    			Header h = bs.readFrame();
    			duree = h.total_ms((int) fichier.length());
            }
            catch(Exception e ){e.printStackTrace();}
        }
     
        public Player getLecteur()
        {
    		return lecteur;
        }
     
        public float getDuree()
        {
    		return duree;
        }
     
     
        public void setBarre(JProgressBar barre)
        {
        	this.barre = barre;
        }
     
        protected AudioDevice getAudioDevice() throws JavaLayerException
        {
            return FactoryRegistry.systemRegistry().createAudioDevice();
        }
     
        protected InputStream getInputStream() throws IOException
        {
    //        System.out.println(fichier) ;
            FileInputStream fin = new FileInputStream(fichier);
            BufferedInputStream bin = new BufferedInputStream(fin);
            return bin;
        }
     
        public void arret()
        {
        	roule = false;
        	lecteur.close();
        }
     
    	public void run()
        {
    				try
    				{
    					lecteur.play();
    				}
    				catch (JavaLayerException e)
    				{
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
        } 
    }
    Pour le moment la barre de progression ne bouge pas car je ne sais pas comment récupérer dans le thread main le temps écoulé du chant qui je pense doit s'exécuter dans un autre thread (chant je crois).

    En fait je patauge largement

  4. #4
    Membre chevronné
    Homme Profil pro
    Ed Nat
    Inscrit en
    Janvier 2013
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ed Nat
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 325
    Par défaut
    JavaZoom propose déjà une classe utilisant les Threads, c'est BasicPlayer...
    Mais ça n'est pas celle que tu utilises pour l'instant.

    Ce sera plus simple à mon avis...

    La lib complète est accessible depuis javaZoom

    Et c'est sur BasicPlayer que tu vas pouvoir utiliser BasicPlayerListener en suivant cet exemple (en bas de la page)

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 469
    Par défaut
    Citation Envoyé par kox2ee Voir le message
    JavaZoom propose déjà une classe utilisant les Threads, c'est BasicPlayer...
    Mais ça n'est pas celle que tu utilises pour l'instant.

    Ce sera plus simple à mon avis...

    La lib complète est accessible depuis javaZoom

    Et c'est sur BasicPlayer que tu vas pouvoir utiliser BasicPlayerListener en suivant cet exemple (en bas de la page)
    OK Merci j'avais bien vu quelque chose de ce genre mais j'étais resté sur JLP. Je vais regarder.

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 469
    Par défaut
    J'ai réussi à tout récupérer de BasicPlayer et l'exemple marche. Il n'y a plus qu'à l'adapter à mes besoins et ça se corse.

    Donc j'ai un fichier son. Je dois créer un BasicPlayer pour l'entendre : ma première question est faudra-t-il recréer un BasicPlayer chaque fois que je changerai de fichier ou puis-je utiliser le même en changeant le flux d'entrée ?

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

Discussions similaires

  1. Problèmes de lectures audio/vidéo
    Par Z20500 dans le forum Vidéo
    Réponses: 1
    Dernier message: 11/08/2008, 11h11
  2. Pilote pour lecture audio
    Par Masterglob dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 29/05/2008, 12h19
  3. [Libraire] Son , lecture audio.
    Par RideKick dans le forum Windows Forms
    Réponses: 2
    Dernier message: 09/07/2007, 13h51
  4. lecture audio auto une fois
    Par vincz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 23/05/2007, 08h06
  5. [JavaSound] Problème de lecture audio
    Par jbond008 dans le forum Multimédia
    Réponses: 2
    Dernier message: 09/05/2007, 10h56

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