gpt4 book ai didi

java - 歌曲第一次播放但停止后不播放 : Clip in Java

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

我在 java 中使用 Clip 来播放一首歌,如下所示:

        MR.clip= (Clip) AudioSystem.getLine(MR.info[docIdOfSelectedSong]);
MR.clip.open(MR.sounds[docIdOfSelectedSong]);
MR.clip.setMicrosecondPosition(5* 1000000);
MR.clip.start();

其中 MR.sounds 是 AudioInputStream 类型的数组,MR.info 是 DataLine.info 类型的数组。当我按下一个按钮时,上面的代码被调用来播放歌曲。此外,我还有另一个按钮可以停止调用以下代码的歌曲

public static void stopSong(){

MR.clip.close();

}

问题是当我第一次播放歌曲时,播放和停止按钮工作正常。但是,当我第二次尝试播放这首歌时,我听不到这首歌。对出了什么问题有什么建议吗?

最佳答案

与所有其他 InputStream 一样,AudioInputStream 只能被读取一次(除非它可以是 .reset() )。在尝试再次播放声音之前,您可以尝试在 AudioInputStream 上调用 .reset(),但 AudioInputStream 可能不支持 .reset()。 InputStreams 不需要支持重置。另见 markSupported() .

如果 .reset() 不起作用,请考虑在每次需要开始播放时构造一个新的 AudioInputStream。


更新:我做了一个在内存中缓存声音数据并使用 Clip 播放这些声音的示例。此示例使用 AudioInputStream.reset()。那怎么行呢?事实上,AudioInputStream 确实支持reset() 当且仅当其底层InputStream 支持.reset()。因此,我的示例创建了一个由 ByteArrayInputStream 支持的 AudioInputStream。因为 ByteArrayInputStream 支持重置,所以这些缓存的 AudioInputStreams 也支持 .reset(),这允许它们被重用。

请注意,如果您要同时播放任何一个缓存的声音,您可能不应该缓存 AudioInputStream,而是缓存 byte[] 并构造一个AudioInputStream 每次播放。这是因为 AudioInputStream 是有状态的,因此将它的单个实例传递给两个同时运行的剪辑,或者在一个剪辑正在播放时重置流,将导致状态冲突。

public class CachedSoundClipTest
{
static ArrayList<AudioInputStream> cachedSounds =
new ArrayList<AudioInputStream>();

public static void main(String[] args) throws Exception
{
File[] audioFiles = new File("/audio_storage_directory").listFiles();
for (File file : audioFiles)
{
AudioInputStream reusableAudioInputStream =
createReusableAudioInputStream(file);
cachedSounds.add(reusableAudioInputStream);
}

while(true)
{
System.out.println("Press enter to play next clip");
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
br.readLine();
playCachedSound(0);
}
}

private static void playCachedSound(int i)
throws IOException, LineUnavailableException
{
AudioInputStream stream = cachedSounds.get(i);
stream.reset();
Clip clip = AudioSystem.getClip();
clip.open(stream);
clip.start();
}

private static AudioInputStream createReusableAudioInputStream(File file)
throws IOException, UnsupportedAudioFileException
{
AudioInputStream ais = null;
try
{
ais = AudioSystem.getAudioInputStream(file);
byte[] buffer = new byte[1024 * 32];
int read = 0;
ByteArrayOutputStream baos =
new ByteArrayOutputStream(buffer.length);
while ((read = ais.read(buffer, 0, buffer.length)) != -1)
{
baos.write(buffer, 0, read);
}
AudioInputStream reusableAis =
new AudioInputStream(
new ByteArrayInputStream(baos.toByteArray()),
ais.getFormat(),
AudioSystem.NOT_SPECIFIED);
return reusableAis;
}
finally
{
if (ais != null)
{
ais.close();
}
}
}
}

关于java - 歌曲第一次播放但停止后不播放 : Clip in Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9999961/

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