java.io.IOException: mark/reset non pris en charge

try {
    //String location = dir1.getCanonicalPath()+"app_yamb_test1mySound.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 bien quand j'exécute l'application de netbeans. Le son joue et il n'y a pas d'exception. Cependant, lorsque je l'exécute à partir du dossier dist, le son ne joue pas et j'obtiens le java.io.IOException: mark/reset not supported dans ma boîte de dialogue de messages.

Comment puis-je réparer ça?

56
demandé sur qasimzee 2011-04-03 17:06:21

4 réponses

la documentation pour AudioSystem.getAudioInputStream(InputStream) dit:

la mise en oeuvre de cette méthode peut nécessite plusieurs analyseurs pour examiner le flux pour déterminer si elles en charge. Ces analyseurs doivent pouvoir pour marquer le flux, lu assez de données pour déterminer s'ils soutiennent 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 l'opération, cette méthode peut échouer avec une IOException.

par conséquent, le flux que vous fournissez à cette méthode doit supporter la fonctionnalité optionnelle marquer/réinitialiser . Décorez 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);
118
répondu McDowell 2011-08-03 07:35:07

après avoir pataugé pendant un certain temps et me référant à cette page plusieurs fois, je suis tombé sur ce qui m'a aidé avec mon problème. J'ai d'abord été capable de charger un fichier wav, mais ensuite je n'ai pu le lire qu'une seule fois, parce qu'il ne pouvait pas le rembobiner à cause de l'erreur "mark/reset not supported". C'était exaspérant.

le code lié lit un AudioInputStream à partir d'un fichier, puis met L'AudioInputStream dans un BufferedInputStream, puis met que dans l'AudioInputStream comme suit:

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

et finalement il convertit les données de lecture en un encodage PCM:

audioInputStream = convertToPCM(audioInputStream);

avec convertToPCM défini 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 gère mark/reset mieux que audioInputStream. Espérons que cela aide quelqu'un là-bas.

5
répondu AndyG 2011-11-28 16:43:02

Juste tombé sur cette question de quelqu'un d'autre avec le même problème qui référencées.

Oracle base de données de Bogues, #7095006

utilisez le code suivant pour éviter l'étape D'entrée. C'est le flux entrant 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()

4
répondu Phil Freihofner 2017-05-23 12:34:21

le problème est que vous êtes flux d'entrée doit soutenir les méthodes marquer et réinitialiser. Au moins si mark est supporté, vous pouvez tester avec: AudioInputStream#markSupported .

donc vous devriez peut-être utiliser un flux entrant différent.

0
répondu Paul Richter 2014-03-12 16:48:57