一个简单的播放器的采样声音文件。 : 音频 « 开发相关 « Java 教程

En
Java 教程
1. 语言基础
2. 数据类型
3. 操作符
4. 流程控制
5. 类定义
6. 开发相关
7. 反射
8. 正则表达式
9. 集合
10. 线
11. 文件
12. 泛型
13. 本土化
14. Swing
15. Swing事件
16. 二维图形
17. SWT
18. SWT 二维图形
19. 网络
20. 数据库
21. Hibernate
22. JPA
23. JSP
24. JSTL
25. Servlet
26. Web服务SOA
27. EJB3
28. Spring
29. PDF
30. 电子邮件
31. 基于J2ME
32. J2EE应用
33. XML
34. 设计模式
35. 日志
36. 安全
37. Apache工具
38. 蚂蚁编译
39. JUnit单元测试
Java
Java 教程 » 开发相关 » 音频 
6. 50. 11. 一个简单的播放器的采样声音文件。
/*
 *
 * Copyright (c) 1999 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Sun grants you ("Licensee") a non-exclusive, royalty free,
 * license to use, modify and redistribute this software in 
 * source and binary code form, provided that i) this copyright
 * notice and license appear on all copies of the software; and 
 * ii) Licensee does not utilize the software in a manner
 * which is disparaging to Sun.
 *
 * This software is provided "AS IS," without a warranty
 * of any kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS
 * AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE 
 * HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR 
 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
 * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT
 * WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT
 * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, 
 * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS
 * OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY
 * TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY
 * OF SUCH DAMAGES.

 This software is not designed or intended for use in on-line
 control of aircraft, air traffic, aircraft navigation or
 aircraft communications; or in the design, construction,
 operation or maintenance of any nuclear facility. Licensee 
 represents and warrants that it will not use or redistribute 
 the Software for such purposes.
 */

/*  The above copyright statement is included because this 
 * program uses several methods from the JavaSoundDemo
 * distributed by SUN. In some cases, the sound processing methods
 * unmodified or only slightly modified.
 * All other methods copyright Steve Potts, 2002
 */

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.Vector;

import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MetaEventListener;
import javax.sound.midi.MetaMessage;
import javax.sound.midi.MidiChannel;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import javax.sound.midi.Synthesizer;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;

/**
 * A simple player for sampled sound files.
 
 
 @author Steve Potts
 */
public class SimpleSoundPlayer implements Runnable, LineListener, MetaEventListener {

  final int bufSize = 16384;

  Vector sounds = new Vector();

  Thread thread;

  Sequencer sequencer;

  boolean midiEOM, audioEOM;

  Synthesizer synthesizer;

  MidiChannel channels[];

  Object currentSound;

  String currentName;

  double duration;

  int num;

  boolean bump;

  boolean paused = false;

  String errStr;

  public void open() {
    try {
      sequencer = MidiSystem.getSequencer();

      if (sequencer instanceof Synthesizer) {
        synthesizer = (Synthesizersequencer;
        channels = synthesizer.getChannels();
      }

    catch (Exception ex) {
      ex.printStackTrace();
      return;
    }
    sequencer.addMetaEventListener(this);

  }

  public void close() {
    if (sequencer != null) {
      sequencer.close();
    }
  }

  private void addSound(File file) {
    sounds.add(file);
  }

  public boolean loadSound(Object object) {
    duration = 0.0;

    currentName = ((Fileobject).getName();
    try {
      currentSound = AudioSystem.getAudioInputStream((Fileobject);
    catch (Exception e1) {
      try {
        FileInputStream is = new FileInputStream((Fileobject);
        currentSound = new BufferedInputStream(is, 1024);
      catch (Exception e3) {
        e3.printStackTrace();
        currentSound = null;
        return false;
      }
      // }
    }

    // user pressed stop or changed tabs while loading
    if (sequencer == null) {
      currentSound = null;
      return false;
    }

    if (currentSound instanceof AudioInputStream) {
      try {
        AudioInputStream stream = (AudioInputStreamcurrentSound;
        AudioFormat format = stream.getFormat();

        /**
         * we can't yet open the device for ALAW/ULAW playback, convert
         * ALAW/ULAW to PCM
         */

        if ((format.getEncoding() == AudioFormat.Encoding.ULAW)
            || (format.getEncoding() == AudioFormat.Encoding.ALAW)) {
          AudioFormat tmp = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
              format.getSampleRate(), format.getSampleSizeInBits() 2, format.getChannels(),
              format.getFrameSize() 2, format.getFrameRate()true);
          stream = AudioSystem.getAudioInputStream(tmp, stream);
          format = tmp;
        }
        DataLine.Info info = new DataLine.Info(Clip.class, stream.getFormat()((intstream
            .getFrameLength() * format.getFrameSize()));

        Clip clip = (ClipAudioSystem.getLine(info);
        clip.addLineListener(this);
        clip.open(stream);
        currentSound = clip;
        // seekSlider.setMaximum((int) stream.getFrameLength());
      catch (Exception ex) {
        ex.printStackTrace();
        currentSound = null;
        return false;
      }
    else if (currentSound instanceof Sequence || currentSound instanceof BufferedInputStream) {
      try {
        sequencer.open();
        if (currentSound instanceof Sequence) {
          sequencer.setSequence((SequencecurrentSound);
        else {
          sequencer.setSequence((BufferedInputStreamcurrentSound);
        }

      catch (InvalidMidiDataException imde) {
        System.out.println("Unsupported audio file.");
        currentSound = null;
        return false;
      catch (Exception ex) {
        ex.printStackTrace();
        currentSound = null;
        return false;
      }
    }

    duration = getDuration();

    return true;
  }

  public void playSound() {
    midiEOM = audioEOM = bump = false;
    if (currentSound instanceof Sequence || currentSound instanceof BufferedInputStream
        && thread != null) {
      sequencer.start();
      while (!midiEOM && thread != null && !bump) {
        try {
          thread.sleep(99);
        catch (Exception e) {
          break;
        }
      }
      sequencer.stop();
      sequencer.close();
    else if (currentSound instanceof Clip) {
      Clip clip = (ClipcurrentSound;
      clip.start();
      try {
        thread.sleep(99);
      catch (Exception e) {
      }
      while ((paused || clip.isActive()) && thread != null && !bump) {
        try {
          thread.sleep(99);
        catch (Exception e) {
          break;
        }
      }
      clip.stop();
      clip.close();
    }
    currentSound = null;
  }

  public double getDuration() {
    double duration = 0.0;
    if (currentSound instanceof Sequence) {
      duration = ((SequencecurrentSound).getMicrosecondLength() 1000000.0;
    else if (currentSound instanceof BufferedInputStream) {
      duration = sequencer.getMicrosecondLength() 1000000.0;
    else if (currentSound instanceof Clip) {
      Clip clip = (ClipcurrentSound;
      duration = clip.getBufferSize()
          (clip.getFormat().getFrameSize() * clip.getFormat().getFrameRate());
    }
    return duration;
  }

  public void update(LineEvent event) {
    if (event.getType() == LineEvent.Type.STOP && !paused) {
      audioEOM = true;
    }
  }

  public void meta(MetaMessage message) {
    if (message.getType() == 47) { // 47 is end of track
      midiEOM = true;
    }
  }

  private void reportStatus(String msg) {
    if ((errStr = msg!= null) {
      System.out.println(errStr);
    }
  }

  public Thread getThread() {
    return thread;
  }

  public void start() {
    thread = new Thread(this);
    thread.setName("SimpleSamplePlayer");
    thread.start();
  }

  public void stop() {
    if (thread != null) {
      thread.interrupt();
    }
    thread = null;
  }

  public void run() {
    for (; num < sounds.size() && thread != null; num++) {
      if (loadSound(sounds.get(num)) == true) {
        playSound();
      }
      // take a little break between sounds
      try {
        thread.sleep(222);
      catch (Exception e) {
        break;
      }
    }
    num = 0;

    thread = null;
    currentName = null;
    currentSound = null;
    System.out.println("Press <ctrl-c> to exit");
  }

  public void loadSounds(String name) {
    try {
      File file = new File(name);
      if (file != null && file.isDirectory()) {
        String files[] = file.list();
        for (int i = 0; i < files.length; i++) {
          File leafFile = new File(file.getAbsolutePath(), files[i]);
          addSound(leafFile);
        }
      }
    catch (Exception e) {
      System.out.println("Exception " + e);
    }
  }

  public static void main(String args[]) {
    // every file in this directory will be played
    String media = "c:/unleashed/ch18/sounds";

    final SimpleSoundPlayer ssp = new SimpleSoundPlayer();
    ssp.open();

    // we first load the sound file names in a vector
    ssp.loadSounds(media);

    // Then we start a thread to play the sounds
    ssp.start();

    // We have to wait for a while so that the process doesn't
    // terminate, killing the playing thread
    try {
      Thread.sleep(500000);
    catch (Exception e) {
      System.out.println("Interrupted");
    }

    // close and exit
    ssp.close();
    System.exit(0);
  }

}
6. 50. 音频
6. 50. 1. Determining When a Sampled Audio Player Has Finished Playing
6. 50. 2. 设置音量采样,音频播放器
6. 50. 3. 确定位置,采样音频播放器
6. 50. 4. 确定抽样音频文件的长度
6. 50. 5. 播放音频流采样
6. 50. 6. 加载和播放音频采样
6. 50. 7. 从一个JAR文件播放音频文件
6. 50. 8. 确定编码,采样音频文件
6. 50. 9. 确定文件格式的音频文件采样
6. 50. 10. 从jar文件加载图像和声音
6. 50. 11. 一个简单的播放器的采样声音文件。
6. 50. 12. This is a simple program to record sounds and play them back
6. 50. 13. 捕捉音频录音Java API
6. 50. 14. 浮点控制组件
6. 50. 15. 制作您自己的Java Media Player,播放媒体文件
www.java2java.com | Contact Us
Copyright 2010 - 2030 Java Source and Support. All rights reserved.
All other trademarks are property of their respective owners.