ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Java 播放音频

2026/8/20 21:37:07 拓冰建站 浏览量
Java 播放音频

Java 播放音频

  • 1 依赖
  • 2 接口
  • 3 实现
  • 4 测试

1 依赖

<dependency><groupId>com.googlecode.soundlibs</groupId><artifactId>mp3spi</artifactId><version>1.9.5.4</version>
</dependency><!-- 如果需要解码播放flac文件则引入这个jar包 -->
<dependency><groupId>org.jflac</groupId><artifactId>jflac-codec</artifactId><version>1.5.2</version>
</dependency>

2 接口

package com.xu.music.player.player;import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioFormat.Encoding;
import javax.sound.sampled.AudioInputStream;import java.io.File;
import java.net.URL;/*** Java 音频播放** @author hyacinth* @date 2019年10月31日19:06:39*/
public interface Player {/*** Java Music 加载音频** @param url 音频文件url* @throws Exception 异常* @date 2019年10月31日19:06:39*/void load(URL url) throws Exception;/*** Java Music 加载音频** @param file 音频文件* @throws Exception 异常* @date 2019年10月31日19:06:39*/void load(File file) throws Exception;/*** Java Music 加载音频** @param path 文件路径* @throws Exception 异常* @date 2019年10月31日19:06:39*/void load(String path) throws Exception;/*** Java Music 加载音频** @param stream 音频文件输入流* @throws Exception 异常* @date 2019年10月31日19:06:39*/void load(AudioInputStream stream) throws Exception;/*** Java Music 加载音频** @param encoding Encoding* @param stream   AudioInputStream* @throws Exception 异常* @date 2019年10月31日19:06:39*/void load(Encoding encoding, AudioInputStream stream) throws Exception;/*** Java Music 加载音频** @param format AudioFormat* @param stream AudioInputStream* @throws Exception 异常* @date 2019年10月31日19:06:39*/void load(AudioFormat format, AudioInputStream stream) throws Exception;/*** Java Music 暂停播放** @title: end* @description: Java Music 结束播放* @date 2019年10月31日19:06:39*/void pause();/*** Java Music 继续播放** @title: end* @description: Java Music 结束播放* @date 2019年10月31日19:06:39*/void resume();/*** Java Music 开始播放** @title: end* @description: Java Music 结束播放* @date 2019年10月31日19:06:39*/void play();/*** Java Music 结束播放** @throws Exception 异常* @title: end* @description: Java Music 结束播放* @date 2019年10月31日19:06:39*/void stop();}

3 实现

package com.xu.music.player.player;import cn.hutool.core.text.CharSequenceUtil;
import javazoom.spi.mpeg.sampled.file.MpegAudioFileReader;import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;import java.io.File;
import java.net.URL;/*** Java 音频播放** @author hyacinth* @date 2019年10月31日19:06:39*/
public class NPlayer implements Player {private Clip clip;private volatile long position = 0;private volatile boolean paused = false;@Overridepublic void load(URL url) throws Exception {load(AudioSystem.getAudioInputStream(url));}@Overridepublic void load(File file) throws Exception {String name = file.getName();if (CharSequenceUtil.endWithIgnoreCase(name, ".mp3")) {AudioInputStream stream = new MpegAudioFileReader().getAudioInputStream(file);AudioFormat format = stream.getFormat();format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, format.getSampleRate(), 16, format.getChannels(),format.getChannels() * 2, format.getSampleRate(), false);stream = AudioSystem.getAudioInputStream(format, stream);load(stream);} else if (CharSequenceUtil.endWithIgnoreCase(name, ".flac")) {AudioInputStream stream = AudioSystem.getAudioInputStream(file);AudioFormat format = stream.getFormat();format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, format.getSampleRate(), 16, format.getChannels(),format.getChannels() * 2, format.getSampleRate(), false);stream = AudioSystem.getAudioInputStream(format, stream);load(stream);} else {load(AudioSystem.getAudioInputStream(file));}}@Overridepublic void load(String path) throws Exception {load(new File(path));}@Overridepublic void load(AudioInputStream stream) throws Exception {DataLine.Info info = new DataLine.Info(Clip.class, stream.getFormat(), AudioSystem.NOT_SPECIFIED);clip = (Clip) AudioSystem.getLine(info);clip.addLineListener(event -> {System.out.println(event.getType() + "\t" + event.getFramePosition());});clip.open(stream);}@Overridepublic void load(AudioFormat.Encoding encoding, AudioInputStream stream) throws Exception {load(AudioSystem.getAudioInputStream(encoding, stream));}@Overridepublic void load(AudioFormat format, AudioInputStream stream) throws Exception {load(AudioSystem.getAudioInputStream(format, stream));}@Overridepublic void pause() {if (clip != null && clip.isRunning()) {paused = true;position = clip.getMicrosecondPosition();clip.stop();}}@Overridepublic void resume() {if (clip != null && paused) {paused = false;clip.setMicrosecondPosition(position);clip.start();}}@Overridepublic void play() {if (clip != null) {clip.start();clip.drain();}}@Overridepublic void stop() {if (clip != null) {clip.stop();clip.close();}}}

4 测试

package com.xu.music.player.player;import java.io.File;/*** @author Administrator*/
public class Test {public static void main(String[] args) throws Exception {Player player = new NPlayer();player.load(new File("D:\\Kugou\\梦涵 - 加减乘除.mp3"));player.play();Thread.sleep(5000);player.pause();Thread.sleep(5000);player.resume();Thread.sleep(5000);player. Stop();}}