java.io.IOException : 표시 / 재설정이 지원되지 않음
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메시지 대화 상자에 표시됩니다.
이 문제를 어떻게 해결할 수 있습니까?
에 대한 설명서 AudioSystem.getAudioInputStream(InputStream)는 다음과 같습니다.
이 메서드를 구현하려면 스트림을 검사하여 지원 여부를 확인하기 위해 여러 파서가 필요할 수 있습니다. 이러한 파서는 스트림을 표시하고, 스트림을 지원하는지 여부를 결정하기에 충분한 데이터를 읽을 수 있어야하며, 그렇지 않은 경우 스트림의 읽기 포인터를 원래 위치로 재설정 할 수 있어야합니다. 입력 스트림이 이러한 작업을 지원하지 않는 경우이 메서드는 IOException과 함께 실패 할 수 있습니다.
따라서이 메서드에 제공하는 스트림은 선택적 표시 / 재설정 기능을 지원해야합니다 . 리소스 스트림을 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);
한동안 허둥 대고이 페이지를 여러 번 참조한 후 나는 문제를 해결하는 데 도움 이 되는 이것을 발견했습니다 . 처음에는 wav 파일을로드 할 수 있었지만 이후에는 "mark / reset not supported"오류로 인해 되 감을 수 없기 때문에 한 번만 재생할 수있었습니다. 미친 짓이었다.
링크 된 코드는, 다음 BufferedInputStream을에 AudioInputStream를두고, 파일로부터 AudioInputStream를을 읽어두고 그 때문에 같은 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이 audioInputStream보다 마크 / 리셋을 더 잘 처리하기 때문에 그렇게한다고 생각합니다. 이것이 누군가를 돕기를 바랍니다.
이 질문을 참조한 동일한 문제를 가진 다른 사람으로부터 방금이 질문을 받았습니다.
Oracle 버그 데이터베이스, # 7095006
InputStream 단계를 피하려면 다음 코드를 사용하십시오. 오류를 일으키는 것은 InputStream입니다.
URL url = AudioMixer.class.getResource(fileName);
AudioInputStream ais = AudioSystem.getAudioInputStream(url);
짜잔-InputStream 없음
getAudioInputStream () 중 표시 / 재설정 예외
문제는 입력 스트림이 표시 및 재설정 메소드를 지원해야한다는 것입니다. 적어도 mark가 지원되는 경우 AudioInputStream # markSupported로 테스트 할 수 있습니다 .
따라서 다른 InputStream을 사용해야 할 수도 있습니다.
참고 URL : https://stackoverflow.com/questions/5529754/java-io-ioexception-mark-reset-not-supported
'Program Club' 카테고리의 다른 글
| 자바 스크립트를 사용하여 키 코드를 문자로 변환하는 방법 (0) | 2020.11.23 |
|---|---|
| 돌아 가기 대신 "이동"버튼이있는 iOS 키보드 (0) | 2020.11.23 |
| http.HandleFunc 패턴의 와일드 카드 (0) | 2020.11.23 |
| jQuery의 드롭 이벤트를 사용하여 데스크탑에서 끌어온 파일을 업로드하는 방법은 무엇입니까? (0) | 2020.11.23 |
| 변경 불가능한 Java 객체 만들기 (0) | 2020.11.23 |