【问题标题】:AudioPlayer is internal proprietary API and may be removed in a future releaseAudioPlayer 是内部专有 API,可能会在将来的版本中删除
【发布时间】:2014-12-07 14:34:40
【问题描述】:
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

【问题讨论】:

  • 你的代码是什么?为什么要使用非公共 API?
  • 您向我们展示了警告,但没有代码。

标签: java


【解决方案1】:

首先,您应该使用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");

【讨论】:

  • Log.error(getClass(), e, "无法播放资源", resource);这是什么意思?我的编译器在这一行显示错误
  • 这是对另一个类的引用。只需将其替换为 System.out.println
猜你喜欢
  • 1970-01-01
  • 2012-12-01
  • 2023-01-18
  • 1970-01-01
  • 2016-08-03
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多