
前幾天心血來潮,想說用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:
}
}
}