【问题标题】:Starting and stopping music files in Java?在 Java 中启动和停止音乐文件?
【发布时间】:2015-07-20 15:40:15
【问题描述】:

这是我的声音课。

public class Sounds extends Thread { 

private String filename;
private Position curPosition;
private final int EXTERNAL_BUFFER_SIZE = 524288; 

enum Position { 
    LEFT, RIGHT, NORMAL
};

public Sounds(String wavFile) { 
    filename = wavFile;
    curPosition = Position.NORMAL;
} 

public Sounds(String wavfile, Position p) { 
    filename = wavfile;
    curPosition = p;
} 

public void run() { 

    File soundFile = new File(filename);
    if (!soundFile.exists()) { 
        System.err.println(".wav file not found: " + filename);
        return;
    } 

    AudioInputStream audioInputStream = null;
    try { 
        audioInputStream = AudioSystem.getAudioInputStream(soundFile);
    } catch (UnsupportedAudioFileException e1) { 
        e1.printStackTrace();
        return;
    } catch (IOException e1) { 
        e1.printStackTrace();
        return;
    } 

    AudioFormat format = audioInputStream.getFormat();
    SourceDataLine auline = null;
    DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);

    try { 
        auline = (SourceDataLine) AudioSystem.getLine(info);
        auline.open(format);
    } catch (LineUnavailableException e) { 
        e.printStackTrace();
        return;
    } catch (Exception e) { 
        e.printStackTrace();
        return;
    } 

    if (auline.isControlSupported(FloatControl.Type.PAN)) { 
        FloatControl pan = (FloatControl) auline
                .getControl(FloatControl.Type.PAN);
        if (curPosition == Position.RIGHT) 
            pan.setValue(1.0f);
        else if (curPosition == Position.LEFT) 
            pan.setValue(-1.0f);
    } 

    auline.start();
    int nBytesRead = 0;
    byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];

    try { 
        while (nBytesRead != -1) { 
            nBytesRead = audioInputStream.read(abData, 0, abData.length);
            if (nBytesRead >= 0) 
                auline.write(abData, 0, nBytesRead);
        } 
    } catch (IOException e) { 
        e.printStackTrace();
        return;
    } finally { 
        auline.drain();
        auline.close();
    } 
} 
}

这是我想要在用户单击按钮时停止音乐的 ActionListener。音乐在启动时播放。

btnSound.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        btnSound.setVisible(false);
        btnNoSound.setVisible(true);
        new Sounds("Sounds/MenuMusic.wav").end();
    }
});

我可以让音乐播放得很好,但我不知道如何停止它。我尝试使用 .stop() 和 .end() 但我被告知它们已被弃用。有人知道我该怎么做吗?谢谢。

【问题讨论】:

  • new Sounds("Sounds/MenuMusic.wav").end(); 因为这不是Soundsinstance 正在播放,所以它什么也做不了。代码需要引用原来的Sounds对象。

标签: java audio javasound


【解决方案1】:

您可以使用剪辑类。这是我读取 .wav 文件并播放它的代码:

try {
    File file = new File(src); // src is the location of the file
    AudioInputStream stream = AudioSystem.getAudioInputStream(file);
    Clip clip = AudioSystem.getClip();
    clip.open(stream);
    clip.start();
} catch (Exception e) {
    e.printStackTrace();
}

也就是说,clip.stop() 将停止剪辑。要重置剪辑,请使用clip.setFramePosition(0)。请注意,clip 不需要关闭,因为如果在clip.start() 之后调用clip.close(),则剪辑将不会播放。

希望这就是你要找的东西!

编辑:范围界定

使用 Java 中的作用域,如果在方法中声明局部变量,则无法在方法之外访问它。如果要在 main 方法之外访问剪辑,请将其提取到一个字段中:

class Main {
    static Clip clip;
    public static void main (String... args) {
        try {
            File file...
            clip = AudioSystem.getClip();
            ...
        } catch...
    }
}

【讨论】:

  • 我确实尝试过使用这种方法。但我就是无法让它工作。
  • 我已经设置了剪辑并且它正在工作,但我无法在我的主要方法之外访问剪辑功能。
  • "..但是我无法访问 main 方法之外的剪辑函数。" 这是一个基本的 OOP 问题,与当前问题无关。但我的建议是:解决这个问题并改用Clip
猜你喜欢
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
相关资源
最近更新 更多