他のすべての InputStream と同様に、AudioInputStream は 1 回だけ読み取ることができます(.reset()である場合を除く)。サウンドを再生する前に、AudioInputStream で .reset() を呼び出すこともできますが、AudioInputStream は .reset() をサポートしていない可能性があります。リセットをサポートするために InputStreams は必要ありません。markSupported()も参照してください。
.reset() が機能しない場合は、再生を開始する必要があるたびに新しい AudioInputStream を構築することを検討してください。
更新: サウンド データをメモリにキャッシュし、Clip を使用してそれらのサウンドを再生する例を作成しました。この例では、AudioInputStream.reset() を使用しています。では、それはどのように機能するのでしょうか。実際、AudioInputStreamは、基になる InputStream が .reset() をサポートしている場合に限り、 reset()をサポートします。したがって、私の例では、ByteArrayInputStream によってサポートされる AudioInputStream を作成します。ByteArrayInputStream はリセットをサポートしているため、これらのキャッシュされた AudioInputStream も .reset() をサポートしており、再利用が可能です。
AudioInputStream
キャッシュされたサウンドを同時に再生する場合は、おそらく をキャッシュするのではなく、 をキャッシュして再生ごとにbyte[]
構築する必要があることに注意してください。AudioInputStream
これは、AudioInputStream
がステートフルであるため、その 1 つのインスタンスを同時に実行中の 2 つのクリップに渡すか、1 つのクリップの再生中にストリームをリセットすると、状態の競合が発生するためです。
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();
}
}
}
}