English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Impara a creare facilmente un riproduttore musicale in Java

1. Realizzazione del riproduttore musicale

 Le funzionalità multimediali di Javase sono deboli, quindi esiste un plugin speciale per la gestione dei multimediali chiamato JMF, i modelli forniti da JMF possono essere raggruppati in circa sette categorie

* Sorgente dati (Data source)
* Dispositivo di cattura (Capture Device, inclusi dispositivi di cattura video e audio)
* Riproduttore (Player)
* Processore (Processor)
* Piscina dati (DataSink)
* Formato dati (Format)
* Gestore (Manager)

E il riproduttore musicale che sto creando, MyMusicPlayer (questo è il nome della mia classe), utilizza la classe Player di JMF per implementare diverse funzioni di riproduzione.

Prima di tutto, dobbiamo installare JMF. L'installazione di JMF può essere una grande sfida per molti principianti, poiché JMF supporta solo le versioni JDK a 32 bit, mentre ambienti IDE come Eclipse devono corrispondere al JDK, ovvero l'ambiente IDE deve supportare le versioni JDK a 32 bit. Dopo aver installato JMF, a volte il riproduzione di MP3 non è riuscita e potrebbe essere necessario installare il plugin mp3plugin di JMF.

due, effetto visivo dell'interfaccia

tre, diagramma della struttura delle funzionalità

quattro, codice per vari tipi di funzionalità

public class MyMusicPlayer implements ActionListener, ControllerListener,Runnable{
 JFrame j=new JFrame("riproduttore musicale");
 JLabel TablePlaer=new JLabel("lista di riproduzione");
 JButton BAdd=new JButton("aggiungere la canzone");
 JButton BDelect=new JButton("eliminare la canzone");
 JButton BDelectTable=new JButton("pulire la lista");
 JButton BMoveNext=new JButton("canzone successiva");
 JButton BMovePrevious=new JButton("canzone precedente");
 JButton BPlayer=new JButton("pausa");
 JButton BStop=new JButton("fermare");
 JButton BSet=new JButton("mostra le parole");
 JButton BEnd=new JButton("fermare");
 String[] s={"riproduzione in ordine","riproduzione in loop singolo","riproduzione casuale"};        //array delle opzioni della lista a discesa
 JComboBox select=new JComboBox(s);          //creare le opzioni a discesa
 JPanel p1=new JPanel();           //area della lista di riproduzione
 JPanel p=new JPanel(); 
 JPanel p2=new JPanel();           //area dei pulsanti
 JPanel p3=new JPanel(); 
 JLabel l=new JLabel(); 
 JPanel p5=new JPanel(); //posizionare la lista di riproduzione
 JPanel p6=new JPanel(); //posizionare il nome della canzone in riproduzione
 static JPanel pp=new JPanel();
 static JLabel lb;
 public static JTextArea jt=new JTextArea();
 static int index; // 播放列表的下标
 int count;
 int flag; // 标记是随机播放还是顺序播放
 int countSecond; // 获取音乐的总时间值
 static int newtime = 0;
 int ischanging = 0; // 当鼠标是对游标进行点击,进度值也会改变
 int ispressing = 0; // 判断鼠标是否对游标进行点击
 File MusicName = null;
 static java.util.List<File> MusicNames = null; // 使用泛型,创建File对象
 File currentDirectory = null;
 List list; // 文件列表
 FileDialog open; // 定义文件对话框对象
 Random rand = new Random();
 String filename;
 // 进度条
 JButton timeInformation = new JButton();
 JSlider timeSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 100, 0); // (SwingConstants.HORIZONTAL)用于定向进度条为水平方向的常量集合
                     // (0, 100, 0)使用指定的最小值、最大值和初始值创建一个水平滑块。
 // 播放
 Player player = null; 
 MusicFileChooser fileChooser = new MusicFileChooser();
 static JTextPane tp=new JTextPane();  //显示歌词区域
 static JTextArea are=new JTextArea(); //显示图片区域
 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);  //设置显示播放的歌曲
  p6.add(l);
  /*实现图片插入
   /* */
  ImageIcon ic = new ImageIcon("image\\2.3.jpg");
  ic = new ImageIcon(ic.getImage().getScaledInstance(880, 477, 2)); //获取图片以及设置图片大小
  lb = new JLabel(ic);
  lb.setOpaque(false);   
  pp.setOpaque(false);  //设置为透明
  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);
  // 文件列表
  list = new List(10);
  list.setBounds(100, 55, 187, 495); //区域 elenco
  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);
   /*
   * Implementa la barra di avanzamento
   /* */ 
   timeSlider.setMajorTickSpacing(1); //Chiamare questo metodo per impostare l'intervallo delle tacche principali. Il numero passato rappresenta la distanza misurata in valore tra ogni tacca principale.
   timeSlider.setPaintTicks(true); //Per disegnare le tacche principali, setPaintTicks deve essere impostato su true
   timeSlider.addChangeListener(new ChangeListener() { //Aggiungi un nuovo ChangeListener alla barra di scorrimento.
    public void stateChanged(ChangeEvent arg0) {
     if (player != null && ispressing == 1) {
      
      timeInformation.setText("Tempo corrente:\
      ischanging = 1;
     }
    }
   });
   timeSlider.addMouseListener(new MouseAdapter(){
    public void mousePressed(MouseEvent arg0) {
     ispressing = 1;   //当鼠标对游标进行点击时
    }
    public void mouseReleased(MouseEvent arg0) {
     ispressing = 0;   //当鼠标不对游标进行点击时
    }
   });
   timeInformation.setText("当前时间:00:00  ||  总时间: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);
 }
 /*
  /* 主函数 */
  /* */
 public static void main(String[] args) throws IOException, InterruptedException { //InterruptedException:当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常
  MyMusicPlayer play=new MyMusicPlayer();
  Thread timeRun = new Thread(play);
  timeRun.start(); 
 }
 @Override
 public void actionPerformed(ActionEvent e) {
  String cmd = e.getActionCommand();     //通过获取字符串来判断是播放还是暂停,
  String box = (String) select.getSelectedItem();   // Determinare l'ordine di riproduzione
  if(e.getSource()==BAdd)
  {
   if (player == null) {
    if (fileChooser.showOpenDialog(j) == MusicFileChooser.APPROVE_OPTION) {
     this.MusicName = fileChooser.getSelectedFile();
     File cd = fileChooser.getCurrentDirectory(); // Ottenere il percorso corrente
     if (cd != this.currentDirectory|| this.currentDirectory == null) {
      FileFilter[] fileFilters = fileChooser.getChoosableFileFilters(); // FileFilter è una classe astratta, JFileChooser lo utilizza per filtrare la raccolta di file visualizzati all'utente
      File files[] = cd.listFiles(); // cd.listFiles() restituisce un array di nomi di percorso astratti, che rappresentano i file nel percorso astratto rappresentato.
      this.MusicNames = new ArrayList<File>();
      for (File file : files) { // In ogni ciclo, assegnare l'oggetto File dell'array all'oggetto file, quindi operare su questo oggetto nel corpo del ciclo come:
             //for(int i=0;i<files.length;i++){ file = files[i];……}
       filename = file.getName().toLowerCase();   // Ottenere tutti i nomi delle musiche
       for (FileFilter filter : fileFilters) {
        if (!file.isDirectory() && filter.accept(file)) {
         this.MusicNames.add(file);
          list.add(filename);
         filename=e.getActionCommand();
        }
       }
      }
     }
     index = MusicNames.indexOf(MusicName); // Definire l'indice della canzone
     count = MusicNames.size();
     PlayFile();
    }
   } else {
    player.start();
   }
  }
  if(cmd.equals("Pausa")){
   BPlayer.setText("Play");
   player.stop();  
   }
  if(cmd.equals("Play")){
   BPlayer.setText("Pausa");
   player.start();
  }
  if(e.getSource()==BStop){   // Fermare
    if (player != null) {
     player.stop();
     timeInformation.setText("Ora corrente:00:00  ||  Tempo totale:00:00");
     timeSlider.setValue(0);
     player.setMediaTime(new Time(0)); // Imposta il tempo a zero
  }
    }
  if(e.getSource()==BMoveNext){  // Brano successivo
    if (player != null) {
     if("Riproduzione in ordine".equals(box)){
      nextMusic();
     }
     if("Riproduzione casuale".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();   // Se si clicca sul brano precedente, fermare la riproduzione corrente e riprodurre il brano precedente
         try {
          player = Manager.createRealizedPlayer(MusicNames.get(index).toURI().toURL());
          player.prefetch();
          player.setMediaTime(new Time(0.0)); //Inizia a riprodurre da un certo punto
          player.addControllerListener(this);
          l.setText("Riproduzione in corso: " + this.MusicNames.get(index).toString());
          list.select(index);
          player.start(); 
          flag=1;
         } catch (NoPlayerException | CannotRealizeException | IOException e1) {
          e1.printStackTrace();
         }
       }
     }
    }
  }
  if(e.getSource()==BMovePrevious){  // Brano precedente
    if (player != null) {
     if("Riproduzione in ordine".equals(box)){
      PreviousMusic();
     }
     if("Riproduzione casuale".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();    // Se si clicca sul brano precedente, fermare la riproduzione corrente e riprodurre il brano precedente
       try {
        player = Manager.createRealizedPlayer(MusicNames.get(index).toURI().toURL());
        player.prefetch();
        player.setMediaTime(new Time(0.0)); //Inizia a riprodurre da un certo punto
        player.addControllerListener(this);
        l.setText("Riproduzione in corso: " + this.MusicNames.get(index).toString());
        list.select(index);
        player.start(); 
        flag=1;
       } catch (NoPlayerException | CannotRealizeException | IOException e1) {
        e1.printStackTrace();
       }
      }
    }
    }
  }
  if(e.getSource()==BDelect){    // Elimina la canzone
   index =list.getSelectedIndex();
   list.remove(index);
   MusicNames.remove(this.index);
  }
  if(e.getSource()==BDelectTable){   // Svuota la lista
   list.removeAll();
   MusicNames.removeAll(MusicNames);
   player.stop();
   player = null;
  }
  // Implementa la riproduzione quando si fa doppio clic sulla lista
  list.addMouseListener(new MouseAdapter() {
   public void mouseClicked(MouseEvent e) {
    // Gestisci l'azione quando viene fatto doppio clic
    if (e.getClickCount() == 2) {
     if(player!=null){
      player.stop();
     }
     // Riproduci il file selezionato
     index=list.getSelectedIndex();
     PlayFile();
    } 
   }
  });
}
 // Poiché ha implementato l'interfaccia "ControllerListener", questo metodo viene utilizzato per gestire gli eventi ricevuti dal riproduttore multimediale;
 public void controllerUpdate(ControllerEvent e) {
  String box = (String) select.getSelectedItem();   // Determinare l'ordine di riproduzione
  if (e instanceof EndOfMediaEvent) {
   player.setMediaTime(new Time(0));
   if ("Riproduzione in loop singolo".equals(box)) {
    player.start();
   }
   if("Riproduzione in ordine".equals(box)){
    nextMusic();
   }
   if("Riproduzione casuale".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)); //Inizia a riprodurre da un certo punto
        player.addControllerListener(this);
        l.setText("Riproduzione in corso: " + this.MusicNames.get(index).toString());
        list.select(index);
        player.start(); 
        flag=1;
       } catch (NoPlayerException | CannotRealizeException | IOException e1) {
        e1.printStackTrace();
       }
     }
   }
  }
 }
  /**
  * Ottieni il nome della canzone MP3
  * 
  * @Percorso del file MP3
  * @Nome della canzone
  */
 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;
 }
 /**
  * Funzione di implementazione del riproduzione del brano successivo
  */
 public void nextMusic() {
 }
 /**
  * Funzione di implementazione del riproduzione del brano precedente
  */
 public void PreviousMusic() {
 }
 /**
  * Funzione principale di riproduzione del file MP3
  */
 public void PlayFile() {
  try {
   player = Manager.createRealizedPlayer(MusicNames.get(index).toURI().toURL());
   player.prefetch();
   player.setMediaTime(new Time(0.0)); //Inizia a riprodurre da un certo punto
   player.addControllerListener(this);
   l.setFont(new Font("Songti",0,20));
   l.setText("In riproduzione: " + this.MusicNames.get(index).toString()); //Mostra la canzone che sta venendo riprodotta
   list.select(index);
   player.start();
   Mythread11 tt=new Mythread11();
   tt.start();
  } catch (Exception e1) { //Quando si incontra una canzone che non può essere riprodotta, gestirla
   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-generated method stub
 MusicNames.remove(index);
 if( --count == index )
  index = 0;
 if( count == 0)
  player = null;
 else
  PlayFile();
 }
/**
 * Classe interna di filtraggio dei file MP3
 */
class MusicFileChooser extends JFileChooser {
 }
/**
 * Classe interna di filtraggio dei file MP3
 * 
 */
class MyFileFilter extends FileFilter { //FileFilter è una classe astratta, JFileChooser lo utilizza per filtrare la raccolta di file visualizzati all'utente
 String[] suffarr;
 String descrizione;
 public MyFileFilter() {
  super();
 }
 public MyFileFilter(String[] suffarr, String description) {
  super();
  this.suffarr = suffarr;
  this.description = description;
 }
 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.description;
 }
}
/**
 /* Read and display time progress bar */
 */
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("Current time: " + newtime / 60 + ":" + newtime % 60 + "  ||  "+ "Total time: "+ countSecond / 60 + ":" + countSecond % 60);
    }
   }
  }
 }
}
// Implement lyrics thread
class Mythread11 extends Thread { 
 public void run() {
  // TODO Auto-generated method stub
  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);  // Visualizzazione dell'area delle parole
 doc.setParagraphAttributes(0, doc.getLength(), center, false);
 tp.setText("Artista: " + ls.getAr());
 tp.setText("Album: " + ls.getAl());
 tp.setText("Brano: " + ls.getTi());
 tp.setText("Creazione delle parole: " + ls.getBy());
 for (Lyric l : ls.getLyrics()) {
  tp.setText(l.getTxt());
  Thread.sleep(l.getTimeSize());
 }
}
}

V. Effetti di test generali

Come segue

Per ulteriori informazioni sui riproduttori, fate clic su 'Funzioni del riproduttore java' per imparare.

Questo è tutto il contenuto dell'articolo, spero che sia utile per il vostro studio. Spero anche che possiate sostenere Tutorial di urlaio.

Ti piacerebbe anche