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 ( ) ; 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 ; @Override public void load ( URL url) throws Exception { load ( AudioSystem . getAudioInputStream ( url) ) ; } @Override public 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) ) ; } } @Override public void load ( String path) throws Exception { load ( new File ( path) ) ; } @Override public 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) ; } @Override public void load ( AudioFormat. Encoding encoding, AudioInputStream stream) throws Exception { load ( AudioSystem . getAudioInputStream ( encoding, stream) ) ; } @Override public void load ( AudioFormat format, AudioInputStream stream) throws Exception { load ( AudioSystem . getAudioInputStream ( format, stream) ) ; } @Override public void pause ( ) { if ( clip != null && clip. isRunning ( ) ) { paused = true ; position = clip. getMicrosecondPosition ( ) ; clip. stop ( ) ; } } @Override public void resume ( ) { if ( clip != null && paused) { paused = false ; clip. setMicrosecondPosition ( position) ; clip. start ( ) ; } } @Override public void play ( ) { if ( clip != null ) { clip. start ( ) ; clip. drain ( ) ; } } @Override public 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( ) ; } }