我们正在尝试将声音集成到我们的一个项目中,我的团队成员没有收到此错误,而是在两台不同的机器上收到了此错误。
堆栈跟踪:
Exception in thread "SoundPlayer" java.lang.IllegalArgumentException: No line matching interface Clip supporting format PCM_SIGNED 16000.0 Hz, 16 bit, stereo, 4 bytes/frame, little-endian, and buffers of 11129272 to 11129272 bytes is supported.
at javax.sound.sampled.AudioSystem.getLine(Unknown Source)
at sound.Music.run(Music.java:86)
at java.lang.Thread.run(Unknown Source)
码:
package sound;
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.FloatControl;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
public class Music implements LineListener, Runnable
{
private File soundFile;
private Thread thread;
private static Music player;
private Music audio;
private Clip clip;
public Music()
{
}
public void playSiren(String musicFileName)
{
Music p = getPlayer();
p.playSirenFile(musicFileName);
}
private void playSirenFile(String musicFileName)
{
this.soundFile = new File("Music/"+musicFileName+".wav");
thread = new Thread(this);
thread.setName("SoundPlayer");
thread.start();
}
public void run()
{
try
{
AudioInputStream stream = AudioSystem.getAudioInputStream(this.soundFile);
AudioFormat format = stream.getFormat();
/**
* we can't yet open the device for ALAW/ULAW playback, convert
* ALAW/ULAW to PCM
*/
if ((format.getEncoding() == AudioFormat.Encoding.ULAW) || (format.getEncoding() == AudioFormat.Encoding.ALAW))
{
AudioFormat tmp = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
format.getSampleRate(),
format.getSampleSizeInBits() * 2, format.getChannels(),
format.getFrameSize() * 2, format.getFrameRate(), true);
stream = AudioSystem.getAudioInputStream(tmp, stream);
format = tmp;
}
DataLine.Info info = new DataLine.Info(Clip.class, stream
.getFormat(), ((int) stream.getFrameLength() * format
.getFrameSize()));
clip = (Clip) AudioSystem.getLine(info);
clip.addLineListener(this);
clip.open(stream);
clip.start();
try
{
thread.sleep(99);
}
catch (Exception e)
{
}
while (clip.isActive() && thread != null)
{
try
{
thread.sleep(99);
}
catch (Exception e)
{
break;
}
}
clip.loop(99999999);
}
catch (UnsupportedAudioFileException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (LineUnavailableException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static Music getPlayer()
{
if (player == null)
{
player = new Music();
}
return player;
}
public void update(LineEvent event)
{
}
public void stopClip()
{
clip.stop();
}
public void closeClip()
{
clip.close();
}
public void startClip()
{
clip.start();
}
public void volume(float volume)
{
/*
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
gainControl.setValue(-50.0f); // Reduce volume IN DECIBELS
clip.start();
*/
}
}
我们从domainController调用此类
audio = new Music();
audio.playSiren("stillAliveDecent");
有谁知道如何解决此异常?我尝试重新安装编辑器软件(Eclipse),但无济于事。
预先感谢分配。
编辑
我们只是尝试切换声音文件。我们尝试使用较小的文件运行它。现在可以使用,但是一旦切换回较大的.wav文件(10 + MB),我就会再次遇到异常。
仅使用较小的文件并不是真正的选择,因为我们希望使用一些很长的自制歌曲。
编辑2
我很确定它不是损坏的波形。我们对其进行了重新编译,甚至使用了另一波长度和大小相似的波形,但我仍然是唯一遇到此错误的波形。
一些额外的要求信息:
操作系统:Windows 7 64bit Ultimate
JDK:1.6.0_22
编辑3
经过一些创建和播放wave之后,我们得出的结论是,由于某种原因,我不能播放大于2MB的wave。
仍然为什么我的队友不受影响?
实际上,您可以播放40
mb以上的声音,如果需要的话,这就是我走了多远:p,问题主要是日食,更确切地说,它是您工作区中的.metadata文件夹,我认为它就像一个只能上传的小插件一半的时间,所以问题出在您的编辑器上,而不是代码上,上面的代码运行良好,因为我可以毫无问题地播放歌曲。确保您的路径正确,并尝试获取.metadata的正确版本,并且应该没问题。我的一个朋友遇到了同样的问题,我把工作区和.metadata的副本给了他,效果很好。
我试图在电池完全充电时播放铃声。为了实现这一点,我提供了服务。当我第一次执行我的代码时,它工作了,第二次没有,我在日志中不断地得到这些错误。 根据logcat,错误在
问题内容: 我正在开发一个包含许多JButton对象的程序,我希望每个对象都对应于其自己的文件。另外,我希望声音能够与其他按钮的声音重叠,但不能与自身重叠(在播放声音时单击按钮将重新启动声音)。 我尝试使用单个Clip对象,但是在完成上述操作时遇到了麻烦。结果,我诉诸于为每个按钮声明一个新的Clip对象,但是我觉得这对我的问题而言是一种效率很低的解决方案。 如何以最有效的方式完成第一段中所述的内容
我正在开发一个具有许多JButton对象的程序,我希望每个对象都对应于自己的文件。另外,我希望声音的工作方式是,它们可以与其他按钮的声音重叠,但它不能与自身重叠(在播放声音时单击按钮将重新启动声音)。 我尝试使用单个Clip对象,但我无法完成上面所述的内容。因此,我不得不为每个按钮声明一个新的Clip对象,但我觉得这对我的问题来说是一个相当低效的解决方案。 我怎样才能以最有效的方式完成我在第一段中
播放(播放音效/播放录音)
问题内容: 我正在Android上创建游戏,并且已经将这个问题搁置了一段时间,现在又回到了问题上。在我的游戏中,我有背景音乐,枪声,爆炸声等,而且我需要能够同时玩它们。现在,当我在SoundPool类上调用play时,当前正在播放的声音被打断,新的声音开始播放。下面是我的SoundManager类及其用法。任何帮助将不胜感激,因为这确实是我需要拥有如此多音效的第一款游戏。谢谢! …这是我如何使用该
问题内容: 我希望能够在程序中播放声音文件。我应该去哪里看? 问题答案: 我写了下面的代码,效果很好。但我认为它仅适用于格式。