使用Java实现MP3音乐播放器
使⽤Java实现MP3⾳乐播放器
使⽤Java实现MP3⾳乐播放器
JavaSound是⼀个⼩巧的低层API,⽀持数字⾳频和MIDI数据的记录/回放。在JDK 1.3.0之前,JavaSound是⼀个标准的Java扩展API,但从Java 2的1.3.0版开始,JavaSound就被包含到JDK之中。由于Java有着跨平台(操作系统、硬件平台)的特点,基于JavaSound的⾳频处理程序(包括本⽂的程序)能够在任何实现了Java 1.3+的系统上运⾏,⽆需加装任何⽀持软件。
使⽤JavaSound API,可以实现各种基于声⾳的应⽤,例如声⾳录制、⾳乐播放、⽹络电话、⾳乐编辑等。JavaSound API⼜以各种解码和合成器SPI(服务提供者接⼝, Service Provider Interface)为基础,实现各种⾳乐格式的解码与转码。
在处理输⼊⾳频时,对于来⾃各种⾳频输⼊端⼝的信号,例如麦克风、CD播放器、磁带播放器等,可以在它们到达TargetDataLine之前,利⽤混频器控制输⼊混频,最后在程序中通过TargetDataLine获得数字化的⾳频输⼊流。
类似地,在处理输出⾳频时,混频器⽤来对⼀系列来⾃SourceDataLine的数据进⾏混频处理,经处理后的信号可输出到各种输出端⼝,例如扬声器、⽿机等。SourceDataLine是⼀个可写⼊⾳频信号数字流的设备,例如,我们可以从⼀个WAV⽂件读取内容写⼊
物理教研组工作计划到SourceDataLine,然后再通过扬声器输出。
其流程图如图17-7所⽰。
图17-7  ⾳频输⼊输⼊流程图
为了⽀持mp3的播放,我们必须添加mp3的SPI⽀持库。⾸先需要下载mp3的⽀持库:
●    下载⽂件:mp3spi1.9.4.zip
将mp3spi1.9.4.zip中的三个Jar⽂件jl1.0.jar 、mp3spi1.9.4.jar 、tritonus_share.jar添加到当前项⽬中即可。
下⾯我们来实现⼀个MP3⾳乐播放器,实现的功能是:单击【⽂件】à【打开】弹出⽂件选择对话框,将选择⽬录的所有mp3和wav⽂件加⼊到播放列表中,双击播放列表中的⾳乐⽂件实现⾳乐的播放和切换。
要实现该程序,⾸先需要提供了⼀个主程序窗⼝,该窗⼝提供了各种界⾯组件和操作事件的控制,并包含⼀个⾳乐播放的⼦线程,⼦线程由主线程控制。因此有两个类:
●    ⾳乐播放器主程序MusicPlayer.java
●    播放线程PlayThread.java
(1)⾳乐播放器主程序MusicPlayer.java
st.audio;
import java.io.File;
import java.awt.BorderLayout;
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.List;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.MenuShortcut;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine; public class MusicPlayer extends Frame {
boolean isStop = true;// 控制播放线程江苏昆山
boolean hasStop = true;// 播放线程状态
String filepath;// 播放⽂件⽬录
String filename;// 播放⽂件名称
AudioInputStream audioInputStream;// ⽂件流    AudioFormat audioFormat;// ⽂件格式
鱼塘的浑浊水怎样变清SourceDataLine sourceDataLine;// 输出设备
List list;// ⽂件列表
Label labelfilepath;//播放⽬录显⽰标签
Label labelfilename;//播放⽂件显⽰标签
public MusicPlayer() {
// 设置窗体属性
setLayout(new BorderLayout());
setTitle("MP3⾳乐播放器");
setSize(350, 370);
// 建⽴菜单栏
MenuBar menubar = new MenuBar();
Menu menufile = new Menu("⽂件");
MenuItem menuopen = new MenuItem("打开", new MenuShortcut(KeyEvent.VK_O));        menufile.add(menuopen);
menufile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
open();
}
});
汽车人气排行榜menubar.add(menufile);
setMenuBar(menubar);
// ⽂件列表
list = new List(10);
list.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
// 双击时处理
if (e.getClickCount() == 2) {
/
/ 播放选中的⽂件
filename = SelectedItem();
play();
}
}
});
add(list, "Center");
// 信息显⽰
Panel panel = new Panel(new GridLayout(2, 1));
labelfilepath = new Label("播放⽬录:");
labelfilename = new Label("播放⽂件:");
panel.add(labelfilepath);
panel.add(labelfilename);
add(panel, "North");
// 注册窗体关闭事件
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
}
});
setVisible(true);
}
/
/ 打开
private void open() {
FileDialog dialog = new FileDialog(this, "Open", 0);
dialog.setVisible(true);
filepath = Directory();
如何针灸if (filepath != null) {
labelfilepath.setText("播放⽬录:" + filepath);
// 显⽰⽂件列表
File filedir = new File(filepath);
File[] filelist = filedir.listFiles();
for (File file : filelist) {
String filename = Name().toLowerCase();
if (dsWith(".mp3") || dsWith(".wav")) {                    list.add(filename);
}
}
}
}
// 播放
private void play() {
try {
isStop = true;// 停⽌播放线程
/
/ 等待播放线程停⽌
System.out.print("开始播放:" + filename);
while (!hasStop) {
System.out.print(".");
try {
Thread.sleep(10);
} catch (Exception e) {
}
}
System.out.println("");
File file = new File(filepath + filename);
labelfilename.setText("播放⽂件:" + filename);
// 取得⽂件输⼊流
audioInputStream = AudioInputStream(file);
养胃水果audioFormat = Format();
// 转换mp3⽂件编码
if (Encoding() != AudioFormat.Encoding.PCM_SIGNED) {                audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,                        SampleRate(), 16, audioFormat
.getChannels(), Channels() * 2,
audioInputStream = AudioInputStream(audioFormat,                        audioInputStream);
}
// 打开输出设备
DataLine.Info dataLineInfo = new DataLine.Info(
SourceDataLine.class, audioFormat,
AudioSystem.NOT_SPECIFIED);
sourceDataLine = (SourceDataLine) Line(dataLineInfo);            sourceDataLine.open(audioFormat);
sourceDataLine.start();

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。