一、首先先说下业务场景
我用的是SSM+easyUI,页面中需要播放录音文件,录音文件是具体业务中录音设备录的上传到服务器。
二、java中播放Mp3文件的方法
1,下载第三方jar包–Javalayer 地址:下载地址
2,导入到eclipse中lib中,添加依赖
<dependency> <groupId>zj-javalayer-3rd</groupId> <artifactId>javalayer</artifactId> <version>1.0</version> </dependency>
注意这里的groupID是我上传到Maven仓库中时定义的jar包的groupID
3,然后就是后台Controller中的播放方法啦
private Player player;
@ResponseBody
@RequestMapping(value = "/playaudio", method = RequestMethod.POST)
//这里的File是我们自己系统中文件实体类,具体作用主要还是为了获取到MP3文件的URL
File filedir = fileService.queryById(fileid);
if(filedir != null){
String path = filedir.getUrl();
try{
java.io.File file = new java.io.File(path);
FileInputStream fis = new FileInputStream(file);
BufferedInputStream buff = new BufferedInputStream(fis);
player = new Player(buff);
MusicThread mt = new MusicThread(player);
mt.start();
}catch(IOException e1){
e1.printStackTrace();
}catch(JavaLayerException e1){
e1.printStackTrace();
}
}else {
return Base.FILE_NOT_EXIST;
}
public class MusicThread extends Thread{
private Player player;
public MusicThread(Player player){
this.player=player;
}
@Override
public void run() {
try{
player.play();
}catch(JavaLayerException e){
e.printStackTrace();
}finally{
player.close();
}
}
}
//停止方法
public void stopAudio(){
player.close();
}
4,再然后就是前端js通过ajax请求调用播放
//播放
$('body').on('click', '#play', function () {
$.post(playaudioUrl,function(result){
//播放后的操作
});
});
最后,bingo!可以啦完成。
下一步就是放到测试服务器(Linux)上测试,但是不管怎么播放都是没有声音的,不管我们怎么添加日志打印,全部都是正常的,但是就是没有声音出来。心态爆炸,各种找资料。然而我们回到标题,也就是我们要解决的问题。我们这种播放的的方式是在服务端播放,也就是B/S端中的S端,而Linux在S端播放是听不到声音的,这时心里一万只XXX飘过。但是问题还是要解决的呀,既然S端播放听不到,那我们在浏览器(B端)中播放总能听到的吧。
三、将录音流文件返回到浏览器页面中,在浏览器中播放
1.首先当然是将拿到的文件生成文件流返回页面中
String path = filedir.getUrl();
java.io.File file = new java.io.File(path);
//读取指定路径下面的文件
try {
Path url = Paths.get(path);
String contentType = Files.probeContentType(url);
response.setContentType(contentType);
InputStream in = new FileInputStream(file);
OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
//创建存放文件内容的数组
byte[] buff =new byte[1024];
//所读取的内容使用n来接收
int n;
//当没有读取完时,继续读取,循环
while((n=in.read(buff))!=-1){
//将字节数组的数据全部写入到输出流中
outputStream.write(buff,0,n);
}
//强制将缓存区的数据进行输出
outputStream.flush();
//关流
outputStream.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
2,然后就是前端怎么接受录音文件流
这里我们可以用Audio标签,不光是音频文件,如果是图片文件就用img标签,道理都是一样的呀
<audio id = "audio" src = "/controller/playaudio" controls></audio>
呈现出来的页面效果是这样的:不光可以播放停止,还能下载录音文件,还能调节音量呢
最后,重新到测试服务器中测试,bingogo,这下是真的可以啦!