前幾天心血來潮,想說用java寫個音樂撥放器於是就做了這個,在處理撥放動作是用DataSourceLine,把AudioInputStream的資料讀進來並寫到DataSourceLine,然後再利用他相關方法來控制播放,但他可以使用的方法太少,最後就改用Clip物件來做!

程式碼:

import java.awt.BorderLayout;
import java.awt.FileDialog;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import javax.swing.*;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

class MODE{final static int PLAY=0,PAUSE=1,STOP=2,REPLAY=3,OPEN=4;}
public class MediaPlayer implements ActionListener{
    JFrame f;
    JButton btnPlay, btnPause, btnStop, btnReplay, btnOpen;
    JSlider sldTime;
    JPanel p;
    FileDialog flg;
    AudioInputStream audioInputStream;
    AudioFormat audioFormat;
    Clip clip;
    File file;
    final String strCmd[]={"btnPlay","btnPause","btnStop","btnReplay","btnOpen"};
    String filePath=""; 
    Thread myThread;
    public static void main(String [] arg)
    {
        new MediaPlayer();
    }
    public  void AudioLoad()
    {
        filePath = flg.getDirectory()+flg.getFile();
        f.setTitle(filePath);
        if (clip != null)
            clip.close();
        clip = null;
        audioInputStream = null;
        file = null;
        audioFormat = null;
        file = new File(filePath);
        try {
            audioInputStream = AudioSystem.getAudioInputStream(file);
        } catch (UnsupportedAudioFileException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        audioFormat = audioInputStream.getFormat();
        DataLine.Info info = new DataLine.Info(Clip.class, audioFormat);
        try {
            clip  = (Clip) AudioSystem.getLine(info);
            clip.open(audioInputStream);
        } catch (LineUnavailableException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        } catch (IOException e2) {
            // TODO Auto-generated catch block
            e2.printStackTrace();
        }
    }
    
    public MediaPlayer()
    {
        f = new JFrame("MyFrame");
        p =  new JPanel(new FlowLayout());
        f.setLayout(new BorderLayout());
        btnPlay = new JButton();
        btnPause = new JButton();
        btnStop = new JButton();
        btnReplay = new JButton();
        btnOpen = new JButton();
        sldTime = new JSlider(0,100,0);
        
        btnPlay.setIcon(new ImageIcon("./image/play.png"));
        btnPause.setIcon(new ImageIcon("./image/pause.png"));
        btnStop.setIcon(new ImageIcon("./image/stop.png"));
        btnReplay.setIcon(new ImageIcon("./image/replay.png"));
        btnOpen.setIcon(new ImageIcon("./image/open.png"));
        
        btnPlay.setActionCommand("btnPlay");
        btnPause.setActionCommand("btnPause");
        btnStop.setActionCommand("btnStop");
        btnReplay.setActionCommand("btnReplay");
        btnOpen.setActionCommand("btnOpen");
        btnPlay.addActionListener(this);
        btnPause.addActionListener(this);
        btnReplay.addActionListener(this);
        btnStop.addActionListener(this);
        btnOpen.addActionListener(this);
        flg = new FileDialog(f, "開啟媒體檔", FileDialog.LOAD);
        p.add(btnPlay);
        p.add(btnPause);
        p.add(btnStop);
        p.add(btnReplay);
        p.add(btnOpen);
        f.add(p, BorderLayout.SOUTH);
        f.add(sldTime, BorderLayout.NORTH);
        f.pack();
        f.setVisible(true);
        
    }



    @SuppressWarnings("deprecation")
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        String cmd = e.getActionCommand();
        int id = -1;
        for (int i = 0; i <strCmd.length; i++)
            if(strCmd[i] == cmd) id=i;
        switch (id) {
            case MODE.PLAY:
                clip.start();
                new Timer(1, new ActionListener(){

                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        // TODO Auto-generated method stub
                        sldTime.setMaximum((int) audioInputStream.getFrameLength());
                        sldTime.setValue(clip.getFramePosition());
                    }}).start();
                break;
            case MODE.PAUSE:
                clip.stop();
                break;
            case MODE.STOP:
                AudioLoad();
                break;
            case MODE.REPLAY:
                AudioLoad();
                clip.start();
                break;
            case MODE.OPEN:
                flg.show();
                if(!flg.getFile().equals("null"))
                    AudioLoad();
                
                break;
            default:
        }
            
        
    }
}

執行結果:

文章標籤
全站熱搜
創作者介紹
創作者 jeff810123 的頭像
jeff810123

在我心中有一個夢

jeff810123 發表在 痞客邦 留言(0) 人氣(113)