最近有一个需求 是上传 MP3音频 并且要保存时长
针对获取时长在网上找了很多方法
1. 参考网址 :
https://www.jb51.net/article/134203.htm
这也是网上说的最多的方法
public void method2() {
File file = new File("D:\\test.mp3");
try {
MP3File f = (MP3File)AudioFileIO.read(file);
MP3AudioHeader audioHeader = (MP3AudioHeader)f.getAudioHeader();
System.out.println(audioHeader.getTrackLength());
} catch(Exception e) {
e.printStackTrace();
结果 : 我测试的这个test.mp3 播放时显示的时长是164秒 这个方法测试出来居然只有 600+秒????
2. 使用javasound api:参考 : https://blog.csdn.net/suifengerye/article/details/97113146
public void method1() {
File file = new File("D:\\test.mp3");
long total = 0;
try {
AudioFileFormat aff = AudioSystem.getAudioFileFormat(file);
Map props = aff.properties();
if (props.containsKey("duration")) {
total = (long) Math.round((((Long) props.get("duration")).longValue()) / 1000);
}
System.out.println(total / 1000);
} catch (Exception e) {
e.printStackTrace();
}
}
结果 同一个音频 返回的值居然是 6秒??? 但我同事测试出来又是正常的
3. 然后我在晚上找到了这个 本地跑来是很完美的 没有问题
* 获取播放时长
* @param file
* @return
public Integer getDuration(File file) {
Clip clip = null;
log.info("开始获取MP3播放时长== 1 ");
try {
clip = AudioSystem.getClip();
} catch (LineUnavailableException e) {
log.info("开始获取MP3播放时长异常 1" +e.getMessage());
e.printStackTrace();
AudioInputStream ais = null;
log.info("开始获取MP3播放时长== 2");
try {
ais = AudioSystem.getAudioInputStream(file);
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
log.info("开始获取MP3播放时长异常 2" +e.getMessage());
} catch (IOException e) {
e.printStackTrace();
log.info("开始获取MP3播放时长异常 2.1" +e.getMessage());
log.info("开始获取MP3播放时长== 3");
try {
clip.open(ais);
} catch (LineUnavailableException e) {
log.info("开始获取MP3播放时长异常 3" +e.getMessage());
e.printStackTrace();
} catch (IOException e) {
log.info("开始获取MP3播放时长异常 3.1" +e.getMessage());
e.printStackTrace();
log.info("打印获取MP3播放开始" );
Double v = clip.getMicrosecondLength() / 1000000D;
log.info("打印获取MP3播放时长" + v.intValue());
return v.intValue();
但是当部署到服务器使用的时候 日志打印来看
clip = AudioSystem.getClip();
进入这个方法后就没有反应了 也没有报错
由于时间急就没有详细的查看问题 选择了再次换方法
4. 最后选择了这个 参考网址 : https://blog.csdn.net/suifengerye/article/details/97113146
经测试 本地和 服务器都没有问题
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.MultimediaInfo;
import org.apache.http.entity.ContentType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Service;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
* describe
* @author HuangLinPan
* @date 2021/09/17
@Service
public class FileUploadUtil {
// public static void main(String[] args) throws Exception {
// File pdfFile = new File("D:\\xiaoyan2120test.mp3");
// long videoDuration = getVideoDuration(pdfFile);
// System.out.println(videoDuration);
* 获取时长
* @param pdfFile 音频/视频文件
* @return
public long getVideoDuration(File pdfFile) throws Exception {
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(pdfFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
MultipartFile multipartFile = new MockMultipartFile(pdfFile.getName(), pdfFile.getName(),
ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
long duration = 0;
File source = new File(getFilePath() + multipartFile.getOriginalFilename());
multipartFile.transferTo(source);
Encoder encoder = new Encoder();
MultimediaInfo info = encoder.getInfo(source);
duration = info.getDuration();
if (source.exists()) {
source.delete();
return duration / 1000;
private static String getFilePath() throws Exception {
//获取当前文件的根路径
File path = new File(ResourceUtils.getURL("classpath:").getPath());
if (!path.exists()) {
path = new File("");
//盘符路径
StringBuilder codeUrl = new StringBuilder();
codeUrl.append(path.getAbsolutePath()).append("/static/video/");
File file = new File(codeUrl.toString());
if (!file.exists()) {
file.mkdirs();
return codeUrl.toString();
由于本项目我得到的是一个文件所在地址
所以涉及到了将File转化为MultipartFile的操作 参考: https://www.jb51.net/article/197182.htm
import java.io.File;
import java.io.FileInputStream;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.mock.web.MockMultipartFile;
import org.apache.http.entity.ContentType;
File pdfFile = new File("D://test.pdf");
FileInputStream fileInputStream = new FileInputStream(pdfFile);
MultipartFile multipartFile = new MockMultipartFile(pdfFile.getName(), pdfFile.getName(),
ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.9</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
总结 : 能实现的方法有很多 找到自己合适的就好