❶ 哪個格式的音樂音質最好
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();
}
}