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