2

我对 Java 完全陌生。但我想给我的女朋友一个用 Java 写的小礼物。我拥有的程序本身并且它可以工作......但我想添加的是一个音频文件,只要程序正在运行,它就会自行循环。我浏览了很多东西,尝试了很多东西,但不知何故,我似乎犯了一个错误。是的,我知道有很多代码示例。它不是小程序。

那是下面的代码......它不应该是干净的代码,我只是希望我能以某种方式让它工作。如果有人可以提供帮助,我将不胜感激。

import java.io.BufferedInputStream;
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.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Shore
 */
public class audio {

            public static void main(String[] args) throws UnsupportedAudioFileException, IOException, LineUnavailableException  {
            File f = new File("C:\\Users\\Shore\\Documents\\NetBeansProjects\\Meli13\\src\\WW.wav");

            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(f);
            BufferedInputStream bufferedInputStream = new BufferedInputStream(audioInputStream);
            AudioFormat af = audioInputStream.getFormat();
            int size = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
            byte[] audio = new byte[size];
            DataLine.Info info = new DataLine.Info(Clip.class, af, size);
            bufferedInputStream.read(audio, 0, size);
            Clip clip = (Clip) AudioSystem.getLine(info);
            clip.open(af, audio, 0, size);
            clip.start();

            }
}

非常感谢。WW.wav 在同一个文件夹中。

4

1 回答 1

1

真可爱!这像 cupid.stackoverflow.com 吗?;)

由于您完全是 Java 新手,请记住 API 文档对于理解特定类的作用非常有用。在这种情况下,您对 Clip 类感兴趣,可以在此处访问其文档。

正如文档所述,您可以设置类,使其自动循环播放。你会这样做:

        ...
        Clip clip = (Clip) AudioSystem.getLine(info);
        clip.open(af, audio, 0, size);
        clip.loop(3); //Added this line
        clip.setLoopPoints(0, -1); //Added this line
        clip.start();
        ...

clip.loop(3)告诉 Java 重复剪辑 3 次。如果要永远重复,请Clip.LOOP_CONTINUOUSLY用作参数。clip.setLoopPoints(0,-1)告诉java从它的最开始(0)到最后(由-1指定)重复它。这些是帧数,而不是绝对时间。因此,如果您想遍历文件的特定部分,则必须为此计算数学。但这是一个话题。

最后(也是最重要的),Clip开始一个新线程。这意味着如果您的应用程序在调用 后立即终止clip.start(),则Clip线程将被终止并且您不会真正听到任何声音,因为它会终止得太快。

我不确定您的应用程序是如何设置的,但在您提供的代码片段中,实际听到某些内容的唯一方法是在Clip线程运行时暂停主线程。你可以这样做:

while (clip.isRunning()) {
    Thread.sleep(1000);
}

我希望这会有所帮助,并且您可以与这位女士得分。干杯。

于 2013-04-04T13:48:33.180 回答