Java使⽤Player播放mp3
⼤家平时闲了都会听听歌,散散⼼,于是很多⼈就问,在Java⾥边如何播放歌曲呢,唉,别说,在Java⾥边还真能歌曲,下⾯我为⼤家揭晓。
我们都知道Java⾥边做什么都需要对应的jar包,⾸先贴上maven得地址:
<dependency>
<groupId>javazoom</groupId>
<artifactId>jlayer</artifactId>
<version>1.0.1</version>
</dependency>
如果不会maven的同学可以去我⽹盘下载:链接: pan.baidu/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 = adFrame();
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.Buffer(), 0, BufferLength());
}
}
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的源码:
看到这⾥是不是恍然⼤悟了,知道了上⾯这些,是不是利⽤他的这个特性能够做很多事了。
有问题可以在下⾯评论,技术问题可以私聊我。