java.io.IOException: mark/reset no soportado
audio (4)
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?
Acabo de encontrar esta pregunta de otra persona con el mismo problema que la hizo referencia.
Base de datos Oracle Bug, # 7095006
Use el siguiente código para evitar el paso InputStream. Es el InputStream que está causando el error.
URL url = AudioMixer.class.getResource(fileName);
AudioInputStream ais = AudioSystem.getAudioInputStream(url);
voila - no InputStream
marca / restablece la excepción durante getAudioInputStream ()
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í.
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.
La documentación de AudioSystem.getAudioInputStream(InputStream)
dice:
La implementación de este método puede requerir que múltiples analizadores examinen la secuencia para determinar si la admiten. Estos analizadores deben poder marcar la secuencia, leer datos suficientes para determinar si admiten la transmisión y, de lo contrario, restablecer el puntero de lectura de la ruta a su posición original. Si el flujo de entrada no admite estas operaciones, este método puede fallar con una IOException.
Por lo tanto, la secuencia que proporcione a este método debe admitir la funcionalidad de mark/reset opcional. Decora tu flujo de recursos con 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);