Поработав некоторое время и многократно обращаясь к этой странице, я наткнулся на на , что помогло мне решить мою проблему. Сначала я мог загрузить файл wav, но впоследствии мог воспроизвести его только один раз, потому что он не мог перемотать его из-за ошибки «пометка / сброс не поддерживается». Это было невыносимо.
Связанный код считывает AudioInputStream из файла, затем помещает AudioInputStream в BufferedInputStream, затем помещает , что , обратно в AudioInputStream следующим образом:
audioInputStream = AudioSystem.getAudioInputStream(new File(filename));
BufferedInputStream bufferedInputStream = new BufferedInputStream(audioInputStream);
audioInputStream = new AudioInputStream(bufferedInputStream, audioInputStream.getFormat(), audioInputStream.getFrameLength());
И, наконец, он преобразует прочитанные данные в кодировку PCM:
audioInputStream = convertToPCM(audioInputStream);
С convertToPCM, определенной как:
private static AudioInputStream convertToPCM(AudioInputStream audioInputStream)
{
AudioFormat m_format = audioInputStream.getFormat();
if ((m_format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) &&
(m_format.getEncoding() != AudioFormat.Encoding.PCM_UNSIGNED))
{
AudioFormat targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
m_format.getSampleRate(), 16,
m_format.getChannels(), m_format.getChannels() * 2,
m_format.getSampleRate(), m_format.isBigEndian());
audioInputStream = AudioSystem.getAudioInputStream(targetFormat, audioInputStream);
}
return audioInputStream;
}
Я полагаю, что они делают это, потому что BufferedInputStream обрабатывает метку / сброс лучше, чем audioInputStream. Надеюсь, это кому-нибудь поможет.