java - 为什么我的 java 程序即使使用 .wav 文件也不会添加声音?

标签 java audio javasound

我正在制作一个程序只是为了测试声音。为了做到这一点,我正在关注一个视频,可以在此处找到链接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 在评论中提供的链接很有用,但它没有解决独立音频文件的示例。我不知道如何编辑它以包含示例。无论出于何种原因,Oracle Sound Trail 教程也同样存在缺陷。

首先,用于创建 AudioInputStream 的 URL 形式通常是最好的:

AudioInputStream ais = AudioSystem.getAudioInputStream(url);
为什么?因为它具有定位打包在 jar 中的资源的附加功能,而文件系统则不能。

我认为访问独立音频资源的最常见做法是利用 ClassLoader对于您确定将成为您的项目一部分的类(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”),则适用不同的规则。该文档将此称为“绝对”形式。我没有在自己的编码中使用过它,所以我不会冒险以错误的方式解释它。

对于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 位于同一包中。

关于java - 为什么我的 java 程序即使使用 .wav 文件也不会添加声音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50710703/

相关文章:

java - 我想制作一个 recyclerview,将数据显示到 SQLITE 数据库中的新 Activity

android - 在线播放多首音频

java - 任意一次播放单个音频文件

java - 如何将PCM流拆分为每个 channel 的AudioInputStreams?

java - 只能第一次从 TargetDataLine 记录

java - 在 system.out.println 的代码中找到位置

java - 如何让 Spring 管理 bean 生命周期而不是 jersey

java - 取消选择 JTree

android - Android-通过不同频率的麦克风播放声音

c# - 将 wav 文件转换为 8000Hz 16 位单声道 Wav