Как и все другие InputStreams, AudioInputStream может быть прочитан только один раз (если это не может быть .reset () ). Вы можете попробовать вызвать .reset () для AudioInputStream, прежде чем пытаться воспроизвести звук снова, но AudioInputStream может не поддерживать .reset (). InputStreams не требуется для поддержки сброса. Также см. markSupported () .
Если .reset () не работает, рассмотрите возможность создания нового AudioInputStream каждый раз, когда вам нужно начать воспроизведение.
ОБНОВЛЕНИЕ: я сделал пример кэширования звуковых данных в памяти и использования клипа для воспроизведения этих звуков. В этом примере используется AudioInputStream.reset (). Так как это может работать? Фактически, AudioInputStream поддерживает , поддерживает reset () тогда и только тогда, когда его базовый InputStream поддерживает .reset (). Итак, мой пример создает AudioInputStream, который поддерживается ByteArrayInputStream. Поскольку 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();
}
}
}
}