Java中更高级的音频控件
我需要比Java中更高级的音频控件,java,audio,Java,Audio,我需要比java.applet.AudioClip提供的对播放声音的更多控制。所有这些都提供了播放、循环播放和停止音频剪辑的功能。我想知道如何控制它在哪个扬声器上播放,声音的音量是多少,播放声音的哪个部分,等等。是否有人有任何经验或建议想要分享 编辑: 我已经实现了javax.sound。以下是我的代码的简化版本: public class Clazz extends JFrame { public java.net.URL alertSoundURL = getClass().getRe
java.applet.AudioClip
提供的对播放声音的更多控制。所有这些都提供了播放、循环播放和停止音频剪辑的功能。我想知道如何控制它在哪个扬声器上播放,声音的音量是多少,播放声音的哪个部分,等等。是否有人有任何经验或建议想要分享
编辑:
我已经实现了
javax.sound
。以下是我的代码的简化版本:
public class Clazz extends JFrame
{
public java.net.URL alertSoundURL = getClass().getResource("/resources/beep.wav");
javax.sound.sampled.Clip timeUp;
public Clazz()
{
try
{
javax.sound.sampled.AudioInputStream audioIn = javax.sound.sampled.AudioSystem.getAudioInputStream(alertSoundURL);
timeUp = javax.sound.sampled.AudioSystem.getClip();
timeUp.open(audioIn);
timeUp.setLoopPoints(0, 10000);
timeUp.start();
timeUp.stop();
}
catch (Throwable t)
{
//Tell user sound may not work
}
}
private void setOffAlarm()
{
alarmDialog.setSize(alarmDialog.getPreferredSize());
FrameAction.center(alarmDialog);
alarmDialog.setVisible(true);
timeUp.loop(timeUp.LOOP_CONTINUOUSLY);
newDay = false;
}
}
我的问题是timeUp.loop(timeUp.loop\u连续);只玩一次。有人能解决这个问题吗?您需要使用JavaSound API(javax.sound.*包中的类)。谷歌会给你一些关于如何使用它们的教程。我必须支持jarnbjo的答案,但是文档不是很好。我发现多次播放同一声音的方法如下: 首先将其读入名为“data”的字节缓冲区:
byte[]数据;
InputStream in=ClassLoader.getSystemResourceAsStream(文件名)//在小程序中
AudioInputStream ais=AudioSystem.getAudioInputStream(in);
数据=新字节[(int)ais.getFrameLength()*format.getFrameSize()];
字节[]buf=新字节[BUFSIZE];
for(int i=0;i=data.length){
r=数据长度-i;
}
系统阵列副本(buf,0,数据,i,r);
}
ais.close();
然后播放名为“data”(数据)的缓冲区中的声音(任意次数):
line.start();
对于(inti=0;我尝试过,但是Clip.loop(intcount);命令不起作用;它只循环一次。
byte[] data;
InputStream in = ClassLoader.getSystemResourceAsStream(filename); //in an applet
AudioInputStream ais = AudioSystem.getAudioInputStream(in);
data = new byte[(int)ais.getFrameLength() * format.getFrameSize()];
byte[] buf = new byte[BUFSIZE];
for (int i=0; i<data.length; i+=BUFSIZE) {
int r = ais.read(buf, 0, BUFSIZE);
if (i+r >= data.length) {
r = data.length - i;
}
System.arraycopy(buf, 0, data, i, r);
}
ais.close();
line.start();
for (int i=0; i<data.length; i+=BUFSIZE) {
line.write(data, i, BUFSIZE);
}
line.drain();
line.stop();