一、        声音文件类型
常用的声音文件类型有AU、WAV、A2FF、MIDI等
二、        播放音频
Applet类中提供了play()方法可以将声音文件的装载和播放一起完成。
void play(URL url);
void play(URL url,String name);
play()方法的调用格式和getImage()方法是完全一样的,也采用URL定位声音文件。例如某声音文件audio.au与 Applet文件存放在同一目录下,play(getCodeBase(),”audio.au”),一旦play()方法装载了声音文件,就立即播放, 如果指定的URL处找不到声音文件,不会返回出错信息,只是听不到想听的声音。
    由于play()方法只能将声音播放一遍,如果想循环播放某声音作为背景音乐,就需要使用AudioClip类,它能更有效管理声音的播放操作,它被定义在Applet包中,所以使用的时候我们可以使用import java.applet.AudioClip;
为了得到AudioClip对象,我们可以使用Applet类中的getAudioClip()方法,它能装载指定URL的声音文件,并返回一个AudioClip对象,语法为:
AudioClip getAudioClip(URL url);
AudioClip getAudioClip(URL url,String name);
得到AudioClip对象以后,就可以调用AudioClip类中所提供的各种方法来操作其中的声音数据。如果getAudioClip() 方法没有找到指定的声音文件,就返回一个null值。所以在调用AudioClip类的方法前,应该先检查得到的AudioClip对象是不是null, 如果在null对象上调用方法将导致出错。
我们还可以同时装载几个声音文件来播放,这样几个声音会混合在一起。如果我们使用AudioClip对象的loop()方法来循环播放音乐时,要在适当的时候调用AudioClip对象的stop()方法来结束播放,否则,即使用户离开WEB页面,声音也不会停止。
    //AudioAppletDemo.java
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class AudioAppletDemo extends Applet implements ActionListener
{
       AudioClip ac;
       //创建功能按钮,用于控制声音操作
       Button btnStart=new Button("开发播放");
       Button btnPause=new Button("暂停播放");
       Button btnContinue=new Button("继续播放");
       public void init()
       {
              //创建AudioClip对象
              ac=getAudioClip(getDocumentBase(),"computer.au");       
              //给功能按钮添加事件监听器
              btnStart.addActionListener(this);
              btnPause.addActionListener(this);
              btnContinue.addActionListener(this);
              //把功能按钮加入到Applet容器中,并显示
              this.add(btnStart);
              this.add(btnPause);
              this.add(btnContinue);
       }
       public void stop()
       {
              //在Applet停止时关闭音乐
              if(ac!=null)
                     ac.stop();
       }
       public void actionPerformed(ActionEvent e)
       {
              //如果AudioClip对象为空,则直接返回
              if( ac==null ){
                     System.out.println("AudioClip object is not created!");
                     return;
              }
              //获取用户激活的按钮
              Object cmd= e.getSource();
              if ( cmd == btnStart ){
                     ac.play();
                     ac.loop();
              }else if( cmd == btnPause ){
                     ac.stop();
              }else if( cmd == btnContinue ){
                     ac.play();
                     ac.loop();
              }
       }
}

三、       
JAVA Application中播放音频
由于AudioClip对象和getAudioClip()方法都是属于java.applet包的,在application中无法使用。
Sun包中的audio包也提供播放音频的方法。
实现的方法为:
import sun.audio.*;//引入sun.audio包
import java.io.*;
InputStream in=new FileInputStream(Filename);
//打开一个声音文件流作为输入
AudioStream as=new AudioStream(in);
//用输入流创建一个AudioStream对象
AudioPlayer.player.start(as);
//”player”是AudioPlayer中一个静态成员用于控制播放
AudioPlayer.player.stop(as);
当需要从网上下载文件播放时,用下列代码打开音乐文件网址:
AudioStream as=new AudioStream(url.openStream());
播放一个持续的声音流如下:
//首先如上创建声音流;
AudioData data=as.getData();
//创建AudioData源
ContinuousAudioDataStream cas=new ContinuousAudioDataStream(data);
AudioPlayer.player.play(cas);//播放
AudioPlayer.player.stop(cas);//停止
下面是一个综合的声音程序:
//AudioApplicationDemo.java
import sun.audio.*;        // 引 入sun.audio 包
import java.io.*;
import java.awt.event.*;
import java.awt.*;
public class AudioApplicationDemo extends Frame implements ActionListener
{
       AudioStream  as;
       //创建功能按钮,用于控制声音操作
       Button btnStart=new Button("开发播放");
       Button btnPause=new Button("暂停播放");
       Button btnContinue=new Button("继续播放");
       public AudioApplicationDemo()
       {
              try{
                     InputStream in = new FileInputStream ("computer.au");
                     //打开一个声音文件流作为输入
                     as = new AudioStream (in);
              }catch( Exception e){
                     e.printStackTrace();
              }           
              //给功能按钮添加事件监听器
              btnStart.addActionListener(this);
              btnPause.addActionListener(this);
              btnContinue.addActionListener(this);
              //把功能按钮加入到Applet容器中,并显示
              this.setLayout(new FlowLayout());
              this.add(btnStart);
              this.add(btnPause);
              this.add(btnContinue);
              //显示框架窗口
              this.pack();
              this.setVisible(true);
       }
       public static void main( String[] args )
       {
              AudioApplicationDemo fame=new AudioApplicationDemo();
              fame.addWindowListener(new WindowAdapter(){
                     public void windowClosing(WindowEvent e)
                     {
                            System.exit(0);
                     }
              });
       }
       //处理按钮事件
       public void actionPerformed(ActionEvent e)
       {
              //如果AudioStream对象为空,则直接返回
              if( as==null ){
                     System.out.println("AudioStream object is not created!");
                     return;
              }
              //获取用户激活的按钮
              Object cmd= e.getSource();
             
              if ( cmd == btnStart ){
                     //播放
                     AudioPlayer.player.start (as);              
              }else if( cmd == btnPause ){
                     //暂停
                     AudioPlayer.player.stop(as);
              }else if( cmd == btnContinue ){
                     //继续
                     AudioPlayer.player.start (as);
              }
       }
}

四、        JAVA Application中播放音频使用 Applet 做循環播放
/*
 * @(#)AudioPlayer.java 1.0 03/04/17
 *
 
*/
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
import java.applet.AudioClip;
//{{{ Declares!
class test {
}
//}}}
public class AudioPlayer
    
extends Frame {
  AudioClip clip 
= null;
  FileDialog dialog 
= new FileDialog(this);
  Label labelCopyright 
= new Label();
  TextField textFieldFileName 
= new TextField();
  Panel panel1 
= new Panel();
  Button buttonOpen 
= new Button();
  Button buttonPlay 
= new Button();
  Button buttonLoop 
= new Button();
  Button buttonStop 
= new Button();

  
public AudioPlayer() {
    setTitle(
"AudioPlayer");
    addWindowListener(
new WindowAdapter() {
      
public void windowClosing(WindowEvent e) {
        dispose();
        System.exit(
0);
      }
    }
    );
    
try {
      jbInit();
    }
    
catch (Exception e) {
      e.printStackTrace();
    }
    pack();
    setVisible(
true);
  }

  
private void jbInit() throws Exception {
    labelCopyright.setBackground(Color.darkGray);
    labelCopyright.setForeground(Color.orange);
    labelCopyright.setText(
        
"Copyright (c) 2003 BeanSoft Studio. All rights reserved.");
    
this.setTitle("Java Audio Player");
    textFieldFileName.setEditable(
false);
    buttonOpen.setLabel(
"打开");
    buttonOpen.addActionListener(
new java.awt.event.ActionListener() {
      
public void actionPerformed(ActionEvent e) {
        buttonOpen_actionPerformed(e);
      }
    }
    );
    buttonPlay.setLabel(
"播放");
    buttonPlay.addActionListener(
new java.awt.event.ActionListener() {
      
public void actionPerformed(ActionEvent e) {
        play();
      }
    }
    );
    buttonLoop.setLabel(
"循环");
    buttonLoop.addActionListener(
new java.awt.event.ActionListener() {
      
public void actionPerformed(ActionEvent e) {
        loop();
      }
    }
    );
    buttonStop.setLabel(
"停止");
    buttonStop.addActionListener(
new java.awt.event.ActionListener() {
      
public void actionPerformed(ActionEvent e) {
        stop();
      }
    }
    );
    
this.add(labelCopyright, BorderLayout.SOUTH);
    
this.add(textFieldFileName, BorderLayout.NORTH);
    
this.add(panel1, BorderLayout.CENTER);
    panel1.add(buttonOpen, 
null);
    panel1.add(buttonPlay, 
null);
    panel1.add(buttonLoop, 
null);
    panel1.add(buttonStop, 
null);
  }

  
public AudioClip getAudioClip() {
    
return this.clip;
  }

  
public void setAudioClip(AudioClip clip) {
    
this.clip = clip;
  }

  
public static void main(String args[]) {
    
new AudioPlayer();
  }

  
void buttonOpen_actionPerformed(ActionEvent e) {
    stop();
    dialog.show();
    
if (dialog.getFile() != null) {
      String filename 
= dialog.getDirectory() + dialog.getFile();
      
try {
        setAudioClip(Applet.newAudioClip( (
new java.io.File(filename)).toURL()));
      }
      
catch (Exception ex) {
        ex.printStackTrace();
      }

      textFieldFileName.setText(filename);
    }
    play();
  }

  
void play() {
    
if (getAudioClip() != null) {
      getAudioClip().play();
    }
  }

  
void loop() {
    
if (getAudioClip() != null) {
      getAudioClip().loop();
    }
  }

  
void stop() {
    
if (getAudioClip() != null) {
      getAudioClip().stop();
    }
  }
}


台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()