【问题标题】:getDuration on mp3 file streams: java.io.IOException: mark/reset not supportedmp3 文件流上的 getDuration:java.io.IOException:不支持标记/重置
【发布时间】:2015-08-12 16:39:39
【问题描述】:

我在本地 MP3file 上成功使用 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

【问题讨论】:

  • 修正语法和格式,添加到 Javasound 标签。
  • 非常感谢,非常抱歉能够写出我的英语

标签: java stream javasound


【解决方案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 可能重复

【讨论】:

  • 谢谢你的帮助,我试过但返回错误:Exception in thread "main" java.lang.NullPointerException
  • 你能给出完整的堆栈跟踪吗?错误在哪里抛出?
  • 错误:Exception in thread "main" java.lang.NullPointerException at musicmp3.demoGetlink.getDurationOn(demoGetlink.java:111) at musicmp3.demoGetlink.main(demoGetlink.java:148) Java Result: 1
  • 这是我更改的代码URLConnection urlConnection = new URL(linkonline).openConnection(); InputStream is = urlConnection.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(bis);
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您的热情,我尝试了很多方法都没有成功。
猜你喜欢
  • 2015-06-28
  • 2014-01-02
  • 2012-03-08
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多