大家平时闲了都会听听歌,散散心,于是很多人就问,在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. linux which-查找并显示给定命令的绝对路径

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

  2. codeforces 372 Complete the Word(双指针)

    codeforces 372 Complete the Word(双指针) 题链 题意:给出一个字符串,其中'?'代表这个字符是可变的,要求一个连续的26位长的串,其中每个字母都只出现一次 #incl ...

  3. IIS部署网站只有首页能访问,其他链接失效/运行.net+Access网站-可能原因:IIS未启用32位应用程序模式

    在64位的机子上IIS运行32位的.NET程序 由于64位操作系统不支持Microsoft OLE DB Provider for Jet驱动程 也不支持更早的Microsoft Access Dri ...

  4. C#中的定制特性(Attributes)

    C#中的定制特性(Attributes) 介绍 Attributes是一种新的描述信息,我们既可以使用attributes来定义设计期信息(例如:帮助文件.文档的URL),还可能用attributes ...

  5. 如何用Bugzilla系统管理产品研发过中相关需求和bug

    目 录 1.Bug处理流程及状态说明 2.bugs字段说明 3.查询报表的使用 4.bug系统与需求系统的整合 5.流程和用户权限 1. Bug处理流程及状态说明(1) BUG状态流程图 BUG的状态 ...

  6. H - Parity game 并查集

    Now and then you play the following game with your friend. Your friend writes down a sequence consis ...

  7. J - Invitation Cards 最短路

    In the age of television, not many people attend theater performances. Antique Comedians of Malidine ...

  8. MAPZONE GIS SDK接入Openlayers3之三——瓦片数据集接入

    瓦片数据集接入实现思路: 1.构造ol.source.TileImage数据源,构造该数据源需要以下几项: 1)空间参考,通过如下代码构造 2)TileGrid,构造需要以下几项: a)原点 b)分辨 ...

  9. Docker创建PHP镜像

    Step: 1. 创建Dockerfile FROM php:7.0-apache RUN chmod -R 755 /var/www 2. 创建镜像 docker build -t docker_n ...

  10. Redis: Useful commands

    SELECT X - Select database (the X must be int) CONFIG GET databases - Get databases number INFO keys ...