gpt4 book ai didi

java - 错误播放声音java(无线匹配接口(interface)剪辑支持格式)

转载 作者:搜寻专家 更新时间:2023-11-01 03:12:55 24 4
gpt4 key购买 nike

我们正在尝试将声音集成到我们的一个项目中,我的团队成员没有收到此错误,而我在两台不同的机器上收到了。

堆栈跟踪:

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
我很确定这不是损坏的 wav。我们重新编译了它,甚至使用了另一波长度和大小相似的波,但我仍然是唯一遇到此错误的人。

一些额外要求的信息:

操作系统:Windows 7 64 位旗舰版
JDK:1.6.0_22

编辑3

在创建和播放一些 wave 之后,我们得出结论,出于某种原因我无法播放大于 2MB 的 wave。

为什么我的队友没有受到影响?

最佳答案

我在树莓派上遇到了同样的问题。它可以很好地播放前 5 个文件,然后我会收到错误消息。事实证明,我没有在需要时关闭剪辑。

Clip clip = AudioSystem.getClip();
clip.addLineListener(event -> {
if(LineEvent.Type.STOP.equals(event.getType())) {
clip.close();
}
});
ByteArrayInputStream audioBytes = new ByteArrayInputStream(SOUNDS.get(file));
AudioInputStream inputStream = AudioSystem.getAudioInputStream(audioBytes);
clip.open(inputStream);
clip.start();

添加线路监听器并在剪辑停止时关闭剪辑后,错误消失了。

关于java - 错误播放声音java(无线匹配接口(interface)剪辑支持格式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5808560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com