为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用java播放.wav文件

如何使用java播放.wav文件

蓝山帝景 2019-07-12 10:43:16
如何使用java播放.wav文件我正在尝试使用Java播放一个*.wav文件。我希望它能做到以下几点:当按下按钮时,播放一个简短的哔声。我已经在谷歌上搜索过了,但是大部分代码都不起作用。有人能给我一个简单的代码片段来播放.wav文件吗?
查看完整描述

3 回答

?
森栏

TA贡献1810条经验 获得超5个赞

最后,我成功地完成了下面的工作,它运行得很好。

import java.io.File;import java.io.IOException;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;public class MakeSound {

    private final int BUFFER_SIZE = 128000;
    private File soundFile;
    private AudioInputStream audioStream;
    private AudioFormat audioFormat;
    private SourceDataLine sourceLine;

    /**
     * @param filename the name of the file that is going to be played
     */
    public void playSound(String filename){

        String strFilename = filename;

        try {
            soundFile = new File(strFilename);
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }

        try {
            audioStream = AudioSystem.getAudioInputStream(soundFile);
        } catch (Exception e){
            e.printStackTrace();
            System.exit(1);
        }

        audioFormat = audioStream.getFormat();

        DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
        try {
            sourceLine = (SourceDataLine) AudioSystem.getLine(info);
            sourceLine.open(audioFormat);
        } catch (LineUnavailableException e) {
            e.printStackTrace();
            System.exit(1);
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }

        sourceLine.start();

        int nBytesRead = 0;
        byte[] abData = new byte[BUFFER_SIZE];
        while (nBytesRead != -1) {
            try {
                nBytesRead = audioStream.read(abData, 0, abData.length);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (nBytesRead >= 0) {
                @SuppressWarnings("unused")
                int nBytesWritten = sourceLine.write(abData, 0, nBytesRead);
            }
        }

        sourceLine.drain();
        sourceLine.close();
    }}



查看完整回答
反对 回复 2019-07-12
?
绝地无双

TA贡献1946条经验 获得超4个赞

最短的表单(不必安装随机库)?

public static void play(String filename){
    try
    {
        Clip clip = AudioSystem.getClip();
        clip.open(AudioSystem.getAudioInputStream(new File(filename)));
        clip.start();
    }
    catch (Exception exc)
    {
        exc.printStackTrace(System.out);
    }}

唯一的问题是,在*.wav完成之后,没有一种很好的方法阻止该方法关闭和释放数据。clip.drain()说它阻塞了但它不是。剪辑没有运行就在 start()..唯一的工作但是我发现的方法是:

// ...clip.start();while (!clip.isRunning())
    Thread.sleep(10);while (clip.isRunning())
    Thread.sleep(10);clip.close();


查看完整回答
反对 回复 2019-07-12
  • 3 回答
  • 0 关注
  • 2098 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信