64 votes

java.io.IOException: marque/reset pas pris en charge

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

Ce code fonctionne très bien lorsque je lance l'application à partir de netbeans. Le son joue et il n'y a pas d'exceptions. Cependant, quand je le lance à partir de la dist dossier, le son ne joue pas et j'ai l' java.io.IOException: mark/reset not supported dans ma boîte de message.

Comment puis-je résoudre ce problème?

131voto

McDowell Points 62645

La documentation pour l' AudioSystem.getAudioInputStream(InputStream) dit:

La mise en œuvre de cette méthode peut besoin de plusieurs analyseurs d'examiner le flux afin de déterminer si elles en charge. Ces analyseurs doivent être en mesure pour marquer le flux, lu assez de données pour déterminer s'il prend en charge la stream, et, si non, réinitialiser le flux du pointeur de lecture d'origine position. Si le flux d'entrée n'est pas l'appui de ces opération, cette méthode peut échouer avec une IOException.

Par conséquent, le flux que vous fournissez à cette méthode doit prendre en charge l'option marque/reset de la fonctionnalité. Décorer votre flux de ressources avec un 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);

5voto

AndyG Points 3298

Après la patte d'environ pendant un certain temps et le référencement de cette page de nombreuses fois, je suis tombé sur ce qui m'a aidé avec mon problème. J'ai d'abord été en mesure de charger un fichier wav, mais par la suite il ne pouvait jouer une seule fois, car il ne peut pas rembobiner en raison de la "marque/reset pas pris en charge" erreur. C'était exaspérant.

Liés code lit un AudioInputStream à partir d'un fichier, puis met la AudioInputStream dans un BufferedInputStream, met alors que de retour dans le AudioInputStream comme suit:

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

Et puis, finalement, il convertit les données lues à un codage PCM:

audioInputStream = convertToPCM(audioInputStream);

Avec convertToPCM définie comme:

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

Je crois qu'ils font cela parce que BufferedInputStream poignées de marque/reset mieux que audioInputStream. Espérons que cela aide quelqu'un là-bas.

4voto

Phil Freihofner Points 1841

Viens de tomber sur cette question de quelqu'un d'autre avec le même problème qui de le référencer.

Oracle base de données de Bogues, #7095006

Utilisez le code suivant pour éviter l'InputStream étape. C'est l'InputStream qui est à l'origine de l'erreur.

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

voila, pas de InputStream

marque/reset exception lors de l'getAudioInputStream()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X