English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Un, principe de mise en œuvre du lecteur de musique
Les fonctionnalités multimédias de JavaSE sont très faibles, donc il y a un plugin spécialisé pour le traitement des multimédias appelé JMF, le modèle fourni par JMF peut être divisé en environ sept catégories
* Source de données (Data source)
* Appareil de capture (Capture Device, y compris les appareils de capture vidéo et audio)
* Lecteur (Player)
* Traitement (Processor)
* Piscine de données (DataSink)
* Format de données (Format)
* Gestionnaire (Manager)
Et ce lecteur de musique MyMusicPlayer (c'est le nom de la classe que j'ai créé) appelle la classe Player de JMF pour réaliser ses fonctions de lecture et autres.
Nous devons d'abord installer JMF. L'installation de JMF, je crois que pour de nombreux débutants est très difficile, JMF ne prend en charge que32La version JDK, mais comme l'environnement IDE comme eclipse doit correspondre à JDK, c'est-à-dire que l'environnement IDE doit prendre en charge32La version JDK. Après l'installation de JMF, parfois pour MP3La lecture n'a pas réussi, il faut installer JMF mp3plugin.
Deux, effet visuel de l'interface
Trois, diagramme de structure des fonctions
Quatre, le code pour diverses fonctions d'implémentation
public class MyMusicPlayer implements ActionListener, ControllerListener, Runnable{ JFrame j = new JFrame("Lecteur de musique"); JLabel TablePlaer = new JLabel("Liste de lecture"); JButton BAdd = new JButton("Ajouter une chanson"); JButton BDelect = new JButton("Supprimer la chanson"); JButton BDelectTable = new JButton("Vider la liste"); JButton BMoveNext = new JButton("Chanson suivante"); JButton BMovePrevious = new JButton("Chanson précédente"); JButton BPlayer = new JButton("Pause"); JButton BStop = new JButton("Arrêter"); JButton BSet = new JButton("Afficher les paroles"); JButton BEnd = new JButton("Arrêter"); String[] s={"Lecture en ordre","Lecture en boucle","Lecture aléatoire"}; //Tableau d'options de liste déroulante JComboBox select=new JComboBox(s); //Créer des options de liste déroulante JPanel p1=new JPanel(); //Zone de liste de lecture JPanel p=new JPanel(); JPanel p2=new JPanel(); //Zone de boutons JPanel p3=new JPanel(); JLabel l=new JLabel(); JPanel p5=new JPanel(); //Placer la liste de lecture JPanel p6=new JPanel(); //Placer le nom de la chanson jouée static JPanel pp=new JPanel(); static JLabel lb; public static JTextArea jt=new JTextArea(); static int index; //Indice de la liste de lecture int count; int flag; //Marquer s'il s'agit de lecture aléatoire ou de lecture en ordre int countSecond; //Obtenir la valeur totale du temps de la musique static int newtime = 0; int ischanging = 0; //Lorsque la souris clique sur le curseur, la valeur de progression change également int ispressing = 0; //Vérifier si la souris clique sur le curseur File MusicName = null; static java.util.List<File> MusicNames = null; //Créer un objet File avec le concept de generics File currentDirectory = null; List list;// Liste de fichiers FileDialog open; // Définir l'objet de dialogue de fichier Random rand = new Random(); String filename; //Barre de progression JButton timeInformation = new JButton(); JSlider timeSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 100, 0); //Le ensemble de constantes (SwingConstants.HORIZONTAL) pour orienter la barre de progression dans la direction horizontale //( 0, 10Créer un glisseur horizontal avec les valeurs minimales, maximales et initiales spécifiées. // 播放 Player player = null; MusicFileChooser fileChooser = new MusicFileChooser(); static JTextPane tp=new JTextPane() //Zone d'affichage des paroles static JTextArea are=new JTextArea(); //Zone d'affichage d'image public MyMusicPlayer(){ j.setSize(1200, 700); j.setLayout(null); j.getContentPane().setBackground(Color.BLACK); j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); p.setBounds(2, 563, 1180, 95); p.setLayout(new BorderLayout()); p1.setBounds(2, 3, 298, 30); p1.setBackground(new Color(255,255,255)); p2.setLayout(new GridLayout(2,3,20,20)); p2.setBackground(Color.LIGHT_GRAY); p3.setLayout(new GridLayout(2,0,200,10)); p3.setBackground(new Color(255,255,255)); p5.setBounds(2, 35, 298, 526); p5.setLayout(null); p5.setBackground(new Color(255,255,255)); p6.setBounds(301, 3,880, 30); p6.setLayout(null); p6.setBackground(new Color(255,255,255)); l.setBounds(250, 4, 600, 30); //Définir la chanson affichée p6.add(l); /*Mise en œuvre de l'insertion d'image * */ ImageIcon ic=new ImageIcon("image\\2.3.jpg"); ic=new ImageIcon(ic.getImage().getScaledInstance(880, 477, 2)); //Obtention de l'image et ajustement de la taille de l'image lb=new JLabel(ic); lb.setOpaque(false); pp.setOpaque(false); //Rendu transparent pp.setBounds(241, 80,990, 500); are.setBounds(241, 56,990, 520); are.setOpaque(false); tp.setBackground(new Color(255,255,255)); tp.setBounds(301, 35,880, 49); pp.add(are); pp.add(lb); // Liste de fichiers list = new List(10); list.setBounds(100, 55, 187, 495); //Zone de liste list.addActionListener(this); j.add(list); j.add(jt); j.add(tp); BAdd.setBounds(5,20, 90,30); BAdd.setBackground(new Color(255,255,255)); BDelect.setBounds(5, 80, 90, 30); BDelect.setBackground(new Color(255,255,255)); BDelectTable.setBounds(5, 140, 90, 30); BDelectTable.setBackground(new Color(255,255,255)); TablePlaer.setBounds(30, 100, 200, 50); TablePlaer.setFont(new Font("宋体",1, 20)); p1.add(TablePlaer); BMovePrevious.setBackground(new Color(255,255,255)); BPlayer.setBackground(new Color(255,255,255)); BMoveNext.setBackground(new Color(255,255,255)); BStop.setBackground(new Color(255,255,255)); select.setBackground(new Color(255,255,255)); BSet.setBackground(new Color(255,255,255)); p2.add(BMovePrevious); p2.add(BPlayer); p2.add(BMoveNext); p2.add(BStop); p2.add(select); p2.add(BSet); p2.setBackground(new Color(255,255,255)); p.add(p2,BorderLayout.WEST); p.add(p3,BorderLayout.CENTER); p5.add(p); p5.add(BAdd); p5.add(BDelect); p5.add(BDelectTable); BAdd.addActionListener(this); BDelect.addActionListener(this); BDelectTable.addActionListener(this); BMoveNext.addActionListener(this); BPlayer.addActionListener(this); BMovePrevious.addActionListener(this); BStop.addActionListener(this); select.addActionListener(this); BSet.addActionListener(this); timeInformation.setEnabled(false); /* * 实现进度条 * */ timeSlider.setMajorTickSpacing(1);//Appeler cette méthode pour définir l'intervalle des marqueurs des grandes échelles. Le nombre entré représente la distance mesurée en valeur entre chaque marqueur de grande échelle. timeSlider.setPaintTicks(true); //Pour dessiner les grandes échelles, setPaintTicks doit être réglé sur true timeSlider.addChangeListener(new ChangeListener() { //Créer un nouveau ChangeListener et l'ajouter au curseur. public void stateChanged(ChangeEvent arg0) { if (player != null && ispressing == 1) { newtime = (int)((JSlider)arg0.getSource()).getValue(); timeInformation.setText("Current time:"+newtime/60+":"+newtime%60+" || "+" Total time: "+countSecond/60+":"+countSecond%60); ischanging = 1; } } }); timeSlider.addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent arg0) { ispressing = 1; //Lorsque le curseur est cliqué par la souris } public void mouseReleased(MouseEvent arg0) { ispressing = 0; //Lorsque le curseur n'est pas cliqué par la souris } }); timeInformation.setText("Current time: 00:00 || Total time: 00:00"); timeInformation.setBackground(new Color(255,255,255)); p3.add(timeInformation,BorderLayout.NORTH); p3.add(timeSlider,BorderLayout.SOUTH); j.add(pp); j.add(p5); j.add(p); j.add(p1); j.add(p6); j.setVisible(true); // j.setResizable(false); } /* * Fonction principale * */ public static void main(String[] args) throws IOException, InterruptedException { //InterruptedException: Exception lancée lorsque le thread est en attente, en sommeil ou en occupation avant ou pendant une activité et que ce thread est interrompu MyMusicPlayer play=new MyMusicPlayer(); Thread timeRun = new Thread(play); timeRun.start(); } @Override public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); //En obtenant la chaîne de caractères, déterminer s'il s'agit de lecture ou d'arrêt de lecture, String box=(String)select.getSelectedItem(); //判断播放的顺序 if(e.getSource()==BAdd) { if (player == null) { if (fileChooser.showOpenDialog(j) == MusicFileChooser.APPROVE_OPTION) { this.MusicName = fileChooser.getSelectedFile(); File cd = fileChooser.getCurrentDirectory(); //Obtenir le chemin actuel if (cd != this.currentDirectory || this.currentDirectory == null) { FileFilter[] fileFilters = fileChooser.getChoosableFileFilters(); //FileFilter est une classe abstraite, JFileChooser l'utilise pour filtrer la collection de fichiers affichée à l'utilisateur File files[] = cd.listFiles(); //cd.listFiles() représente un tableau de noms de chemins abstraits, ces noms de chemins représentant les fichiers du répertoire indiqué. this.MusicNames = new ArrayList<File>(); for (File file : files) { //Chaque itération attribue l'objet fichier de l'array à la variable file, puis opère sur cette variable dans le corps de la boucle : //for(int i=0;i<files.length;i++{ file = files[i];…} filename = file.getName().toLowerCase(); //Obtenir tous les noms de musique for (FileFilter filter : fileFilters) { if (!file.isDirectory() && filter.accept(file)) { this.MusicNames.add(file); list.add(filename); filename=e.getActionCommand(); } } } } index = MusicNames.indexOf(MusicName); //définir l'indice de la chanson count = MusicNames.size(); PlayFile(); } } else { player.start(); } } if(cmd.equals("暂停")){ BPlayer.setText("Jouer"); player.stop(); } if(cmd.equals("播放")){ BPlayer.setText("Pause"); player.start(); } if(e.getSource()==BStop){ //arrêter if (player != null) { player.stop(); timeInformation.setText("Temps actuel:00:00 || Temps total:00:00"); timeSlider.setValue(0); player.setMediaTime(new Time(0)); //réinitialiser le temps } } if(e.getSource()==BMoveNext){ //morceau suivant if (player != null) { if("顺序播放".equals(box)){ nextMusic(); } if("随机播放".equals(box)){ int index = (int) rand.nextInt(this.MusicNames.size())+1; if (this.MusicNames != null && !this.MusicNames.isEmpty()) { if ( ++index == this.MusicNames.size()) { index=(int) rand.nextInt(this.MusicNames.size())+1; } player.stop(); //si vous cliquez sur le morceau précédent, arrêtez la lecture actuelle et jouez le morceau précédent try { player=Manager.createRealizedPlayer(MusicNames.get(index).toURI().toURL()); player.prefetch(); player.setMediaTime(new Time(0.0));// Commencer à jouer à partir d'un certain moment player.addControllerListener(this); l.setText("En lecture : ",+this.MusicNames.get(index).toString()); list.select(index); player.start(); flag=1; } catch (NoPlayerException | CannotRealizeException | IOException e1) { e1.printStackTrace(); } } } } } if(e.getSource()==BMovePrevious){ //morceau précédent if (player != null) { if("顺序播放".equals(box)){ PreviousMusic(); } if("随机播放".equals(box)){ int index = (int) rand.nextInt(this.MusicNames.size())+1; if (this.MusicNames != null && !this.MusicNames.isEmpty()) { if ( index--== (int) rand.nextInt(this.MusicNames.size())+1) { index = this.MusicNames.size() - 1; } player.stop(); //si vous cliquez sur le morceau précédent, arrêtez la lecture actuelle et jouez le morceau précédent try { player=Manager.createRealizedPlayer(MusicNames.get(index).toURI().toURL()); player.prefetch(); player.setMediaTime(new Time(0.0));// Commencer à jouer à partir d'un certain moment player.addControllerListener(this); l.setText("En lecture : ",+this.MusicNames.get(index).toString()); list.select(index); player.start(); flag=1; } catch (NoPlayerException | CannotRealizeException | IOException e1) { e1.printStackTrace(); } } } } } if(e.getSource()==BDelect){ //supprimer la chanson index = list.getSelectedIndex(); list.remove(index); MusicNames.remove(this.index); } if(e.getSource()==BDelectTable){ //vider la liste list.removeAll(); MusicNames.removeAll(MusicNames); player.stop(); player = null; } //lors du double clic sur la liste effectuer la lecture list.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { // lors du double clic traiter if (e.getClickCount() == 2) { if(player!=null){ player.stop(); } // 播放选中的文件 index=list.getSelectedIndex(); PlayFile(); } } }); } // 因为实现了"ControllerListener"接口,本方法用于处理媒体播放器传来的事件; public void controllerUpdate(ControllerEvent e) { String box=(String)select.getSelectedItem(); //判断播放的顺序 if (e instanceof EndOfMediaEvent) { player.setMediaTime(new Time(0)); if ("单曲循环".equals(box)) { player.start(); } if("顺序播放".equals(box)){ nextMusic(); } if("随机播放".equals(box)){ if (this.MusicNames != null && !this.MusicNames.isEmpty()) { int index = (int) rand.nextInt(this.MusicNames.size())+1; try { player=Manager.createRealizedPlayer(MusicNames.get(index).toURI().toURL()); player.prefetch(); player.setMediaTime(new Time(0.0));// Commencer à jouer à partir d'un certain moment player.addControllerListener(this); l.setText("En lecture : ",+this.MusicNames.get(index).toString()); list.select(index); player.start(); flag=1; } catch (NoPlayerException | CannotRealizeException | IOException e1) { e1.printStackTrace(); } } } } } /** * 获取MP3歌曲名 * * @MP3文件路径 * @歌曲名 */ public String getMusicName(String str) { int i; for (i = str.length() - 1; i > 0; i--) { if (str.charAt(i) == '\\') break; } str = str.substring(i + 1, str.length() - 4); return str; } /** * 下一首 实现函数 */ public void nextMusic() { } /** * 上一首实现函数 */ public void PreviousMusic() { } /** * Jouer MP3Fonction principale du fichier */ public void PlayFile() { try { player = Manager.createRealizedPlayer(MusicNames.get(index).toURI().toURL()); player.prefetch(); player.setMediaTime(new Time(0.0));// Commencer à jouer à partir d'un certain moment player.addControllerListener(this); l.setFont(new Font("宋体",0,20)); l.setText("En lecture : ",+this.MusicNames.get(index).toString()); //Afficher la chanson en cours de lecture list.select(index); player.start(); Mythread11 tt=new Mythread11(); tt.start(); } catch (Exception e1) { //Lorsque vous ne pouvez pas jouer une musique, traitez-la dealError(); return; } this.setFrame(); } public void setFrame() { countSecond = (int)player.getDuration().getSeconds(); timeSlider.setMaximum(countSecond); timeSlider.setValue(0); newtime = 0; } private void dealError() { // TODO Auto-méthode d'esquisse générée MusicNames.remove(index); if( --count == index ) index = 0; if( count == 0) player = null; else PlayFile(); } /** * MP3Classe interne de filtrage de fichiers */ class MusicFileChooser extends JFileChooser { } /** * MP3Classe interne d'assistance de filtrage de fichiers * */ class MyFileFilter extends FileFilter { //FileFilter est une classe abstraite, JFileChooser l'utilise pour filtrer la collection de fichiers affichée à l'utilisateur String[] suffarr; String decription; public MyFileFilter() { super(); } public MyFileFilter(String[] suffarr, String decription) { super(); this.suffarr = suffarr; this.decription = decription; } public boolean accept(File f) { for (String s : suffarr) { if (f.getName().toUpperCase().endsWith(s)) { return true; } } return f.isDirectory(); } public String getDescription() { return this.decription; } } /** * lire et afficher la barre de progression du temps */ public void run() { while(true) { sleep(); if(player != null) { if(ispressing == 0) { if(ischanging == 1) { newtime = timeSlider.getValue(); player.setMediaTime(new Time(((long)newtime)*1000000000)); ischanging = 0; } else { newtime = (int)player.getMediaTime().getSeconds(); timeSlider.setValue(newtime); timeInformation.setText("Heure actuelle : "+newtime/60+":"+newtime%60+" || "+" Temps total : "+countSecond/60+":"+countSecond%60); } } } } } //implémentation du thread de paroles class Mythread11 extends Thread { public void run() { // TODO Auto-méthode d'esquisse générée try{ LRC lrc = ReadLRC.readLRC("Traveling Light.lrc"); Lyrics ls = ParseLRC.parseLRC(lrc); playTest(ls);}} }catch(Exception e){ } } } static void playTest(Lyrics ls) throws InterruptedException { tp.setFont(new Font("宋体",1,20)); tp.setForeground(Color.BLUE); StyledDocument doc = tp.getStyledDocument(); SimpleAttributeSet center = new SimpleAttributeSet(); StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER); //Afficher la zone de lyrics doc.setParagraphAttributes(0, doc.getLength(), center, false); tp.setText("Artiste : ", + ls.getAr()); tp.setText("Album : ", + ls.getAl()); tp.setText("Chanson : ", + ls.getTi()); tp.setText("Création de la lyrics : ", + ls.getBy()); for (Lyric l : ls.getLyrics()) { tp.setText(l.getTxt()); Thread.sleep(l.getTimeSize()); } } }
Cinquième, l'effet global du test
Ainsi
Pour plus d'informations sur les lecteurs, cliquez sur 'Fonction du lecteur Java' pour apprendre.
Ceci est le contenu intégral de cet article, j'espère que cela aidera à votre apprentissage, et j'espère que vous continuerez à soutenir le tutoriel de cri.