Подтвердить что ты не робот

Java.io.IOException: mark/reset не поддерживается

try {
    //String location = dir1.getCanonicalPath()+"\\app_yamb_test1\\mySound.au";
    //displayMessage(location);
    AudioInputStream audio2 = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("mySound.au"));
    Clip clip2 = AudioSystem.getClip();
    clip2.open(audio2);
    clip2.start();
} catch (UnsupportedAudioFileException uae) {
    System.out.println(uae);
    JOptionPane.showMessageDialog(null, uae.toString());
} catch (IOException ioe) {
    System.out.println("Couldn't find it");
    JOptionPane.showMessageDialog(null, ioe.toString());
} catch (LineUnavailableException lua) {
    System.out.println(lua);
    JOptionPane.showMessageDialog(null, lua.toString());
}

Этот код отлично работает, когда я запускаю приложение из netbeans. Звук воспроизводится, и исключений нет. Однако, когда я запускаю его из папки dist, звук не воспроизводится, и я получаю java.io.IOException: mark/reset not supported в своем диалоговом окне сообщения.

Как я могу это исправить?

4b9b3361

Ответ 1

В документации для AudioSystem.getAudioInputStream(InputStream) говорится:

Реализация этого метода может требуют нескольких парсеров для изучения поток, чтобы определить, являются ли они поддержите его. Эти парсеры должны быть способны для отметки потока, достаточно прочитать данные определить, поддерживают ли они поток, а если нет, resetпоток считывает указатель на его оригинал должность. Если входной поток не поддерживать эту операцию, этот метод может завершиться с ошибкой IOException.

Поэтому поток, который вы предоставляете этому методу, должен поддерживать необязательную функциональность mark/ reset. Украсьте свой поток ресурсов BufferedInputStream.

//read audio data from whatever source (file/classloader/etc.)
InputStream audioSrc = getClass().getResourceAsStream("mySound.au");
//add buffer for mark/reset support
InputStream bufferedIn = new BufferedInputStream(audioSrc);
AudioInputStream audioStream = AudioSystem.getAudioInputStream(bufferedIn);

Ответ 2

Несколько раз барахтавшись и ссылаясь на эту страницу, я наткнулся на this, который помог мне с моей проблемой, Сначала мне удалось загрузить wav файл, но впоследствии его можно было воспроизвести только один раз, потому что он не мог перемотать его из-за ошибки "mark/ reset not supported". Это было безумным.

Связанный код считывает 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 обрабатывает mark/ reset лучше, чем audioInputStream. Надеюсь, это поможет кому-то там.

Ответ 3

Просто наткнулся на этот вопрос от кого-то другого с той же проблемой, которая ссылалась на него.

База данных Oracle Bug, # 7095006

Используйте следующий код, чтобы избежать шага InputStream. Это InputStream вызывает ошибку.

URL url = AudioMixer.class.getResource(fileName); 
AudioInputStream ais =  AudioSystem.getAudioInputStream(url); 

voila - нет InputStream

mark/ reset исключение во время getAudioInputStream()

Ответ 4

Проблема заключается в том, что входной поток должен поддерживать метку методов и reset. По крайней мере, если знак поддерживается, вы можете протестировать с помощью: AudioInputStream # markSupported.

Итак, вы должны использовать другой InputStream.