Java使用Player播放mp3


大家平時閑了都會聽聽歌,散散心,於是很多人就問,在Java里邊如何播放歌曲呢,唉,別說,在Java里邊還真能歌曲,下面我為大家揭曉。

我們都知道Java里邊做什么都需要對應的jar包,首先貼上maven得地址:

<dependency>
   	<groupId>javazoom</groupId>
	<artifactId>jlayer</artifactId>
	<version>1.0.1</version>
</dependency>

如果不會maven的同學可以去我網盤下載:鏈接: https://pan.baidu.com/s/1IvWxTH-T4kh9aVdNPsrUyw 提取碼: 5p6g 

package test1;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;

import javazoom.jl.player.Player;

public class Mp3PlayerTest {

	//聲明一個全局的player對象
	public static Player player = null;
	
	public static void main(String[] args) {
		
		try {
			//聲明一個File對象
			File mp3 = new File("F:\\KuGou\\鳳凰傳奇 - 最炫民族風 (廣場舞).mp3");
			
			//創建一個輸入流
			FileInputStream fileInputStream = new FileInputStream(mp3);
			
			//創建一個緩沖流
			BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
			
			//創建播放器對象,把文件的緩沖流傳入進去
			player = new Player(bufferedInputStream);
			
			//調用播放方法進行播放
			player.play();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

上面這段代碼可以讓一首mp3播放完畢,那么這個時候有就有人問了,我怎么讓他停止呢,直接關閉進程嗎?肯定不是的,接下來我們來說說如何讓他播放10s后自動停止。

	public static void play10sMp3() {

		try {
			//聲明一個File對象
			File mp3 = new File("F:\\KuGou\\鳳凰傳奇 - 最炫民族風 (廣場舞).mp3");
			
			//創建一個輸入流
			FileInputStream fileInputStream = new FileInputStream(mp3);
			
			//創建一個緩沖流
			BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
			
			//創建播放器對象,把文件的緩沖流傳入進去
			player = new Player(bufferedInputStream);
			
                    //注意這里
			new Thread(()->{
				//調用播放方法進行播放
				try {
					player.play();
				} catch (JavaLayerException e) {
					e.printStackTrace();
				}
			}).start(); 
			
			Thread.sleep(1000);
			player.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

上面的代碼中我們單獨開啟了一個線程去調用它的play方法,這是為什么呢,難道在主線程里邊不能調用嗎,大家別急,聽我慢慢道來,首先我們來看下play方法的源碼:

可能有人看了這段代碼有疑惑,這個decodeFrame方法是做什么的呢。我們繼續來看:

	protected boolean decodeFrame() throws JavaLayerException
	{		
		try
		{
			AudioDevice out = audio;
			if (out==null)
				return false;

			Header h = bitstream.readFrame();	
			
			if (h==null)
				return false;
				
			// sample buffer set when decoder constructed
			SampleBuffer output = (SampleBuffer)decoder.decodeFrame(h, bitstream);
																																					
			synchronized (this)
			{
				out = audio;
				if (out!=null)
				{					
					out.write(output.getBuffer(), 0, output.getBufferLength());
				}				
			}
																			
			bitstream.closeFrame();
		}		
		catch (RuntimeException ex)
		{
			throw new JavaLayerException("Exception decoding audio frame", ex);
		}
/*
		catch (IOException ex)
		{
			System.out.println("exception decoding audio frame: "+ex);
			return false;	
		}
		catch (BitstreamException bitex)
		{
			System.out.println("exception decoding audio frame: "+bitex);
			return false;	
		}
		catch (DecoderException decex)
		{
			System.out.println("exception decoding audio frame: "+decex);
			return false;				
		}
*/		
		return true;
	}

我們可以看到,他這里是一些解碼相關的,返回一個boolean值配合while循環來控制是否播放完畢,主線程來調用play方法后到這里就阻塞住了,只能等他播放完退出while循環后才能操作,要不然你在play之后寫的所有代碼等於沒寫一樣。這里大家應該明白了吧。開一個子線程去調用play方法,子線程會阻塞,然后利用主線程在去調用close方法,10s之后去調用,他會結束掉,我們來看看close的源碼:

看到這里是不是恍然大悟了,知道了上面這些,是不是利用他的這個特性能夠做很多事了。

有問題可以在下面評論,技術問題可以私聊我。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM