【发布时间】:2022-01-03 15:23:18
【问题描述】:
使用 java 以编程方式获取媒体文件的持续时间。文件格式仅限于 mp3 和 wav。
【问题讨论】:
使用 java 以编程方式获取媒体文件的持续时间。文件格式仅限于 mp3 和 wav。
【问题讨论】:
找了很久,找到了两种计算mp3和wav文件时长的方法。 对于 wav 文件:
public static double getDurationOfWavFile(String filename){
logger.debug("getDuration (wav) -- filename: " + filename);
File file = null;
double durationInSeconds=0;
try {
file = new File(filename);
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
AudioFormat format = audioInputStream.getFormat();
long frames = audioInputStream.getFrameLength();
durationInSeconds = (frames+0.0) / format.getFrameRate();
} catch (Exception ex) {
logger.error(ex.getMessage());
}
return durationInSeconds;
}
很遗憾,此方法不适用于 mp3 文件。从该 URL 可以看到MPEG Audio Frame Header 信息。通过执行此answer 中指定的计算,可以计算出mp3 媒体时长。但是有一种更简单的方法是使用 java 库。图书馆链接是jlayer-1.0.1.4.jar。这个库可以从 mp3 文件计算持续时间,但不能从 wav 文件计算。我还尝试使用 python 脚本和库 gtts 将 wav 文件转换为 mp3。但是转换后的 mp3 无法给出正确的持续时间。因此,对于 wav 文件,上述代码表现最佳。对于 mp3 文件,下面的代码可能很有用:
public static float getDuration(String filename){
logger.debug("getDuration (mp3) -- filename: " + filename);
Bitstream bitstream;
Header h = null;
FileInputStream file = null;
try {
file = new FileInputStream(filename);
} catch (FileNotFoundException ex) {}
bitstream = new Bitstream(file);
try {
h = bitstream.readFrame();
} catch (BitstreamException ex) {}
int size = h.calculate_framesize();
float ms_per_frame = h.ms_per_frame();
int maxSize = h.max_number_of_frames(10000);
float t = h.total_ms(size);
long tn = 0;
try {
tn = file.getChannel().size();
} catch (IOException ex) {}
int min = h.min_number_of_frames(500);
return h.total_ms((int) tn)/1000;
}
我没有尝试任何其他格式。我希望这个答案能解决你的问题。
【讨论】:
MediaMetadataRetriever类吗? developer.android.com/reference/android/media/…