❶ 哪个格式的音乐音质最好
PCM,是
音频
文件里,级别最高的,是所有数字音频(模拟的不包括在内)的始祖,保真度最高,体积十分庞大,常见的格式有pcm和cda,多用来录制唱片如cd文件。CD不是一种格式,它是一种标准,详细请见SONY(索尼)公布的官方红皮书,CD是利用特殊的方式,直接刻录音轨保存在CD-ROM盘片(专用的CD盘,当然也可以是普通的CD-ROM盘,这是后来修改的)上的,无法作为一种格式来保存。
所以,应当说,PCM的格式是音质最好最高,但是它的体积极其巨大,所以一般使用WAV作为原始文件来保存音频文件,质量也是相当高,损失几乎相当的少,但体积也比较大,这是微软开发并图鉴的一种格式,适合Windows操作系统,在现在最新的MAC系统上也可以使用。扩展名:.wav
在MAC系统上专用的原始音频格式,是AIFF,扩展名为Aiff,这是由苹果公司独立开发的,在Mac上十分常见。也就是说在Mac上这是最好的格式(PCM除外)。
在Unix和java平台下(多指SUN的平台),相应的格式是AU,扩展名就是au。它是目前在Unix和java下的标准音频格式。
❷ 学习用java文件转换需要什么知识
非专业人士凑个热闹,答错勿喷。
这些知识属于多媒体,音频编码解码相关。
首先你要熟悉两种音频的编码格式,silk是skype的一种编码,wav使用的就是pcm编码。
至于想要用纯java实现,不是很推荐,编码解码都是很考虑效率的,纯java写的话,效率很可能不如C语写的。
学习资料的话,建议去github找找开源资料,比如我刚才搜到的silk-v3-decoder,代码是C的,如果你真的能读懂的话,自己用java实现起来是没问题的。
编程靠的是积累,积累到一定程度的时候,编程语言只是载体,具体实现用什么语言都已经显得无所谓了。
❸ 哪位专家能帮我用JAVA做一个音乐播放器,谢谢!
网上就有java的音乐播放器
Java播放器代码
package com.test.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 = list.getSelectedItem();
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) {
System.exit(0);
}
});
setVisible(true);
}
//打开
private void open() {
FileDialog dialog = new FileDialog(this, "Open", 0);
dialog.setVisible(true);
filepath = dialog.getDirectory();
if (filepath != null) {
labelfilepath.setText("播放目录:" + filepath);
//显示文件列表
list.removeAll();
File filedir = new File(filepath);
File[] filelist = filedir.listFiles();
for (File file : filelist) {
String filename = file.getName().toLowerCase();
if (filename.endsWith(".mp3") || filename.endsWith(".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 = AudioSystem.getAudioInputStream(file);
audioFormat = audioInputStream.getFormat();
//转换MP3文件编码
if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
audioFormat.getSampleRate(), 16, audioFormat
.getChannels(), audioFormat.getChannels() * 2,
audioFormat.getSampleRate(), false);
audioInputStream = AudioSystem.getAudioInputStream(audioFormat,
audioInputStream);
}
//打开输出设备
DataLine.Info dataLineInfo = new DataLine.Info(
SourceDataLine.class, audioFormat,
AudioSystem.NOT_SPECIFIED);
sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
sourceDataLine.open(audioFormat);
sourceDataLine.start();
//创建独立线程进行播放
isStop = false;
Thread playThread = new Thread(new PlayThread());
playThread.start();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
new MusicPlayer();
}
class PlayThread extends Thread {
byte tempBuffer[] = new byte[320];
public void run() {
try {
int cnt;
hasStop = false;
//读取数据到缓存数据
while ((cnt = audioInputStream.read(tempBuffer, 0,
tempBuffer.length)) != -1) {
if (isStop)
break;
if (cnt > 0) {
//写入缓存数据
sourceDataLine.write(tempBuffer, 0, cnt);
}
}
//Block等待临时数据被输出为空
sourceDataLine.drain();
sourceDataLine.close();
hasStop = true;
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
}
}
❹ java实现 mp3格式转换wav
/*
*实现录音机的功能
*/
packagecom.liuyun.MyRecord1;
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
importjava.io.*;
importjavax.sound.sampled.*;
importjava.lang.*;
{
//定义录音格式
AudioFormataf=null;
//定义目标数据行,可以从中读取音频数据,该TargetDataLine接口提供从目标数据行的缓冲区读取所捕获数据的方法。
TargetDataLinetd=null;
//定义源数据行,源数据行是可以写入数据的数据行。它充当其混频器的源。应用程序将音频字节写入源数据行,这样可处理字节缓冲并将它们传递给混频器。
SourceDataLinesd=null;
//定义字节数组输入输出流
ByteArrayInputStreams=null;
ByteArrayOutputStreambaos=null;
//定义音频输入流
AudioInputStreamais=null;
//定义停止录音的标志,来控制录音线程的运行
Booleanstopflag=false;
//记录开始录音的时间
longstartPlay;
//定义所需要的组件
JPaneljp1,jp2,jp3;
JLabeljl1=null;
JButtoncaptureBtn,stopBtn,playBtn,saveBtn;
publicstaticvoidmain(String[]args){
//创造一个实例
MyRecordmr=newMyRecord();
}
//构造函数
publicMyRecord()
{
//组件初始化
jp1=newJPanel();
jp2=newJPanel();
jp3=newJPanel();
//定义字体
FontmyFont=newFont("华文新魏",Font.BOLD,30);
jl1=newJLabel("录音机功能的实现");
jl1.setFont(myFont);
jp1.add(jl1);
captureBtn=newJButton("开始录音");
//对开始录音按钮进行注册监听
captureBtn.addActionListener(this);
captureBtn.setActionCommand("captureBtn");
//对停止录音进行注册监听
stopBtn=newJButton("停止录音");
stopBtn.addActionListener(this);
stopBtn.setActionCommand("stopBtn");
//对播放录音进行注册监听
playBtn=newJButton("播放录音");
playBtn.addActionListener(this);
playBtn.setActionCommand("playBtn");
//对保存录音进行注册监听
saveBtn=newJButton("保存录音");
saveBtn.addActionListener(this);
saveBtn.setActionCommand("saveBtn");
this.add(jp1,BorderLayout.NORTH);
this.add(jp2,BorderLayout.CENTER);
this.add(jp3,BorderLayout.SOUTH);
jp3.setLayout(null);
jp3.setLayout(newGridLayout(1,4,10,10));
jp3.add(captureBtn);
jp3.add(stopBtn);
jp3.add(playBtn);
jp3.add(saveBtn);
//设置按钮的属性
captureBtn.setEnabled(true);
stopBtn.setEnabled(false);
playBtn.setEnabled(false);
saveBtn.setEnabled(false);
//设置窗口的属性
this.setSize(400,300);
this.setTitle("录音机");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
publicvoidactionPerformed(ActionEvente){
if(e.getActionCommand().equals("captureBtn"))
{
//点击开始录音按钮后的动作
//停止按钮可以启动
captureBtn.setEnabled(false);
stopBtn.setEnabled(true);
playBtn.setEnabled(false);
saveBtn.setEnabled(false);
//调用录音的方法
capture();
//记录开始录音的时间
startPlay=System.currentTimeMillis();
}elseif(e.getActionCommand().equals("stopBtn")){
//点击停止录音按钮的动作
captureBtn.setEnabled(true);
stopBtn.setEnabled(false);
playBtn.setEnabled(true);
saveBtn.setEnabled(true);
//调用停止录音的方法
stop();
//记录停止录音的时间
longstopPlay=System.currentTimeMillis();
//输出录音的时间
System.out.println("Playcontinues"+(stopPlay-startPlay));
}elseif(e.getActionCommand().equals("playBtn"))
{
//调用播放录音的方法
play();
}elseif(e.getActionCommand().equals("saveBtn"))
{
//调用保存录音的方法
save();
}
}
//开始录音
publicvoidcapture()
{
try{
//af为AudioFormat也就是音频格式
af=getAudioFormat();
DataLine.Infoinfo=newDataLine.Info(TargetDataLine.class,af);
td=(TargetDataLine)(AudioSystem.getLine(info));
//打开具有指定格式的行,这样可使行获得所有所需的系统资源并变得可操作。
td.open(af);
//允许某一数据行执行数据I/O
td.start();
//创建播放录音的线程
Recordrecord=newRecord();
Threadt1=newThread(record);
t1.start();
}catch(LineUnavailableExceptionex){
ex.printStackTrace();
return;
}
}
//停止录音
publicvoidstop()
{
stopflag=true;
}
//播放录音
publicvoidplay()
{
//将baos中的数据转换为字节数据
byteaudioData[]=baos.toByteArray();
//转换为输入流
s=newByteArrayInputStream(audioData);
af=getAudioFormat();
ais=newAudioInputStream(s,af,audioData.length/af.getFrameSize());
try{
DataLine.InfodataLineInfo=newDataLine.Info(SourceDataLine.class,af);
sd=(SourceDataLine)AudioSystem.getLine(dataLineInfo);
sd.open(af);
sd.start();
//创建播放进程
Playpy=newPlay();
Threadt2=newThread(py);
t2.start();
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
//关闭流
if(ais!=null)
{
ais.close();
}
if(s!=null)
{
s.close();
}
if(baos!=null)
{
baos.close();
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
//保存录音
publicvoidsave()
{
//取得录音输入流
af=getAudioFormat();
byteaudioData[]=baos.toByteArray();
s=newByteArrayInputStream(audioData);
ais=newAudioInputStream(s,af,audioData.length/af.getFrameSize());
//定义最终保存的文件名
Filefile=null;
//写入文件
try{
//以当前的时间命名录音的名字
//将录音的文件存放到F盘下语音文件夹下
FilefilePath=newFile("F:/语音文件");
if(!filePath.exists())
{//如果文件不存在,则创建该目录
filePath.mkdir();
}
longtime=System.currentTimeMillis();
file=newFile(filePath+"/"+time+".wav");
AudioSystem.write(ais,AudioFileFormat.Type.WAVE,file);
//将录音产生的wav文件转换为容量较小的mp3格式
//定义产生后文件名
StringtarFileName=time+".mp3";
Runtimerun=null;
try{
run=Runtime.getRuntime();
longstart=System.currentTimeMillis();
//调用解码器来将wav文件转换为mp3文件
<strong><spanstyle="color:#ff0000;">Processp=run.exec(filePath+"/"+"lame-b16"+filePath+"/"+file.getName()+""+filePath+"/"+tarFileName);//16为码率,可自行修改
</span></strong>//释放进程
p.getOutputStream().close();
p.getInputStream().close();
p.getErrorStream().close();
p.waitFor();
longend=System.currentTimeMillis();
System.out.println("convertneedcosts:"+(end-start)+"ms");
//删除无用的wav文件
if(file.exists())
{
file.delete();
}
}catch(Exceptione){
e.printStackTrace();
}finally{
//最后都要执行的语句
//run调用lame解码器最后释放内存
run.freeMemory();
}
}catch(Exceptione){
e.printStackTrace();
}finally{
//关闭流
try{
if(s!=null)
{
s.close();
}
if(ais!=null)
{
ais.close();
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
//设置AudioFormat的参数
()
{
//下面注释部分是另外一种音频格式,两者都可以
AudioFormat.Encodingencoding=AudioFormat.Encoding.
PCM_SIGNED;
floatrate=8000f;
intsampleSize=16;
StringsignedString="signed";
booleanbigEndian=true;
intchannels=1;
returnnewAudioFormat(encoding,rate,sampleSize,channels,
(sampleSize/8)*channels,rate,bigEndian);
////采样率是每秒播放和录制的样本数
//floatsampleRate=16000.0F;
////采样率8000,11025,16000,22050,44100
////sampleSizeInBits表示每个具有此格式的声音样本中的位数
//intsampleSizeInBits=16;
////8,16
//intchannels=1;
////单声道为1,立体声为2
//booleansigned=true;
////true,false
//booleanbigEndian=true;
////true,false
//returnnewAudioFormat(sampleRate,sampleSizeInBits,channels,signed,bigEndian);
}
//录音类,因为要用到MyRecord类中的变量,所以将其做成内部类
classRecordimplementsRunnable
{
//定义存放录音的字节数组,作为缓冲区
bytebts[]=newbyte[10000];
//将字节数组包装到流里,最终存入到baos中
//重写run函数
publicvoidrun(){
baos=newByteArrayOutputStream();
try{
stopflag=false;
while(stopflag!=true)
{
//当停止录音没按下时,该线程一直执行
//从数据行的输入缓冲区读取音频数据。
//要读取bts.length长度的字节,cnt是实际读取的字节数
intcnt=td.read(bts,0,bts.length);
if(cnt>0)
{
baos.write(bts,0,cnt);
}
}
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
//关闭打开的字节数组流
if(baos!=null)
{
baos.close();
}
}catch(IOExceptione){
e.printStackTrace();
}finally{
td.drain();
td.close();
}
}
}
}
//播放类,同样也做成内部类
classPlayimplementsRunnable
{
//播放baos中的数据即可
publicvoidrun(){
bytebts[]=newbyte[10000];
try{
intcnt;
//读取数据到缓存数据
while((cnt=ais.read(bts,0,bts.length))!=-1)
{
if(cnt>0)
{
//写入缓存数据
//将音频数据写入到混频器
sd.write(bts,0,cnt);
}
}
}catch(Exceptione){
e.printStackTrace();
}finally{
sd.drain();
sd.close();
}
}
}
}
❺ java写的音乐播放器,只能播放wav文件或者mp3文件,怎么把程序整合在一起,使播放器既能放wav,也能放mp3
既然是java,那么就可以下载天天动听啊!大部分的音乐格式都能放。
❻ 所有音乐格式中,哪种格式音质最好求解答
PCM,是音频文件里,级别最高的,是所有数字音频(模拟的不包括在内)的始祖,保真度最高,体积十分庞大,常见的格式有pcm和cda,多用来录制唱片如cd文件。CD不是一种格式,它是一种标准,详细请见SONY(索尼)公布的官方红皮书,CD是利用特殊的方式,直接刻录音轨保存在CD-ROM盘片(专用的CD盘,当然也可以是普通的CD-ROM盘,这是后来修改的)上的,无法作为一种格式来保存。
所以,应当说,PCM的格式是音质最好最高,但是它的体积极其巨大,所以一般使用WAV作为原始文件来保存音频文件,质量也是相当高,损失几乎相当的少,但体积也比较大,这是微软开发并图鉴的一种格式,适合Windows操作系统,在现在最新的MAC系统上也可以使用。扩展名:.wav
在MAC系统上专用的原始音频格式,是AIFF,扩展名为Aiff,这是由苹果公司独立开发的,在Mac上十分常见。也就是说在Mac上这是最好的格式(PCM除外)。
在Unix和Java平台下(多指SUN的平台),相应的格式是AU,扩展名就是au。它是目前在Unix和java下的标准音频格式。
以上格式均为原始文件格式,一般都是体积巨大,为了便于在计算机上流传,人们开发了压缩格式,压缩分为有损压缩和无损压缩,显然有损压缩的压缩率更大,但它需要解决的问题就是如何解决音质的问题。一般通常的做法,就是牺牲人耳辨别率比较若以及人耳无法收听的部分,但是人的耳朵区别很大,所以很难照顾到所有的人。在唱见的格式中,比较不错的格式有flac(无损,扩展名flac)、Monkey's Audio(无损,扩展名ape)、DTS(多声道,主要用与DVD,扩展名dtc/wav)、AC3(杜比推出,环绕多声道,现场感逼真,扩展名ac3)、AAC(收费,音质好,扩展名Aac或mp4)、WMV(这也是种视频格式,wma和asf的升级版,质量相当高,扩展名wmv),另外还有MusePack(扩展名mpc,完全免费)以及MP3Pro(扩展名mp3)也相当不错,这些格式音质都相当高,甚至对于对声音颇有要求的用户来说表现也不差。
❼ android 播放器怎么播放wav格式文件
WAV格式的细节在互联网上都可以找到,你仅仅需要在Google上搜索下。但是,遗憾的是,我并没有搜索到一个很好的Java库来读取WAV文件,而且可以移植到Android下。因此,我自己写了一些简单的代码。
下面这个方法就是如何读取一个WAV文件的头部:
private static final String RIFF_HEADER = "RIFF";
private static final String WAVE_HEADER = "WAVE";
private static final String FMT_HEADER = "fmt ";
private static final String DATA_HEADER = "data";
private static final int HEADER_SIZE = 44;
private static final String CHARSET = "ASCII";
/* */
public static WavInfo readHeader(InputStream wavStream) throws IOException,
DecoderException {
ByteBuffer buffer = ByteBuffer.allocate(HEADER_SIZE);
buffer.order(ByteOrder.LITTLE_ENDIAN);
wavStream.read(buffer.array(), buffer.arrayOffset(), buffer.capacity());
buffer.rewind();
buffer.position(buffer.position() + 20);
int format = buffer.getShort();
checkFormat(format == 1, "Unsupported encoding: " + format); // 1 means
// Linear
// PCM
int channels = buffer.getShort();
checkFormat(channels == 1 || channels == 2, "Unsupported channels: "
+ channels);
int rate = buffer.getInt();
checkFormat(rate <= 48000 rate >= 11025, "Unsupported rate: " + rate);
buffer.position(buffer.position() + 6);
int bits = buffer.getShort();
checkFormat(bits == 16, "Unsupported bits: " + bits);
int dataSize = 0;
while (buffer.getInt() != 0x) { // "data" marker
Log.d(TAG, "Skipping non-data chunk");
int size = buffer.getInt();
wavStream.skip(size);
buffer.rewind();
wavStream.read(buffer.array(), buffer.arrayOffset(), 8);
buffer.rewind();
}
dataSize = buffer.getInt();
checkFormat(dataSize > 0, "wrong datasize: " + dataSize);
return new WavInfo(new FormatSpec(rate, channels == 2), dataSize);
}
上面的代码中,缺少的部分应该是显而易见的。正如你所看到的,仅仅支持16位,但在你可以修改代码以支持8位(AudioTrack不支持任何其他分辨率的)。
下面这个方法,则是用来读取文件剩余的部分 – 音频数据。
public static byte[] readWavPcm(WavInfo info, InputStream stream)
throws IOException {
byte[] data = new byte[info.getDataSize()];
stream.read(data, 0, data.length);
return data;
}
我们读取的WavInfo结构体,包含采样率,分辨率和声道数已经足够让我们去播放我们读取的音频了。
如果我们不需要将全部音频数据一次性放入内存中,我们可以使用一个InputStream,一点一点地读取。
转载
❽ 如何使得java swing里加入的背景音乐 可用按钮控制播放与停止
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的支持库:
● 官方网站:http://www.javazoom.NET/
● 下载页面:http://www.javazoom.net/mp3spi/sources.html
● 下载地址:http://www.javazoom.Net/mp3spi/sources/mp3spi1.9.4.zip
● 下载文件: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
package com.test.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 = list.getSelectedItem();
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) {
System.exit(0);
}
});
setVisible(true);
}
// 打开
private void open() {
FileDialog dialog = new FileDialog(this, "Open", 0);
dialog.setVisible(true);
filepath = dialog.getDirectory();
if (filepath != null) {
labelfilepath.setText("播放目录:" + filepath);
// 显示文件列表
list.removeAll();
File filedir = new File(filepath);
File[] filelist = filedir.listFiles();
for (File file : filelist) {
String filename = file.getName().toLowerCase();
if (filename.endsWith(".mp3") || filename.endsWith(".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 = AudioSystem.getAudioInputStream(file);
audioFormat = audioInputStream.getFormat();
// 转换mp3文件编码
if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
audioFormat.getSampleRate(), 16, audioFormat
.getChannels(), audioFormat.getChannels() * 2,
audioFormat.getSampleRate(), false);
audioInputStream = AudioSystem.getAudioInputStream(audioFormat,
audioInputStream);
}
// 打开输出设备
DataLine.Info dataLineInfo = new DataLine.Info(
SourceDataLine.class, audioFormat,
AudioSystem.NOT_SPECIFIED);
sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
sourceDataLine.open(audioFormat);
sourceDataLine.start();
// 创建独立线程进行播放
isStop = false;
Thread playThread = new Thread(new PlayThread());
playThread.start();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
new MusicPlayer();
}
}
在该主程序中添加一个入口主函数main()来启动该主程序即可。
(2)播放线程PlayThread.java
该程序的代码如下:
class PlayThread extends Thread {
byte tempBuffer[] = new byte[320];
public void run() {
try {
int cnt;
hasStop = false;
// 读取数据到缓存数据
while ((cnt = audioInputStream.read(tempBuffer, 0,
tempBuffer.length)) != -1) {
if (isStop)
break;
if (cnt > 0) {
// 写入缓存数据
sourceDataLine.write(tempBuffer, 0, cnt);
}
}
// Block等待临时数据被输出为空
sourceDataLine.drain();
sourceDataLine.close();
hasStop = true;
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
}
(3)运行MP3音乐播放器
完成以上代码后,即可运行主程序MusicPlayer,就会显示如图17-9示的窗口:
图17-9 音乐播放器主窗口
单击【文件】à【打开】,就会弹出如图17-10所示的打开窗口:
图17-10 选择文件
选中某一个音乐文件后,单击【打开】按钮,就会将该目录下的所有mp3和wav音乐文件添加到播放器的播放列表中,如图17-11所示。
图17-11 播放列表
双击该播放列表中的音乐文件,就会开始播放音乐了。在音乐播放的过程中,你还可以随时双击某一个文件来停止当前的音乐播放,并开始播放新的音乐文件。
❾ java大神求解啊,如何用java编写一个音乐播放器,然后播放器里面的歌可以顺序播放的。
参考代码如下
首先下载播放mp3的包,比如mp3spi1.9.4.jar。在工程中添加这个包。
播放器演示代码如下
package com.test.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 {
/**
*
*/
private static final long serialVersionUID = -2605658046194599045L;
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 Music Player");
setSize(350, 370);
// 建立菜单栏
MenuBar menubar = new MenuBar();
Menu menufile = new Menu("File");
MenuItem menuopen = new MenuItem("Open", 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 = list.getSelectedItem();
play();
}
}
});
add(list, "Center");
// 信息显示
Panel panel = new Panel(new GridLayout(2, 1));
labelfilepath = new Label("Dir:");
labelfilename = new Label("File:");
panel.add(labelfilepath);
panel.add(labelfilename);
add(panel, "North");
// 注册窗体关闭事件
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setVisible(true);
}
// 打开
private void open() {
FileDialog dialog = new FileDialog(this, "Open", 0);
dialog.setVisible(true);
filepath = dialog.getDirectory();
if (filepath != null) {
labelfilepath.setText("Dir:" + filepath);
// 显示文件列表
list.removeAll();
File filedir = new File(filepath);
File[] filelist = filedir.listFiles();
for (File file : filelist) {
String filename = file.getName().toLowerCase();
if (filename.endsWith(".mp3") || filename.endsWith(".wav")) {
list.add(filename);
}
}
}
}
// 播放
private void play() {
try {
isStop = true;// 停止播放线程
// 等待播放线程停止
System.out.print("Start:" + filename);
while (!hasStop) {
System.out.print(".");
try {
Thread.sleep(10);
} catch (Exception e) {
}
}
System.out.println("");
File file = new File(filepath + filename);
labelfilename.setText("Playing:" + filename);
// 取得文件输入流
audioInputStream = AudioSystem.getAudioInputStream(file);
audioFormat = audioInputStream.getFormat();
// 转换mp3文件编码
if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
audioFormat.getSampleRate(), 16, audioFormat
.getChannels(), audioFormat.getChannels() * 2,
audioFormat.getSampleRate(), false);
audioInputStream = AudioSystem.getAudioInputStream(audioFormat,
audioInputStream);
}
// 打开输出设备
DataLine.Info dataLineInfo = new DataLine.Info(
SourceDataLine.class, audioFormat,
AudioSystem.NOT_SPECIFIED);
sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
sourceDataLine.open(audioFormat);
sourceDataLine.start();
// 创建独立线程进行播放
isStop = false;
Thread playThread = new Thread(new PlayThread());
playThread.start();
} catch (Exception e) {
e.printStackTrace();
}
}
class PlayThread extends Thread {
byte tempBuffer[] = new byte[320];
public void run() {
try {
int cnt;
hasStop = false;
// 读取数据到缓存数据
while ((cnt = audioInputStream.read(tempBuffer, 0,
tempBuffer.length)) != -1) {
if (isStop)
break;
if (cnt > 0) {
// 写入缓存数据
sourceDataLine.write(tempBuffer, 0, cnt);
}
}
// Block等待临时数据被输出为空
sourceDataLine.drain();
sourceDataLine.close();
hasStop = true;
} catch (Exception e) {
e.printStackTrace();
System.exit(0);
}
}
}
public static void main(String args[]) {
new MusicPlayer();
}
}