Java播放MP3文件在Windows下能播放,在Linux下播放不了解决

一、首先先说下业务场景
我用的是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>

呈现出来的页面效果是这样的:不光可以播放停止,还能下载录音文件,还能调节音量呢
audio标签
最后,重新到测试服务器中测试,bingogo,这下是真的可以啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值