zoukankan      html  css  js  c++  java
  • java 播放声音

    方法一:

    public interface AudioClip

    AudioClip 接口是用于播放音频剪辑的简单抽象。多个 AudioClip 项能够同时播放,得到的声音混合在一起可产生合成声音。

    方法摘要
     void loop() 
              以循环方式开始播放此音频剪辑。
     void play() 
              开始播放此音频剪辑。
     void stop() 
              停止播放此音频剪辑。

    注意play:开始播放此音频剪辑。每次调用此方法时,剪辑都从头开始重新播放

     

    类 Applet

    applet 是一种不能单独运行但可嵌入在其他应用程序中的小程序。

    Applet 类必须是任何嵌入 Web 页或可用 Java Applet Viewer 查看的 applet 的超类。Applet 类提供了 applet 及其运行环境之间的标准接口。

    public AudioClip getAudioClip(URL url,
                                  String name)
    返回 URL 和 name 参数指定的 AudioClip 对象。

    不管音频剪辑存在与否,此方法总是立即返回。当此 applet 试图播放音频剪辑时,数据将被加载。

    参数:
    url - 给定音频剪辑基本位置的绝对 URL。
    name - 相对于 url 参数的音频剪辑位置。
    返回:
    指定 URL 处的音频剪辑。
    import java.applet.Applet;
    import java.applet.AudioClip;
    import java.net.URL;
    
    
    public class Audio {
        public void play(String filename)
        {
            try{
                URL url=new URL("file:///C:\\"+filename);
                AudioClip ac=Applet.newAudioClip(url);
                System.out.println("play");
                ac.play();
            }catch(Exception e){
             System.out.println(e);
             
                
            }
            
        }
        public static void main(String[] args)
        {
            Audio audio=new Audio();
            audio.play("lengku.mid");
            
        }
    
    }

    注意上面的newAudioClip 不能改为newAudioClip,getAudioClip()方法仅仅能被applet内调用。随着JAVA2的引入,应用程序也能用Applet类的newAudioClip方法装入声音文件。前一例子可以改写如下以用于Java应用程序:

    Applet类中getDocumentBase()和getCodeBase()的区别     
    Applet类中提供了这2种方法帮我门获取URL对象,其中getDocumentBase()方法返回URL对象,代表了包含Applet的HTML文件所在目录,而getCodeBase()方法返回的URL对象代表了applet文件即.class文件所在目录。它根据HTML文件的"Applet"标记中的CODEBASE属性值计算出来,若该属性没有设置则返回该HTML文件所在目录

    The getCodebase() method is also commonly used to establish a path to other files or folders that are in the same location as the class being run.

    URL getCodeBase() 
             Gets the base URL. 
    URL getDocumentBase() 
             Gets the URL of the document in which the applet is embedded.    

    getDocumentBase()
    Returns an absolute URL naming the directory of the document in which the applet is embedded. For example, suppose an applet is contained within the document:
    http://java.sun.com/products/jdk/1.2/index.html

    The document base is: 
    http://java.sun.com/products/jdk/1.2/

    getCodeBase()
    Gets the base URL. This is the URL of the applet itself.

    据测试,支持au,mid格式, 不支持wav,mp3等高级格式。

    最开始运行出现了错误:java.net.MalformedURLException: unknown protocol: d

    要在文件目录前加 file:/// 

    import   java.applet.*; 

    public   class   sounda   extends   Applet 

      
      public   static   void   main   (String[]   args) 
      { 
    AudioClip   ac   =   getAudioClip(getCodeBase(),   "sloop.au "); 
        ac.play(); 
      //   ac.loop();     
      //             ac.stop(); 
        
      } 

    上面例子只是很简单的说明,AudioClip是java中播放类。java中提供 了两个很有用的方法getCodeBase(),getDocumentBase()他们分别返回 Applet本身和包含此Applet主页的URL地址.上面的sloop.au即我机器上 
    的声音文件。我们在此直接使用了AudioClip的play方法来播放声音。 大家可测试用Applet的图像功能加入按钮。 

     

    方法二:AudioStream

    导入包的时候 

    import sun.audio.AudioPlayer;

      import sun.audio.AudioStream;

      上面这两句都报“Access restriction: The type AudioPlayer is not accessible due to restriction on required library C:\JDK1.5\jre\lib\rt.jar”的错误,解决办法::在preference->java->complier->errors/warning->deprecated and restricted API把 Forbidden reference 的Error改成warning 即可,参考http://www.cnblogs.com/Cratical/archive/2011/05/11/2043756.html 原因。

    MusicPaly myMusicPlay = new MusicPlay(getClass().getResource("/music/button.wav")); 
    myMusicPlay.start();//播放一次 
    myMusicPlay .stop();//停止 
    myMusicPlay .continuousStart();//循环播放 
    myMusicPlay .continuousStop();//停止

    // 文件名:MuiscPlay.java 
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    import sun.audio.AudioData;
    import sun.audio.AudioPlayer;
    import sun.audio.AudioStream;
    import sun.audio.ContinuousAudioDataStream;
    
    
    public class MusicPlay { 
        private AudioStream  as; //单次播放声音用 
        ContinuousAudioDataStream cas;//循环播放声音 
        // 构造函数 
        public MusicPlay(URL url) 
        { 
            try { 
                //打开一个声音文件流作为输入 
                as = new AudioStream (url.openStream()); 
            } catch (FileNotFoundException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } catch (IOException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } 
        } 
        // 一次播放 开始 
        public void start() 
        { 
            if( as==null ){ 
                System.out.println("AudioStream object is not created!"); 
                return; 
            }else{ 
                AudioPlayer.player.start (as); 
            } 
        } 
        // 一次播放 停止 
        public void stop() 
        { 
            if( as==null ){ 
                System.out.println("AudioStream object is not created!"); 
                return; 
            }else{ 
                AudioPlayer.player.stop(as); 
            }        
        } 
        // 循环播放 开始 
        public void continuousStart() 
        { 
            // Create AudioData source. 
            AudioData data = null; 
            try { 
                data = as.getData(); 
            } catch (IOException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } 
    
            // Create ContinuousAudioDataStream. 
            cas = new ContinuousAudioDataStream (data); 
    
            // Play audio. 
            AudioPlayer.player.start(cas); 
        } 
        // 循环播放 停止 
        public void continuousStop() 
        { 
            if(cas != null) 
            { 
                AudioPlayer.player.stop (cas); 
            }    
        } 
        
        public static void main(String[] args)
        {
            URL url = null;
            try {
                url = new URL("file:///C:\\zhangxueyou.wav");
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            MusicPlay musicPlay=new MusicPlay(url);
            musicPlay.start();
             try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            musicPlay.start();
        
                 
            
        }
    
    }
    public void play(String Filename) 
      { 
      try{ 
      // 用输入流打开一音频文件 
      FileInputStream in = new FileInputStream(Filename);//FIlename 是你加载的声音文件如(“game.wav”) 
      // 从输入流中创建一个AudioStream对象 
      AudioStream as = new AudioStream(in); 
      AudioPlayer.player.start(as);//用静态成员player.start播放音乐 
      //AudioPlayer.player.stop(as);//关闭音乐播放 
      //如果要实现循环播放,则用下面的三句取代上面的“AudioPlayer.player.start(as);”这句 
      /*AudioData data = as.getData(); 
      ContinuousAudioDataStream gg= new ContinuousAudioDataStream (data); 
      AudioPlayer.player.start(gg);// Play audio. 
      */ 
      //如果要用一个 URL 做为声音流的源(source),则用下面的代码所示替换输入流来创建声音流: 
      /*AudioStream as = new AudioStream (url.openStream()); 
      */ 
      } catch(FileNotFoundException e){ 
      System.out.print("FileNotFoundException "); 
      } catch(IOException e){ 
      System.out.print("有错误!"); 
      } 
      }

    实现方法:

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    import sun.audio.AudioPlayer;
    import sun.audio.AudioStream;
    
    public   class   Sound   
    { 
      public void   play()
      { 
     
          System.out.println("play");
        FileInputStream fileau=null;
        try {
            fileau = new   FileInputStream( "C:\\zhangxueyou.wav" );
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        AudioStream as = null;
        try {
            as = new   AudioStream(fileau);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        
        AudioPlayer.player.start(as); 
    
      } 
    
      public static void main(String[] args)
      {
        Sound sound=new Sound();
        sound.play();
      
        } 
    }
  • 相关阅读:
    侯策《前端开发核心知识进阶》读书笔记——JS基础
    侯策《前端开发核心知识进阶》读书笔记——API实现
    侯策《前端开发核心知识进阶》读书笔记——Javascript中的Closure
    侯策《前端开发核心知识进阶》读书笔记——Javascript中的this
    xss攻击和csrf攻击的定义及区别
    浏览器缓存类型
    函数截流和防抖
    阮一峰《ECMAScript 6 入门》读书笔记—— Generator 函数
    阮一峰《ECMAScript 6 入门》读书笔记—— Iterator
    阮一峰《ECMAScript 6 入门》读书笔记——Promise
  • 原文地址:https://www.cnblogs.com/youxin/p/2462485.html
Copyright © 2011-2022 走看看