zoukankan      html  css  js  c++  java
  • Java使用Player播放mp3

    大家平时闲了都会听听歌,散散心,于是很多人就问,在Java里边如何播放歌曲呢,唉,别说,在Java里边还真能歌曲,下面我为大家揭晓。

    我们都知道Java里边做什么都需要对应的jar包,首先贴上maven得地址:

    <dependency>
       	<groupId>javazoom</groupId>
    	<artifactId>jlayer</artifactId>
    	<version>1.0.1</version>
    </dependency>

    如果不会maven的同学可以去我网盘下载:链接: https://pan.baidu.com/s/1IvWxTH-T4kh9aVdNPsrUyw 提取码: 5p6g 

    package test1;
    
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    
    import javazoom.jl.player.Player;
    
    public class Mp3PlayerTest {
    
    	//声明一个全局的player对象
    	public static Player player = null;
    	
    	public static void main(String[] args) {
    		
    		try {
    			//声明一个File对象
    			File mp3 = new File("F:\KuGou\凤凰传奇 - 最炫民族风 (广场舞).mp3");
    			
    			//创建一个输入流
    			FileInputStream fileInputStream = new FileInputStream(mp3);
    			
    			//创建一个缓冲流
    			BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
    			
    			//创建播放器对象,把文件的缓冲流传入进去
    			player = new Player(bufferedInputStream);
    			
    			//调用播放方法进行播放
    			player.play();
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }
    

    上面这段代码可以让一首mp3播放完毕,那么这个时候有就有人问了,我怎么让他停止呢,直接关闭进程吗?肯定不是的,接下来我们来说说如何让他播放10s后自动停止。

    	public static void play10sMp3() {
    
    		try {
    			//声明一个File对象
    			File mp3 = new File("F:\KuGou\凤凰传奇 - 最炫民族风 (广场舞).mp3");
    			
    			//创建一个输入流
    			FileInputStream fileInputStream = new FileInputStream(mp3);
    			
    			//创建一个缓冲流
    			BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
    			
    			//创建播放器对象,把文件的缓冲流传入进去
    			player = new Player(bufferedInputStream);
    			
                        //注意这里
    			new Thread(()->{
    				//调用播放方法进行播放
    				try {
    					player.play();
    				} catch (JavaLayerException e) {
    					e.printStackTrace();
    				}
    			}).start(); 
    			
    			Thread.sleep(1000);
    			player.close();
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		
    	}

    上面的代码中我们单独开启了一个线程去调用它的play方法,这是为什么呢,难道在主线程里边不能调用吗,大家别急,听我慢慢道来,首先我们来看下play方法的源码:

    可能有人看了这段代码有疑惑,这个decodeFrame方法是做什么的呢。我们继续来看:

    	protected boolean decodeFrame() throws JavaLayerException
    	{		
    		try
    		{
    			AudioDevice out = audio;
    			if (out==null)
    				return false;
    
    			Header h = bitstream.readFrame();	
    			
    			if (h==null)
    				return false;
    				
    			// sample buffer set when decoder constructed
    			SampleBuffer output = (SampleBuffer)decoder.decodeFrame(h, bitstream);
    																																					
    			synchronized (this)
    			{
    				out = audio;
    				if (out!=null)
    				{					
    					out.write(output.getBuffer(), 0, output.getBufferLength());
    				}				
    			}
    																			
    			bitstream.closeFrame();
    		}		
    		catch (RuntimeException ex)
    		{
    			throw new JavaLayerException("Exception decoding audio frame", ex);
    		}
    /*
    		catch (IOException ex)
    		{
    			System.out.println("exception decoding audio frame: "+ex);
    			return false;	
    		}
    		catch (BitstreamException bitex)
    		{
    			System.out.println("exception decoding audio frame: "+bitex);
    			return false;	
    		}
    		catch (DecoderException decex)
    		{
    			System.out.println("exception decoding audio frame: "+decex);
    			return false;				
    		}
    */		
    		return true;
    	}

    我们可以看到,他这里是一些解码相关的,返回一个boolean值配合while循环来控制是否播放完毕,主线程来调用play方法后到这里就阻塞住了,只能等他播放完退出while循环后才能操作,要不然你在play之后写的所有代码等于没写一样。这里大家应该明白了吧。开一个子线程去调用play方法,子线程会阻塞,然后利用主线程在去调用close方法,10s之后去调用,他会结束掉,我们来看看close的源码:

    看到这里是不是恍然大悟了,知道了上面这些,是不是利用他的这个特性能够做很多事了。

    有问题可以在下面评论,技术问题可以私聊我。

  • 相关阅读:
    在前后端分离的SpringBoot项目中集成Shiro权限框架
    过账销售订单装箱单报错:用库存单位数量表示的实际剩余数量不能为零
    外部系统调用AX服务
    InventSum Closed and ClosedQty
    固定资产日志过账报错
    AX批处理相关
    AX2012打开报表报错
    有折扣的销售订单过账
    AX版本查询
    AX2012 SSRS Report 相关
  • 原文地址:https://www.cnblogs.com/c1024/p/11012009.html
Copyright © 2011-2022 走看看