音频&MP3
音频
人类能够听到的所有声音都称之为音频,包括噪音等,声音被录制下来以后,无论是说话声、歌声、乐器都可以通过数字音乐软件处理。
Mp3是一种能播放音乐文件的播放器,主要由存储器(存储卡)、显示器(LCD显示屏)、中央处理器[MCU(微控制器)或解码DSP(数字信号处理器) 等组成。
javax.sound.sampled包
javax.sound.sampled, 提供用于捕获,处理和回放采样音频数据的接口和类。
javax.sound.sampled.spi包
提供新音频设备、声音文件reader和 writer,或音频格式转换器时,提供将为其创建子类的服务提供程序的抽象类。
JLayer,MP3解码器库
JLayer是一个库,可为JAVA(tm)平台实时解码/播放/转换MPEG 1/2 / 2.5 Layer 1/2/3(即MP3),这是一个非商业项目,任何人都可以添加自己的贡献,JLayer已获得LGPL许可。
音频流(mp3spi LIB)
mp3spi用于支持音频/mpeg mime类型。
VorbisSPI:
VorbisSPI是一个用于支持OGG音频格式的Java SPI (Service Provider Interface) 基于JOrbis Java库开发的。
tritonus-share:
Maven artifact for tritonus-share library of tritonus.org,Tritonus是Java Sound API的一个实现。
jflac-codec:
FLAC文件的编码器和解码器,包括Java声音SPI。是免费无损音频编解码器(FLAC)库到Java的一个端口。
jaudiotagger,音频标签库:
支持MP3,MP4(MP4音频,M4A,M4P Ogg Vorbis音频),FLAC和WAV和WMA,但真正支持的格式有限,项目地址:http://www.jthink.net/jaudiotagger/。
提供最流行的三十个属性都完全支持格式的通用接口:1、支持读取和写入MP4,M4A和mp4p(保护)的文件,包括多个图像和反向DNS域;2、支持多页的Ogg Vorbis评论;3、支持MP3 ID3v1,id3v11,id3v2.2,V2.3和V2.4是透明的;4、允许的ID3标签版本之间轻松转换;5、支持FLAC,包括嵌入和链接图像支持;6、提供最合适的域对象的表示,而不是一个简单的字节表示;7、完全支持Unicode文本编码;8、正在积极开发和支持;9、采用自动测试保证代码的兼容性之间的版本;10、使用代码覆盖工具保证代码的实际被测试。
Java,Maven
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- apache commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<!-- jlayer -->
<dependency>
<groupId>javazoom</groupId>
<artifactId>jlayer</artifactId>
<version>1.0.1</version>
</dependency>
<!--音频流(mp3spi LIB) -->
<dependency>
<groupId>com.googlecode.soundlibs</groupId>
<artifactId>mp3spi</artifactId>
<version>1.9.5.4</version>
</dependency>
<dependency>
<groupId>com.googlecode.soundlibs</groupId>
<artifactId>tritonus-share</artifactId>
<version>0.3.7.4</version>
</dependency>
<dependency>
<groupId>com.googlecode.soundlibs</groupId>
<artifactId>vorbisspi</artifactId>
<version>1.0.3.3</version>
</dependency>
<!-- 解码播放flac文件则引入这个jar包 -->
<dependency>
<groupId>org.jflac</groupId>
<artifactId>jflac-codec</artifactId>
<version>1.5.2</version>
</dependency>
<!--audiotagger -->
<dependency>
<groupId>org</groupId>
<artifactId>jaudiotagger</artifactId>
<version>2.0.3</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</repository>
</repositories>
播放音频代码案例
案例1:
package com.what21.music01.demo01;
import javazoom.jl.player.Player;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
public class MusicPlayer {
private String filename;
private Player player;
public MusicPlayer(String filename) {
this.filename = filename;
}
public void play() {
try {
BufferedInputStream buffer = new BufferedInputStream(new FileInputStream(filename));
player = new Player(buffer);
player.play();
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] args) {
String musicFile = "D:/Data/video/2/虎年大吉.mp3";
MusicPlayer player = new MusicPlayer(musicFile);
new Thread(()->player.play()).start();
}
}
案例2:
package com.what21.music01.demo02;
import org.apache.commons.lang3.StringUtils;
/**
* @author Administrator
*/
public enum Audio {
/**
* Specifies a WAVE file.
*/
WAVE(1, "WAVE", "wav"),
/**
* Specifies an AU file.
*/
AU(2, "AU", "au"),
/**
* Specifies an AIFF file.
*/
AIFF(3, "AIFF", "aif"),
/**
* Specifies an AIFF-C file.
*/
AIFF_C(4, "AIFF-C", "aifc"),
/**
* Specifies an SND file.
*/
SND(5, "SND", "snd"),
/**
* Specifies an MP3 file.
*/
MP3(6, "MP3", "mp3"),
/**
* Specifies an FLAC file.
*/
FLAC(7, "FLAC", "flac");
private int index;
private String type;
private String suffix;
Audio(int index, String type, String suffix) {
this.index = index;
this.type = type;
this.suffix = suffix;
}
public int index() {
return index;
}
public static int getIndex(String name) {
if (StringUtils.isBlank(name)) {
throw new RuntimeException("文件名称为空!");
}
name = StringUtils.substring(name, StringUtils.lastIndexOf(name, ".") + 1);
for (Audio audio : values()) {
if (StringUtils.equalsIgnoreCase(audio.suffix, name)) {
return audio.index;
}
}
return -1;
}
public static boolean isSupport(String name) {
if (StringUtils.isBlank(name)) {
throw new RuntimeException("文件名称为空!");
}
name = StringUtils.substring(name, StringUtils.lastIndexOf(name, ".") + 1);
for (Audio audio : values()) {
if (StringUtils.equalsIgnoreCase(audio.suffix, name)) {
return true;
}
}
return false;
}
}
package com.what21.music01.demo02;
import org.apache.commons.lang3.StringUtils;
/**
* @author Administrator
*/
public enum Audio {
/**
* Specifies a WAVE file.
*/
WAVE(1, "WAVE", "wav"),
/**
* Specifies an AU file.
*/
AU(2, "AU", "au"),
/**
* Specifies an AIFF file.
*/
AIFF(3, "AIFF", "aif"),
/**
* Specifies an AIFF-C file.
*/
AIFF_C(4, "AIFF-C", "aifc"),
/**
* Specifies an SND file.
*/
SND(5, "SND", "snd"),
/**
* Specifies an MP3 file.
*/
MP3(6, "MP3", "mp3"),
/**
* Specifies an FLAC file.
*/
FLAC(7, "FLAC", "flac");
private int index;
private String type;
private String suffix;
Audio(int index, String type, String suffix) {
this.index = index;
this.type = type;
this.suffix = suffix;
}
public int index() {
return index;
}
public static int getIndex(String name) {
if (StringUtils.isBlank(name)) {
throw new RuntimeException("文件名称为空!");
}
name = StringUtils.substring(name, StringUtils.lastIndexOf(name, ".") + 1);
for (Audio audio : values()) {
if (StringUtils.equalsIgnoreCase(audio.suffix, name)) {
return audio.index;
}
}
return -1;
}
public static boolean isSupport(String name) {
if (StringUtils.isBlank(name)) {
throw new RuntimeException("文件名称为空!");
}
name = StringUtils.substring(name, StringUtils.lastIndexOf(name, ".") + 1);
for (Audio audio : values()) {
if (StringUtils.equalsIgnoreCase(audio.suffix, name)) {
return true;
}
}
return false;
}
}
案例3:
package com.what21.music01.demo03;
import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.AudioFileIO;
import java.io.File;
public class MusicPlayer {
public static void main(String[] args) throws Exception {
String musicFile = "D:/Data/video/2/虎年大吉.mp3";
int musicLength = getMusicPlayLength(musicFile);
System.out.println("音乐长度:" + musicLength); // 音乐长度:53
}
/**
* Java Music 获取歌曲播放时长
*/
public static int getMusicPlayLength(String path) throws Exception {
File file = new File(path);
AudioFile mp3 = AudioFileIO.read(file);
return mp3.getAudioHeader().getTrackLength();
}
}