JavaLayer是一个开源Java多么媒体组件,使用它可以解析和播放MPEG(mp3)格式音频文件,其官方地址为:JavaLayer
(1) 为了以后方便使用,本次实现和AndroidMeidiaAPI相似的接口
package com.xyes.music.media;
import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
/**
* Created by 郭文梁 on 2017/10/31.
* 播放器实现
*/
public class MediaImpl implements Media {
private InputStream stream; //MP3数据流
private String fileName;//文件名
private String url;//访问URL 支持网络文件播放
private boolean remotePlay = false;//标识是否为网络播放
private Player player;//JavaLayer播放器
private boolean isPlaying = false;//当前是否在播放
@Override
public void loadSource(String fileName) {
this.fileName = fileName;
}
@Override
public void loadSourceFromUrl(String url) {
remotePlay = true;
this.url = url;
}
@Override
public void play() throws JavaLayerException {
if (remotePlay) {
stream = loadUrlStream(url);
} else {
stream = loadFileStream(fileName);
}
if (null == stream) {
throw new NullPointerException("创建输入流失败");
}
if (null != player) {
player.close();
}
player = new Player(stream);
post(() -> {
try {
player.play();
} catch (JavaLayerException e) {
e.printStackTrace();
}
});
isPlaying = true;
}
private InputStream loadFileStream(String fileName) {
try {
return new FileInputStream(fileName);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
private InputStream loadUrlStream(String url) {
try {
URL lUrl = new URL(url);
return lUrl.openStream();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
public int getCurrentPosition() {
return null == player ? 0 : player.getPosition();
}
@Override
public void setCurrentPosition(int pos) throws JavaLayerException {
player.play(pos);
}
@Override
public int getDuration() {
return 0;
}
@Override
public boolean isLooping() {
return false;
}
@Override
public void setLooping() {
}
@Override
public void reset() {
player.close();
isPlaying = false;
}
@Override
public void playOrPause() {
if (isPlaying) {
reset();
} else {
try {
play();
} catch (JavaLayerException e) {
e.printStackTrace();
}
}
}
private void post(Runnable task) {
new Thread(task).start();
}
}