使用javax.sound.samples库时遇到异常......!

时间:2010-12-29 18:48:34

标签: java audio

任何人都可以告诉我在这个java程序中我在哪里犯了错误。 我经常在运行时遇到异常。

import java.io.*;
import javax.sound.sampled.*;
public class x 
{
 public static void main(String args[])
 {
  try
  {
  File f=new File("mm.wav");
  AudioInputStream a=AudioSystem.getAudioInputStream(new FileInputStream(f));
  AudioFormat audioFormat = a
                   .getFormat();
             DataLine.Info dataLineInfo = new DataLine.Info(
                   Clip.class, audioFormat);
             Clip clip = (Clip) AudioSystem
                   .getLine(dataLineInfo);
             clip.open(a);
             clip.start();
 }
 catch(Exception e)
 {
  e.printStackTrace();
  System.out.println("exception caught ");
 }
 }
}

它会抛出此异常

java.io.IOException: mark/reset not supported
    at java.io.InputStream.reset(InputStream.java:351)
    at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(SoftMidiAudioFileReader.java:135)
    at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1111)
    at x.main(x.java:10)

2 个答案:

答案 0 :(得分:2)

偶然发现同一问题,然后潜入 javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1113) 那里的代码询问提供商是否可以处理声音格式,并捕获UnsupportedAudioFileException以继续使用下一个提供商。代码注释状态为“引发IOException”,并且在AudioSystem尝试提供程序时发生IOException com.sun.media.sound.SoftMidiAudioFileReader 是的,提供程序将引发UnsupportedAudioFileException,但在这样做之前,它将在输入流上调用“ reset()”。我通过标准URL.openStream()使用包资源,URL流不支持reset(),并且在之前 SoftMidiAudioFileReader抛出UnsupportedAudioFileException时抛出IOException。

AudioSystem类中的错误:捕获了UnsupportedAudioFileException,并继续使用下一个提供程序,而不必要的IOException将中止所有其他提供程序。

您的stacktrace显示您遇到了相同的错误。 还没解决。

答案 1 :(得分:1)

编辑:

在测试代码之后,每当我尝试为您的代码提供无效的声音文件时,我都会得到相同的错误(我给它提供了文本文件和二进制java类文件:))。我每次都得到同样的例外。这不是一个非常用户友好的例外,但请检查您的wav文件的有效性。

编辑#2:

如果我将代码更改为:

  AudioInputStream a=AudioSystem.getAudioInputStream(
      new BufferedInputStream(new FileInputStream(f)));

然后无效的声音文件会给出更令人满意的异常:UnsupportedAudioFileException