AudioPlayer是内部专有API,可能会在将来的版本中删除

时间:2014-12-07 14:34:40

标签: java

import javax.swing.*;
import sun.audio.*;
import java.awt.event.*;
import java.io.*;

public class Sound {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setSize(200,200);
        JButton button = new JButton("Clcik me");
        frame.add(button);
        button.addActionListener(new AL());
        frame.show(true);
    }
    public static class AL implements ActionListener{
        public final void actionPerformed(ActionEvent e){
            music();
        }
    }
    public static void music(){
        AudioPlayer MGP = AudioPlayer.player;
        AudioStream BGM;
        AudioData MD;
        ContinuousAudioDataStream loop = null;
        try{
            BGM = new AudioStream(new FileInputStream("backgroundmusic.wav"));
            MD = BGM.getData();
            loop = new ContinuousAudioDataStream(MD);
        }catch(IOException error){
            error.printStackTrace();
        }
        MGP.start(loop);
    }
}

当我运行此代码时,我会看到以下警告。为什么以及如何避免这种情况?

Sound.java:22: warning: AudioPlayer is internal proprietary API and may be removed in a future release
Sound.java:23: warning: AudioStream is internal proprietary API and may be removed in a future release
Sound.java:24: warning: AudioData is internal proprietary API and may be removedin a future release
Sound.java:25: warning: ContinuousAudioDataStream is internal proprietary API and may be removed in a future release
Sound.java:27: warning: AudioStream is internal proprietary API and may be removed in a future release
Sound.java:29: warning: ContinuousAudioDataStream is internal proprietary API and may be removed in a future release

Note: Sound.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

7 warnings

1 个答案:

答案 0 :(得分:4)

首先,您应该使用javax.sound.sampled包中的类来避免编译器警告。其次,在使用这些类时,您还需要从后台的线程中驱动它们。

这是一个前一段时间写的。现在有比在循环中睡觉更好的方法,但它适用于快速简单的wav文件,如果需要,您可以调整代码。一个聪明的实现甚至可以从同一个线程驱动几个音频文件。

播放音频文件:

import java.io.InputStream;

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;

public class SoundThread extends Thread {

    private final String resource;

    public static void play(String resource) {
        Thread t = new SoundThread(resource);
        t.setDaemon(true);
        t.start();
    }

    public SoundThread(String resource) {
        this.resource = resource;
    }

    @Override
    public void run() {
        Clip clip = null;
        try {
            InputStream in = SoundThread.class.getClassLoader().getResourceAsStream(resource);
            if(in != null) {
                AudioInputStream stream = AudioSystem.getAudioInputStream(in);
                AudioFormat format = stream.getFormat();
                DataLine.Info info = new DataLine.Info(Clip.class, format);
                clip = (Clip) AudioSystem.getLine(info);
                clip.open(stream);
                clip.loop(0);
                do  {
                    try {
                        Thread.sleep(100);
                    } catch(InterruptedException iex) {
                        // bad form on my part here, should do something
                    }
                } while(clip.isRunning());
            }
        } catch (Exception e) {
            x.printStackTrace(System.out);
        } finally {
            try {
                if(clip != null) {
                    clip.close();
                }
            } catch(Exception x) {
                x.printStackTrace(System.out);
            }
        }
    }
}

如何调用它的示例:

SoundThread.play("resources/cashregister6.wav");