1 回答

TA貢獻1777條經驗 獲得超10個贊
我認為你應該檢查你的進口。AFAIK,聲音庫都在 javax.sound.sampled 中。PortMixer 位于 com.sun.media.sound 中。
本教程的作者會遇到不必要的麻煩。您可以讓系統選擇默認值,而不是硬編碼特定的混音器。這可能是最好的策略,因為世界各地的 PC 將擁有不同的硬件配置。
以下是一個可能有用的示例。請注意,我們甚至不用費心去聲明一個 Mixer。
import java.io.IOException;
import java.net.URL;
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;
public class BasicClipExample {
public static void main(String[] args) {
BasicClipExample bc = new BasicClipExample();
try {
bc.run();
} catch (UnsupportedAudioFileException | IOException
| LineUnavailableException | InterruptedException e) {
e.printStackTrace();
}
}
private void run() throws UnsupportedAudioFileException,
IOException, LineUnavailableException, InterruptedException
{
String filename = "a3.wav";
URL url = this.getClass().getResource("audio/" + filename);
System.out.println(url);
AudioInputStream ais = AudioSystem.getAudioInputStream(url);
DataLine.Info info = new DataLine.Info(Clip.class, ais.getFormat());
Clip clip = (Clip) AudioSystem.getLine(info);
clip.open(ais);
clip.start();
Thread.sleep(6000);
clip.close();
}
}
此示例假定您的音頻文件位于名為“/audio”的子目錄中。它還有一個睡眠命令,可以在播放剪輯時保持程序運行。Clips 在它們自己的線程下運行,但該線程是“守護進程”類型,不會阻止 Java 程序關閉。我的 a3.wav 是一個持續約 5 秒的鈴聲的錄音。
最后一件事,上面的代碼沒有以理想的方式使用 Clip。Clip 的概念是用于重復使用。每次播放之前重新加載剪輯變量是低效的。剪輯變量應該只加載一次,然后按需播放。如果您將 clip.open() 和 clip.start() 作為連續的代碼行,您可能應該使用 SourceDataLine 而不是 Clip,或者您應該重新編碼并將這兩個命令放入單獨的方法中。
添加回答
舉報