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

Ensine Você a Fácilmente Fazer um Player de Música Java

Primeiro, a implementação do reprodutor de música

 As funcionalidades de mídia do Javase são muito fracas, então há um plug-in especializado para o processamento de mídia chamado JMF, o modelo fornecido pelo JMF pode ser dividido大致 em sete tipos

* Fonte de dados (Data source)
* Dispositivo de captura (Capture Device, incluindo dispositivos de captura de vídeo e áudio)
* Reprodutor (Player)
* Processador (Processor)
* Piscina de dados (DataSink)
* Formato (Format)
* Gestor (Manager)

E o reprodutor de música que eu desenvolvi, MyMusicPlayer (esse é o nome da classe que eu criei), chama a classe Player do JMF para implementar suas funções de reprodução e outras.

Primeiro de tudo, precisamos instalar o JMF. A instalação do JMF, acredito, é muito difícil para muitos iniciantes, o JMF suporta apenas32da versão do JDK, no entanto, ambientes IDE como o eclipse devem corresponder ao JDK, ou seja, o ambiente IDE deve suportar32da versão do JDK. Após a instalação do JMF, às vezes para MP3A reprodução não foi bem-sucedida, ainda é necessário instalar o mp do JMF3plugin.

Segundo, efeito de interface

Terceiro, diagrama de estrutura de função

Quarto, código para várias funções de implementação

public class MyMusicPlayer implements ActionListener, ControllerListener, Runnable{
 JFrame j = new JFrame("Reprodutor de música");
 JLabel TablePlaer = new JLabel("Lista de reprodução");
 JButton BAdd = new JButton("Adicionar música");
 JButton BDelect = new JButton("Excluir música");
 JButton BDelectTable = new JButton("Limpar lista");
 JButton BMoveNext = new JButton("Próxima música");
 JButton BMovePrevious = new JButton("Música anterior");
 JButton BPlayer = new JButton("Pausar");
 JButton BStop = new JButton("Parar");
 JButton BSet = new JButton("Mostrar letras");
 JButton BEnd = new JButton("Parar");
 String[] s={"Reprodução sequencial","Repetição simples","Reprodução aleatória"};        //Array de opções de lista suspensa
 JComboBox select=new JComboBox(s);          //Crie opções de下拉列表
 JPanel p1=new JPanel();           //Área da lista de reprodução
 JPanel p=new JPanel(); 
 JPanel p2=new JPanel();           //Área de botões
 JPanel p3=new JPanel(); 
 JLabel l=new JLabel(); 
 JPanel p5=new JPanel(); //Coloque a lista de reprodução
 JPanel p6=new JPanel(); //Coloque o nome da música a ser reproduzida
 static JPanel pp=new JPanel();
 static JLabel lb;
 public static JTextArea jt=new JTextArea();
 static int index;  //Índice da lista de reprodução
 int count;
 int flag;   //Marque se é reprodução aleatória ou sequencial
 int countSecond; //Obtenha o valor total do tempo da música
 static int newtime = 0;
 int ischanging = 0; //Quando o cursor for clicado pelo mouse, o valor de progresso também mudará
 int ispressing = 0; //Verifique se o cursor foi clicado pelo mouse
 File MusicName = null;
 static java.util.List<File> MusicNames = null;  //Use genéricos para criar o objeto File
 File currentDirectory = null;
 List list;// Lista de arquivos
 FileDialog open; // Defina o objeto Dialogo de Arquivo
 Random rand = new Random();
 String filename;
 //Barra de progresso
 JButton timeInformation = new JButton();
 JSlider timeSlider = new JSlider(SwingConstants.HORIZONTAL, 0, 100, 0); //A coleção de constantes (SwingConstants.HORIZONTAL) usadas para orientar a barra de progresso na direção horizontal
                     //( 0, 10Crie um deslizador horizontal com os valores mínimo, máximo e inicial especificados.
 // Reprodução
 Player player = null; 
 MusicFileChooser fileChooser = new MusicFileChooser();
 static JTextPane tp=new JTextPane();  //Área de exibição de letras
 static JTextArea are=new JTextArea(); //Área de exibição de imagem
 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);  //Definir a exibição da música reproduzida
  p6.add(l);
  /*Implementar a inserção de imagem
   * */
  ImageIcon ic=new ImageIcon("image\\2.3.jpg");
  ic=new ImageIcon(ic.getImage().getScaledInstance(880, 477, 2)); //Obter imagem e ajustar o tamanho da imagem
  lb=new JLabel(ic);
  lb.setOpaque(false);   
  pp.setOpaque(false);  //Definido como transparente
  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);
  // Lista de arquivos
  list = new List(10);
  list.setBounds(100, 55, 187, 495); //Área da lista
  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);//Chame esse método para definir o intervalo das marcas da escala principal. O número fornecido representa a distância medida em valor entre cada marca da escala principal.
   timeSlider.setPaintTicks(true); //Para desenhar a escala principal, setPaintTicks deve ser configurado como true
   timeSlider.addChangeListener(new ChangeListener() { //Criar um novo ChangeListener e adicioná-lo ao deslizador.
    public void stateChanged(ChangeEvent arg0) {
     if (player != null && ispressing == 1) {
      newtime = (int)((JSlider)arg0.getSource()).getValue();
      timeInformation.setText("Tempo atual:"+newtime/60+":"+newtime%60+"  ||  "+" Tempo total: "+countSecond/60+":"+countSecond%60);
      ischanging = 1;
     }
    }
   });
   timeSlider.addMouseListener(new MouseAdapter(){
    public void mousePressed(MouseEvent arg0) {
     ispressing = 1;   //Quando o cursor for clicado pelo mouse
    }
    public void mouseReleased(MouseEvent arg0) {
     ispressing = 0;   //Quando o cursor não for clicado pelo mouse
    }
   });
   timeInformation.setText("Tempo atual: 00:00  ||  Tempo total: 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);
 }
 /*
  * função principal
  * */
 public static void main(String[] args) throws IOException, InterruptedException { //InterruptedException: É lançada essa exceção quando uma thread está em estado de espera, sono ou ocupação antes ou durante uma atividade e a thread é interrompida
  MyMusicPlayer play=new MyMusicPlayer();
  Thread timeRun = new Thread(play);
  timeRun.start(); 
 }
 @Override
 public void actionPerformed(ActionEvent e) {
  String cmd = e.getActionCommand();     //Através de obter a string para determinar se é reprodução ou pausa,
  String box=(String)select.getSelectedItem();   //julgar a ordem de reprodução
  if(e.getSource()==BAdd)
  {
   if (player == null) {
    if (fileChooser.showOpenDialog(j) == MusicFileChooser.APPROVE_OPTION) {
     this.MusicName = fileChooser.getSelectedFile();
     File cd = fileChooser.getCurrentDirectory(); //Obter o caminho atual
     if (cd != this.currentDirectory || this.currentDirectory == null) {
      FileFilter[] fileFilters = fileChooser.getChoosableFileFilters(); //FileFilter é uma classe abstrata, JFileChooser usa ela para filtrar o conjunto de arquivos exibidos para o usuário
      File files[] = cd.listFiles(); //cd.listFiles() representa um array de nomes de caminhos abstratos, que representam os arquivos no diretório indicado por esse caminho abstrato.
      this.MusicNames = new ArrayList<File>();
      for (File file : files) { //Cada iteração atribui o objeto arquivo do array à variável file, e então opera sobre essa variável no corpo do loop, por exemplo:
             //for(int i=0;i<files.length;i++{ file = files[i];……}
       filename = file.getName().toLowerCase();   //Obter todos os nomes de música
       for (FileFilter filter : fileFilters) {
        if (!file.isDirectory() && filter.accept(file)) {
         this.MusicNames.add(file);
          list.add(filename);
         filename=e.getActionCommand();
        }
       }
      }
     }
     index = MusicNames.indexOf(MusicName); //definir o índice da música
     count = MusicNames.size();
     PlayFile();
    }
   } else {
    player.start();
   }
  }
  if(cmd.equals("pausar")){
   BPlayer.setText("reproduzir");
   player.stop();  
   }
  if(cmd.equals("reproduzir")){
   BPlayer.setText("pausar");
   player.start();
  }
  if(e.getSource()==BStop){   //parar
    if (player != null) {
     player.stop();
     timeInformation.setText("Tempo atual:00:00  ||  Tempo total:00:00");
     timeSlider.setValue(0);
     player.setMediaTime(new Time(0)); //definir o tempo como zero
  }
    }
  if(e.getSource()==BMoveNext){  //próxima música
    if (player != null) {
     if("Reprodução em Ordem".equals(box)){
      nextMusic();
     }
     if("Reprodução Aleatória".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 clicar no anterior, pára a reprodução atual e reproduz a anterior
         try {
          player=Manager.createRealizedPlayer(MusicNames.get(index).toURI().toURL());
          player.prefetch();
          player.setMediaTime(new Time(0.0));// Iniciar a reprodução a partir de um certo período de tempo
          player.addControllerListener(this);
          l.setText("正在播放:"+this.MusicNames.get(index).toString());
          list.select(index);
          player.start(); 
          flag=1;
         } catch (NoPlayerException | CannotRealizeException | IOException e1) {
          e1.printStackTrace();
         }
       }
     }
    }
  }
  if(e.getSource()==BMovePrevious){  //música anterior
    if (player != null) {
     if("Reprodução em Ordem".equals(box)){
      PreviousMusic();
     }
     if("Reprodução Aleatória".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 clicar no anterior, pára a reprodução atual e reproduz a anterior
       try {
        player=Manager.createRealizedPlayer(MusicNames.get(index).toURI().toURL());
        player.prefetch();
        player.setMediaTime(new Time(0.0));// Iniciar a reprodução a partir de um certo período de tempo
        player.addControllerListener(this);
        l.setText("正在播放:"+this.MusicNames.get(index).toString());
        list.select(index);
        player.start(); 
        flag=1;
       } catch (NoPlayerException | CannotRealizeException | IOException e1) {
        e1.printStackTrace();
       }
      }
    }
    }
  }
  if(e.getSource()==BDelect){    //excluir música
   index = list.getSelectedIndex();
   list.remove(index);
   MusicNames.remove(this.index);
  }
  if(e.getSource()==BDelectTable){   //esvaziar a lista
   list.removeAll();
   MusicNames.removeAll(MusicNames);
   player.stop();
   player = null;
  }
  //ao clicar duas vezes na lista para reproduzir
  list.addMouseListener(new MouseAdapter() {
   public void mouseClicked(MouseEvent e) {
    // ao clicar duas vezes
    if (e.getClickCount() == 2) {
     if(player!=null){
      player.stop();
     }
     // Reproduzir o arquivo selecionado
     index=list.getSelectedIndex();
     PlayFile();
    } 
   }
  });
}
 // Devido à implementação da interface "ControllerListener", este método é usado para lidar com eventos recebidos do player de mídia;
 public void controllerUpdate(ControllerEvent e) {
  String box=(String)select.getSelectedItem();   //julgar a ordem de reprodução
  if (e instanceof EndOfMediaEvent) {
   player.setMediaTime(new Time(0));
   if ("Repetição de Música".equals(box)) {
    player.start();
   }
   if("Reprodução em Ordem".equals(box)){
    nextMusic();
   }
   if("Reprodução Aleatória".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));// Iniciar a reprodução a partir de um certo período de tempo
        player.addControllerListener(this);
        l.setText("正在播放:"+this.MusicNames.get(index).toString());
        list.select(index);
        player.start(); 
        flag=1;
       } catch (NoPlayerException | CannotRealizeException | IOException e1) {
        e1.printStackTrace();
       }
     }
   }
  }
 }
  /**
  * Obter MP3Nome da Música
  * 
  * @MP3Caminho do Arquivo
  * @Nome da Música
  */
 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;
 }
 /**
  * função de implementação da música seguinte
  */
 public void nextMusic() {
 }
 /**
  * função de implementação da música anterior
  */
 public void PreviousMusic() {
 }
 /**
  * Reproduzir MP3Função principal do arquivo
  */
 public void PlayFile() {
  try {
   player = Manager.createRealizedPlayer(MusicNames.get(index).toURI().toURL());
   player.prefetch();
   player.setMediaTime(new Time(0.0));// Iniciar a reprodução a partir de um certo período de tempo
   player.addControllerListener(this);
   l.setFont(new Font("宋体",0,20));
   l.setText("正在播放:"+this.MusicNames.get(index).toString()); //Exibir a música que está sendo tocada
   list.select(index);
   player.start();
   Mythread11 tt=new Mythread11();
   tt.start();
  } catch (Exception e1) { //Quando encontrar uma música que não pode ser reproduzida, tratá-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-metodo de rascunho gerado
 MusicNames.remove(index);
 if( --count == index )
  index = 0;
 if( count == 0)
  player = null;
 else
  PlayFile();
 }
/**
 * MP3Classe interna de filtro de arquivo
 */
class MusicFileChooser extends JFileChooser {
 }
/**
 * MP3Classe interna auxiliar de filtro de arquivo
 * 
 */
class MyFileFilter extends FileFilter { //FileFilter é uma classe abstrata, JFileChooser usa ela para filtrar o conjunto de arquivos exibidos para o usuário
 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;
 }
}
/**
 * Ler e exibir a barra de progresso de tempo
 */
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("Tempo atual: "+newtime/60+":"+newtime%60+"  ||  "+" Tempo total: "+countSecond/60+":"+countSecond%60);
    }
   }
  }
 }
}
//Implementação de thread de letras
class Mythread11 extends Thread { 
 public void run() {
  // TODO Auto-metodo de rascunho gerado
  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);  //Exibir a área de letras
 doc.setParagraphAttributes(0, doc.getLength(), center, false);
 tp.setText("Artista: "); + ls.getAr());
 tp.setText("Álbum: "); + ls.getAl());
 tp.setText("Música: "); + ls.getTi());
 tp.setText("Produção de letras: "); + ls.getBy());
 for (Lyric l : ls.getLyrics()) {
  tp.setText(l.getTxt());
  Thread.sleep(l.getTimeSize());
 }
}
}

V. Resultado do teste geral

Aqui está

Para mais informações sobre o reprodutor, clique em 'Funcionalidades do Reprodutor Java' para aprender.

Isso é tudo o que há no artigo, espero que ajude no seu aprendizado. Também espero que vocês apoiem o Tutorial Yell.

Você Também Gostaria de