为什么我的 java 程序即使使用 .wav 文件也不能添加声音?
Why won't my java program add sound even with .wav file?
我正在制作一个程序来测试声音。为了做到这一点,我正在关注一个 link 可以在此处 https://www.youtube.com/watch?v=VMSTTg5EEnY 找到的视频。但是,当我 运行 它时,它会制作一个带有按钮的框架,但该按钮不会执行任何操作。有什么问题?
package RefrenceCode;
import sun.audio.AudioData;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
import sun.audio.ContinuousAudioDataStream;
import java.awt.event.ActionEvent;
import java.io.*;
import javax.swing.*;
import java.awt.event.ActionListener;
public class Sound {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(200,200);
JButton button = new JButton("Click 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 BGP = AudioPlayer.player;
AudioStream BGM;
AudioData MD;
ContinuousAudioDataStream loop = null;
try {
//InputStream test = new FileInputStream("C:\ wiiMusic.wav");
//BGM = new AudioStream(test);
BGM = new AudioStream(new FileInputStream("wiiMusic.wav"));
MD = BGM.getData();
loop = new ContinuousAudioDataStream(MD);
}catch(IOException error) {}
BGP.start(loop);
}
}
过时的教程似乎是一个日益严重的问题!
我将 OP 评论解释为询问以下问题:如何寻址和加载本地音频文件,即与 java 程序打包在一起,而不是远程访问。
Andrew Thompson 在评论中提供的 link 很有用,但它没有解决独立音频文件的示例。我不知道如何编辑它以包含示例。无论出于何种原因,Oracle Sound Trail 教程同样存在缺陷。
首先,用于创建 AudioInputStream
的 URL 形式通常是最好的:
AudioInputStream ais = AudioSystem.getAudioInputStream(url);
为什么?因为它具有定位打包在 jar 中的资源的附加功能,而文件系统则不能。
我认为访问独立音频资源的最常用做法是使用 ClassLoader 来获得 Class,您确定它会成为您项目的一部分。然后将音频资源的地址作为此 class.
地址的相对地址给出
例如,假设您的项目中有 class "MySound"。如果音频文件在同一个文件夹或包中,相对寻址方案将如下所示:
URL beepURL = MySound.class.getResource("beep.wav");
如果音频文件在MySound所在目录的子文件夹或子包中,例如“/audio”,则命令如下:
URL beepURL = MySound.class.getResource("audio/beep.wav");
指定相对地址的基本 HTML 规则应该有效。这包括用于寻址父文件夹或包的符号,例如“..”。
例如,如果您有一个名为 res/audio 的包,它与包含 MySound
的包相邻
URL beepURL = MySound.class.getResource("../res/audio/beep.wav");
上面例子的文件结构:
src/com.mydomainname.myproject/utils/MySound
src/com.mydomainname.myproject/res/audio/beep.wav
如果 url 地址以“/”开头,如“/beep.wav”,则适用不同的规则。文档将此称为 "absolute" 形式。我没有在自己的编码中使用它,所以我不会冒险以错误的方式解释它。
对于JavaSound Info Page example,我们可以按如下方式编辑这些行:
URL url = LoopSound.class.getResource("leftright.wav");
Clip clip = AudioSystem.getClip();
AudioInputStream ais = AudioSystem.getAudioInputStream( url );
clip.open(ais);
这假设 leftright.wav 与 LoopSound 位于同一个包中。
我正在制作一个程序来测试声音。为了做到这一点,我正在关注一个 link 可以在此处 https://www.youtube.com/watch?v=VMSTTg5EEnY 找到的视频。但是,当我 运行 它时,它会制作一个带有按钮的框架,但该按钮不会执行任何操作。有什么问题?
package RefrenceCode;
import sun.audio.AudioData;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
import sun.audio.ContinuousAudioDataStream;
import java.awt.event.ActionEvent;
import java.io.*;
import javax.swing.*;
import java.awt.event.ActionListener;
public class Sound {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(200,200);
JButton button = new JButton("Click 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 BGP = AudioPlayer.player;
AudioStream BGM;
AudioData MD;
ContinuousAudioDataStream loop = null;
try {
//InputStream test = new FileInputStream("C:\ wiiMusic.wav");
//BGM = new AudioStream(test);
BGM = new AudioStream(new FileInputStream("wiiMusic.wav"));
MD = BGM.getData();
loop = new ContinuousAudioDataStream(MD);
}catch(IOException error) {}
BGP.start(loop);
}
}
过时的教程似乎是一个日益严重的问题!
我将 OP 评论解释为询问以下问题:如何寻址和加载本地音频文件,即与 java 程序打包在一起,而不是远程访问。
Andrew Thompson 在评论中提供的 link 很有用,但它没有解决独立音频文件的示例。我不知道如何编辑它以包含示例。无论出于何种原因,Oracle Sound Trail 教程同样存在缺陷。
首先,用于创建 AudioInputStream
的 URL 形式通常是最好的:
AudioInputStream ais = AudioSystem.getAudioInputStream(url);
为什么?因为它具有定位打包在 jar 中的资源的附加功能,而文件系统则不能。
我认为访问独立音频资源的最常用做法是使用 ClassLoader 来获得 Class,您确定它会成为您项目的一部分。然后将音频资源的地址作为此 class.
地址的相对地址给出例如,假设您的项目中有 class "MySound"。如果音频文件在同一个文件夹或包中,相对寻址方案将如下所示:
URL beepURL = MySound.class.getResource("beep.wav");
如果音频文件在MySound所在目录的子文件夹或子包中,例如“/audio”,则命令如下:
URL beepURL = MySound.class.getResource("audio/beep.wav");
指定相对地址的基本 HTML 规则应该有效。这包括用于寻址父文件夹或包的符号,例如“..”。
例如,如果您有一个名为 res/audio 的包,它与包含 MySound
的包相邻URL beepURL = MySound.class.getResource("../res/audio/beep.wav");
上面例子的文件结构:
src/com.mydomainname.myproject/utils/MySound
src/com.mydomainname.myproject/res/audio/beep.wav
如果 url 地址以“/”开头,如“/beep.wav”,则适用不同的规则。文档将此称为 "absolute" 形式。我没有在自己的编码中使用它,所以我不会冒险以错误的方式解释它。
对于JavaSound Info Page example,我们可以按如下方式编辑这些行:
URL url = LoopSound.class.getResource("leftright.wav");
Clip clip = AudioSystem.getClip();
AudioInputStream ais = AudioSystem.getAudioInputStream( url );
clip.open(ais);
这假设 leftright.wav 与 LoopSound 位于同一个包中。