java.io.IOException: mark / reset no soportado


Answers

Después de forcejear por un rato y hacer referencia a esta página muchas veces, me encontré con this que me ayudó con mi problema. Inicialmente pude cargar un archivo wav, pero posteriormente solo pude reproducirlo una vez, porque no pudo rebobinarlo debido al error "marca / restablecimiento no compatible". Fue enloquecedor.

El código vinculado lee un AudioInputStream de un archivo, luego coloca el AudioInputStream en un BufferedInputStream, luego lo vuelve a poner en el AudioInputStream como sigue:

audioInputStream = AudioSystem.getAudioInputStream(new File(filename));
BufferedInputStream bufferedInputStream = new BufferedInputStream(audioInputStream);
audioInputStream = new AudioInputStream(bufferedInputStream, audioInputStream.getFormat(), audioInputStream.getFrameLength());

Y finalmente convierte los datos leídos a una codificación PCM:

audioInputStream = convertToPCM(audioInputStream);

Con convertToPCM definido como:

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;
}

Creo que lo hacen porque BufferedInputStream maneja la marca / reinicio mejor que audioInputStream. Espero que esto ayude a alguien por ahí.

Question
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());
}

Este código funciona bien cuando ejecuto la aplicación desde netbeans. El sonido se reproduce y no hay excepciones. Sin embargo, cuando lo ejecuto desde la carpeta dist, el sonido no se reproduce y obtengo la java.io.IOException: mark/reset not supported en el cuadro de diálogo de mi mensaje.

¿Cómo puedo arreglar esto?




El problema es que tu corriente de entrada tiene que ser compatible con los métodos mark y reset. Al menos si la marca es compatible, puede probar con: AudioInputStream#markSupported .

Entonces quizás debas usar un InputStream diferente.




Links