项目 | Value |
---|
音频格式 添加依赖 | |
*.wav | (JDK 原生支持) |
*.pcm | (JDK 原生支持) |
*.au | (JDK 原生支持) |
*.aiff | (JDK 原生支持) |
*.mp3 | mp3spi.jar |
*.flac | jflac-codec.jar |
1 依赖
<dependency><groupId>com.googlecode.soundlibs</groupId><artifactId>mp3spi</artifactId><version>1.9.5.4</version>
</dependency>
<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;
public interface Player {void load(URL url) throws Exception;void load(File file) throws Exception;void load(String path) throws Exception;void load(AudioInputStream stream) throws Exception;void load(Encoding encoding, AudioInputStream stream) throws Exception;void load(AudioFormat format, AudioInputStream stream) throws Exception;void pause();void resume();void play() throws Exception;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;
public class NPlayer implements Player {private Clip clip;private volatile long position = 0;private volatile boolean paused = false;private NPlayer() {}public static NPlayer createPlayer() {return NPlayer.SingletonHolder.player;}private static class SingletonHolder {private static final NPlayer player = new NPlayer();}@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;
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();}}