我在本地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
答案 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标记/重置错误。