当前位置: 首页 > 知识库问答 >
问题:

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

陆文康
2023-03-14
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个答案

空鸿云
2023-03-14

首先,您应该使用 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");
 类似资料:
  • 我试图解决这个问题,但我从来没有找到一个对我有效的解决办法。问题是我得到了关于Base64Encoder的警告。没有Base64Encoder还有其他方法可以做到这一点吗? 代码:

  • 当我使用JDK 1.7.0在OS X上编译Spring JDBC源代码时,我收到了以下警告: 如何在编译期间抑制警告消息? 我已经知道并使用Java的@SuppressWarning注释。我正在寻找它的具体用途来抑制我所描述的警告。 我的问题是,在这一行代码中: “ValueGoesher”应该用什么来代替? 编辑:各位,我知道最好避免导致警告的代码。通常这是我的方法。然而,我在这里编译第三方代码

  • 你有什么想法吗? 让我们说它不是关键的,只是一个警告,但我担心它可能来自于一些错误,这些错误不是直接表现出来的,而是以某种方式引起的,让我们称之为,这种附带效应…

  • 问题内容: 当我使用JDK 1.7.0在OS X上编译Spring JDBC源代码时,收到以下警告: 如何在编译期间禁止显示警告消息? 我已经知道并使用Java的@SuppressWarning注释。我正在寻找特定的用法来抑制我所描述的警告。 我的问题特别是在以下代码行中: 应该用“ valuegoeshere”替换什么? 编辑:人们,我知道最好避免导致警告的代码。通常这就是我的方法。但是,我在这

  • 当我尝试用Ant构建我的项目时,我得到了以下警告。我的build.xml ist是从Eclipse自动生成的: 在Eclipse中,该行没有错误,如果删除该行(是hibernate的注释),错误将出现在另一行中。错误似乎出现在java文件的第一行。 编辑: 第二行生成警告。但是,如果删除该行,下一行将生成相同的警告。如果删除所有注释,最后一行将生成警告。