大家平时闲了都会听听歌,散散心,于是很多人就问,在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的源码:

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

有问题可以在下面评论,技术问题可以私聊我。

Java使用Player播放mp3的更多相关文章

  1. 遭遇flash播放mp3诡异问题

    在部分ie10+flash player 播放mp3,播放第二句话时,中断无法正常播放,(客户的机器上),自己公司的机器测试了几个,都没发现这个问题.其它浏览器(chrome,firefox)也没发现 ...

  2. 读取SD卡文件夹下的MP3文件和播放MP3文件

    首先获取SD卡path路径下的所有的MP3文件,并将文件名和文件大小存入List数组(此代码定义在FileUtils类中): /** * 读取目录中的Mp3文件的名字和大小 */ public Lis ...

  3. ios开发——实用技术篇Swift篇&播放MP3

    播放MP3 // MARK: - 播放MP3 /*----- mp3 ------*/ //定时器- func updateTime() { //获取音频播放器播放的进度,单位秒 var cuTime ...

  4. java swing 音乐播放器-乐乐音乐

    乐乐音乐1.0(本地版) 乐乐音乐是基于musique 开源播放器开发的java swing音乐播放器,实现了mp3.flac.ape.wav等多种音频格式的播放和ksc歌词的解析.制作和显示. 完成 ...

  5. IOS使用AVAudioPlayer播放mp3歌曲文件并监听来电打断

    本实例实现了AVAudioPlayer播放mp3歌曲文件,实现了播放.暂停.继续操作,音乐音量控制.播放进度显示,同时监听来电打断事件 一.控件初始化 - (void)viewDidLoad { [s ...

  6. 播放MP3

    播放背景音乐 上文来自:http://blog.csdn.net/henulwj/article/details/8977738 using System; using System.Collecti ...

  7. Android命令行播放MP3音乐

    /*************************************************************************** * Android命令行播放MP3音乐 * 说 ...

  8. 在C语言控制台程序中播放MP3音乐

    游戏没有声音多单调. 这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧: // 编译该范例前,请把 background.mp3 放在项目文件夹中 // ...

  9. ubuntu 13.10 Rhythmbox不能播放mp3 和中文乱码的问题

    1.ubuntu 13.10 Rhythmbox不能播放mp3的解决方法 软件中心搜索(ubuntu额外的版权受限软件)不带括号 2.中文乱码问题解决方法: 终端顺序操作 : 1.  sudo ged ...

随机推荐

  1. <MyBatis>入门七 缓存机制

    缓存机制 MyBatis包含强大的查询缓存特性,它可以非常方便的定制和配置.缓存可以极大的提升查询效率. MyBatis默认定义了两级缓存:一级缓存和二级缓存 1.默认情况下,只有一级缓存(sqlSe ...

  2. linux which-查找并显示给定命令的绝对路径

    推荐:更多Linux 文件查找和比较 命令关注:linux命令大全 which命令用于查找并显示给定命令的绝对路径,环境变量PATH中保存了查找命令时需要遍历的目录.which指令会在环境变量$PAT ...

  3. response对象处理HTTP文件头(禁用缓存、设置页面自动刷新、定时跳转网页)

    response对象处理HTTP文件头 制作人:全心全意 禁用缓存 在默认情况下,浏览器将会对显示的网页内容进行缓存.这样,当用户再次访问相关网页时,浏览器会判断网页是否有变化,如果没有变化则直接显示 ...

  4. ZJU cluster

    * loginSSH using MobaXterm: >> ssh kaiming@10.106.239.105

  5. hdu 1754 I Hate It(线段树水题)

    >>点击进入原题测试<< 思路:线段树水题,可以手敲 #include<string> #include<iostream> #include<a ...

  6. [luoguP1103] 书本整理(DP)

    传送门 以 去掉多少个 为阶段不好做. 去掉 k 个也可以变成选 n - k 个 f[i][j] 表示前 i 个数中 选 j 个的最优解,a[i] 必选 f[i][j] = min(f[i][j], ...

  7. 公众号开发 jsp中<a>问题

    在开发微信公众号时,使用了jQuery mobile这个框架,但是在jsp页面中使用<a>发现点击跳转不成功,这就很奇怪了,网上搜索发现大家基本上用js来代替<a>跳转功能: ...

  8. 工资(money)

    (money/money.in/money.out) 时限1000ms 内存256MB 聪哥在暑假参加了打零工的活动,这个活动分为n个工作日,每个工作日的工资为Vi.有m个结算工钱的时间,聪哥可以自由 ...

  9. codeforces gym 100357 I (费用流)

    题目大意 给出一个或与表达式,每个正变量和反变量最多出现一次,询问是否存在一种方案使得每个或式中有且仅有一个变量的值为1. 解题分析 将每个变量拆成三个点x,y,z. y表示对应的正变量,z表示对应的 ...

  10. 5-45 航空公司VIP客户查询 (25分) HASH

    不少航空公司都会提供优惠的会员服务,当某顾客飞行里程累积达到一定数量后,可以使用里程积分直接兑换奖励机票或奖励升舱等服务.现给定某航空公司全体会员的飞行记录,要求实现根据身份证号码快速查询会员里程积分 ...