使用javax.sound实现简单音频播放

本文实例为大家分享了javax.sound实现简单音频播放的具体代码,供大家参考,具体内容如下


/**
* @see
* @author Al_assad yulinying_1994@outlook.com
* @date 2016年11月17日 下午6:27:59
* @version V1.0
* Description: 简易音频播放器(只支持AU,RA,WAV)
*       在不使用JMF的情况下快速实现音频播放
*
*/
import javax.sound.sampled.*;
import java.io.*; 

public class MusicPlayer {
  private String musicPath; //音频文件
  private volatile boolean run = true; //记录音频是否播放
  private Thread mainThread;  //播放音频的任务线程 

  private AudioInputStream audioStream;
  private AudioFormat audioFormat;
  private SourceDataLine sourceDataLine; 

  public MusicPlayer(String musicPath) {
    this.musicPath = musicPath;
    prefetch();
  } 

  //数据准备
  private void prefetch(){
    try{
    //获取音频输入流
    audioStream = AudioSystem.getAudioInputStream(new File(musicPath));
    //获取音频的编码对象
    audioFormat = audioStream.getFormat();
    //包装音频信息
    DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class,
        audioFormat,AudioSystem.NOT_SPECIFIED);
    //使用包装音频信息后的Info类创建源数据行,充当混频器的源
    sourceDataLine = (SourceDataLine)AudioSystem.getLine(dataLineInfo); 

    sourceDataLine.open(audioFormat);
    sourceDataLine.start(); 

    }catch(UnsupportedAudioFileException ex){
      ex.printStackTrace();
    }catch(LineUnavailableException ex){
      ex.printStackTrace();
    }catch(IOException ex){
      ex.printStackTrace();
    } 

  }
  //析构函数:关闭音频读取流和数据行
  protected void finalize() throws Throwable{
    super.finalize();
    sourceDataLine.drain();
    sourceDataLine.close();
    audioStream.close();
  } 

  //播放音频:通过loop参数设置是否循环播放
  private void playMusic(boolean loop)throws InterruptedException {
    try{
        if(loop){
          while(true){
            playMusic();
          }
        }else{
          playMusic();
          //清空数据行并关闭
          sourceDataLine.drain();
          sourceDataLine.close();
          audioStream.close();
        } 

    }catch(IOException ex){
      ex.printStackTrace();
    } 

  }
  private void playMusic(){
    try{
      synchronized(this){
        run = true;
      }
      //通过数据行读取音频数据流,发送到混音器;
      //数据流传输过程:AudioInputStream -> SourceDataLine;
      audioStream = AudioSystem.getAudioInputStream(new File(musicPath));
      int count;
      byte tempBuff[] = new byte[1024]; 

        while((count = audioStream.read(tempBuff,0,tempBuff.length)) != -1){
          synchronized(this){
          while(!run)
            wait();
          }
          sourceDataLine.write(tempBuff,0,count); 

      } 

    }catch(UnsupportedAudioFileException ex){
      ex.printStackTrace();
    }catch(IOException ex){
      ex.printStackTrace();
    }catch(InterruptedException ex){
      ex.printStackTrace();
    } 

  } 

  //暂停播放音频
  private void stopMusic(){
    synchronized(this){
      run = false;
      notifyAll();
    }
  }
  //继续播放音乐
  private void continueMusic(){
    synchronized(this){
       run = true;
       notifyAll();
    }
  } 

  //外部调用控制方法:生成音频主线程;
  public void start(boolean loop){
    mainThread = new Thread(new Runnable(){
      public void run(){
        try {
          playMusic(loop);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    });
    mainThread.start();
  } 

  //外部调用控制方法:暂停音频线程
  public void stop(){
    new Thread(new Runnable(){
      public void run(){
        stopMusic(); 

      }
    }).start();
  }
  //外部调用控制方法:继续音频线程
  public void continues(){
    new Thread(new Runnable(){
      public void run(){
        continueMusic();
      }
    }).start();
  } 

//Test
  public static void main(String[] args) throws InterruptedException{ 

    MusicPlayer player = new MusicPlayer("bgm/1.wav");  //创建音乐播放器 

    player.start(true);  //以开始以循环的形式播放,player(false)为不循环播放 

    TimeUnit.SECONDS.sleep(5); 

    player.stop();  //暂停播放音频 

    TimeUnit.SECONDS.sleep(4); 

    player.continues();  //继续开始播放音频 

  } 

 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • 代码分析JAVA中PCM人声音频变声处理
  • Java使用IO流实现音频的剪切和拼接
  • 实例解析使用Java实现基本的音频播放器的编写要点
  • java音频播放示例分享(java如何播放音频)
(0)

相关推荐

  • java音频播放示例分享(java如何播放音频)

    这是一份精简后的代码,能够支持的格式十分有限. 复制代码 代码如下: package com.hongyuan.test; import java.io.File;import java.io.IOException; import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;import javax.sound

  • 实例解析使用Java实现基本的音频播放器的编写要点

    Java音频播放,因为必须依赖到本地环境,所以JAVA在音频处理方面优势不大,或者说打从Java体系开发时就没太多的考虑音频播放因素,要知道最早的Java 1.1版本中,没有后来的javax.sound包,音频只能通过Applet包调取-- 遗憾的是,在图形程序开发中,我们的程序却又难免要使用到背景音乐.效果音等配合图像操作,哎,这实在是Sun大神给我们开的一个不打不小的玩笑.万幸后来Sun大神开眼,提供了javax.sound包,才解救我们于水深火热当中~ 但是继之而来的问题是,在javax.

  • Java使用IO流实现音频的剪切和拼接

    需求: 使用IO流将指定目录下的若干个音频文件的高潮部分,进行剪切,并重新拼接成一首新的音频文件 思路(以两首歌为例): 第一首歌有一个输入流对象bis1.第二首歌有一个输入流对象bis2,他们公用一条输出流对象bos(在选择构造方法的时候选择含有布尔类型参数的那个),待第一首歌剪切完成后,在此基础上追加第二首歌的"高潮部分". 实现代码: import java.io.BufferedInputStream; import java.io.BufferedOutputStream;

  • 代码分析JAVA中PCM人声音频变声处理

    项目中需要用到对PCM人声音频数据进行变声处理.苦苦挣扎了一周终于找到了纯Java实现的一套框架--TarsosDSP.功能非常强大!可以实时音频处理!当然我只用到了对文件处理.实际上逻辑是一样的 TarsosDSP的GitHub地址:https://github.com/JorenSix/TarsosDSP 将它整合至自己的项目工程. 具体Java工具类代码: /** * 变声 * @param rawPcmInputStream 原始PCM数据输入流 * @param speedFactor

  • 使用javax.sound实现简单音频播放

    本文实例为大家分享了javax.sound实现简单音频播放的具体代码,供大家参考,具体内容如下 /** * @see * @author Al_assad yulinying_1994@outlook.com * @date 2016年11月17日 下午6:27:59 * @version V1.0 * Description: 简易音频播放器(只支持AU,RA,WAV) * 在不使用JMF的情况下快速实现音频播放 * */ import javax.sound.sampled.*; impor

  • 基于WPF实现一个简单的音频播放动画控件

    目录 1.实现代码 2.效果预览 1.实现代码 一.创建AnimationAudio.xaml代码如下 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"                    

  • iOS中的音频服务和音频AVAudioPlayer音频播放器使用指南

    AudioServicesPlaySystemSound音频服务 对于简单的.无混音音频,AVAudio ToolBox框架提供了一个简单的C语言风格的音频服务.你可以使用AudioservicesPlaySystemSound函数来播放简单的声音.要遵守以下几个规则: 1.音频长度小于30秒 2.格式只能是PCM或者IMA4 3.文件必须被存储为.caf..aif.或者.wav格式 4.简单音频不能从内存播放,而只能是磁盘文件 除了对简单音频的限制外,你对于音频播放的方式也基本无法控制.一旦音

  • Java实现的简单音乐播放器功能示例

    本文实例讲述了Java实现的简单音乐播放器功能.分享给大家供大家参考,具体如下: 应用名称:Java简单的音乐播放器 用到的知识:Java GUI编程,线程,IO 开发环境:win8+eclipse+jdk1.8 功能说明:可以选择内置的音乐文件播放,循环播放,停止.PS:这个播放器只能播放.au .aiff .wav .midi .rfm格式的音频. 效果图: 源代码: import java.applet.AudioClip; import java.awt.*; import java.n

  • Java利用读写的方式实现音频播放代码实例

    这篇文章主要介绍了Java利用读写的方式实现音频播放代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 public static void main(String[] args) { Audiotest at = new Audiotest("我在测试时,这里必须是盘符的音频文件"); at.start(); } import java.io.File; import java.io.IOException; import ja

  • 详解Howler.js Web音频播放终极解决方案

    前言 相信有很多人在写移动端音频播放的时候都踩过不少坑,特别是复杂音频项目在兼容多种设备的时候更是让你抓狂,比如ios端不能一开始就播放音频,必须要用户进行了操作.... 偶然间了解到了一个兼容所有设备和浏览器的音频引擎Howler.js 使用了一下非常完美 Howler.js 是一个新的 JavaScript 库用于处理 Web 中的音频,该库最初是为一个 HTML5 游戏引擎所开发,但也可用于其他的 Web 项目,Howler.js 基于 Google 的 Web Audio API,能够帮

  • Angular2 Service实现简单音乐播放器服务

    引言 如果说组件系统(Component)是ng2应用的躯体,那把服务(Service)认为是流通于组件之间并为其带来生机的血液再合适不过了.组件间通信的其中一种优等选择就是使用服务,在ng1里就有了广泛使用,而ng2保持了服务的全部特性,包括其全局单例与依赖注入.今天就来实践一下ng2的服务(Service)这一利器,来实现一个简单的音乐播放器,重点在于使用服务来进行音频的播放控制与全局范围的调用. 一.基本项目准备: 考虑到音频播放是个比较通用的服务,决定将其创建为一个单独的模块AudioM

  • Android开发实现的简单媒体播放器功能示例

    本文实例讲述了Android开发实现的简单媒体播放器功能.分享给大家供大家参考,具体如下: 一.概述: 因为播放视频需要很大的内存,所以必须使用surfaceview , surfaceview 里实现了双缓冲的功能, 二.全部代码: /** * @描述 使用surfaceview 创建视频 * @项目名称 App_Basic * @包名 com.example.basic.media * @类名 MediaPlayerActivity * @author chenlin * @date 201

随机推荐