mp3文件流上的getDuration:java.io.IOException:不支持mark / reset

时间:2015-05-29 17:44:45

标签: java stream javasound

我在本地MP3文件上成功使用了getDuration,但是当远程MP3stream上的getDuration导致错误时:java.io.IOException: mark/reset not supported.

本地MP3上的成功getDuration:

 public static void getDurationOff() throws UnsupportedAudioFileException, IOException {
         int sumtime = 0;
         File file = new File("D:\\java\\MusicMP3\\src\\Images\\Water_Lily.mp3");
         AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(file);
         if (fileFormat instanceof TAudioFileFormat) {
             Map<?, ?> properties = ((TAudioFileFormat) fileFormat).properties();
             Long microseconds = (Long) properties.get("duration");
                //total seconds
             sumtime = (int)(microseconds / 1000000);
             System.out.println("Total seconds :"+sumtime);
         }
     }

远程MP3上的getDuration失败:

 public static void getDurationOn() throws UnsupportedAudioFileException, IOException {
             int sumtime = 0;
             String linkonline="http://api.mp3.zing.vn/api/mobile/source/song/LmJnykGNlNmnNkuTZvctbGZm";
             URLConnection urlConnection = new URL(linkonline).openConnection();
             urlConnection.connect();
             AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(urlConnection.getInputStream());
             if (fileFormat instanceof TAudioFileFormat) {
                 Map<?, ?> properties = ((TAudioFileFormat) fileFormat).properties();
                 Long microseconds = (Long) properties.get("duration");
                 //total seconds
                 sumtime = (int)(microseconds / 1000000);
                 System.out.println("Total seconds :"+sumtime);
             }
         }

错误:

 Exception in thread "main" java.io.IOException: mark/reset not
 supported  at
 sun.net.www.http.KeepAliveStream.reset(KeepAliveStream.java:122)   at
 java.io.FilterInputStream.reset(FilterInputStream.java:226)    at
 sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.reset(HttpURLConnection.java:3299)
    at
 org.tritonus.share.sampled.file.TAudioFileReader.getAudioFileFormat(TAudioFileReader.java:184)
    at
 javax.sound.sampled.AudioSystem.getAudioFileFormat(AudioSystem.java:1004)
    at musicmp3.demoGetlink.getDurationOn(demoGetlink.java:99)  at
 musicmp3.demoGetlink.main(demoGetlink.java:118) Java Result: 1

2 个答案:

答案 0 :(得分:1)

作为行

javax.sound.sampled.AudioSystem.getAudioFileFormat(AudioSystem.java:1004)

似乎是根据堆栈跟踪抛出错误。来自AudioSystem的规范

“此方法的实现可能需要多个解析器检查流以确定它们是否支持它。这些解析器必须能够标记流,读取足够的数据以确定它们是否支持流,如果不支持,将流的读指针重置为其原始位置。“

但您似乎正在使用流类型sun.net.www.http.KeepAliveStream,其中source为markSupported()返回False。尝试从返回的getInputStream输入流创建一个新的BufferedInputStream,例如

InputStream is = urlConnection.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);

并使用它。

编辑:拼写错误

Edit2:哎呀刚注意到java.io.IOException: mark/reset not supported

可能重复

答案 1 :(得分:0)

有三种方法可以使用AudioSystem.getAudioFileFormat(yourParameter)。在您显示的非工作代码中,您使用InputStream作为参数,可以(但不总是)触发标记/重置测试。

或者,您可以使用文件或网址作为参数。这不会触发标记/重置测试。您在工作示例中成功使用File。尝试使用简单的URL作为非工作中的参数,而不是从URL派生InputStream。

我不完全清楚您显示错误发生的错误消息。如果它来自不同的代码部分,我表示歉意。另外,我没有阅读.mp3文件的经验。我经常和wav一起工作。但我多次遇到InputStream标记/重置错误。