JAVA获取音频时长

下载依赖jar

https://download.csdn.net/download/qq_38254635/16546842

加载依赖,可导入maven仓库,也可以直接放在项目中

这里直接放在项目中

	<!-- calculate audio duration  -->
    <dependency>
        <groupId>jaudiotagger</groupId>
        <artifactId>jaudiotagger</artifactId>
        <version>2.2.6</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/lib/jaudiotagger-2.2.6-SNAPSHOT.jar</systemPath>
    </dependency>
    <dependency>
        <groupId>jl</groupId>
        <artifactId>jl</artifactId>
        <version>1.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/lib/jl1.0.1.jar</systemPath>
    </dependency>
上传文件代码

路径,大小,文件类型,可放在SpringBoot项目中的yml文件中
参考链接 https://blog.csdn.net/qq_38254635/article/details/112033193

package utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

@Slf4j
public class UploadAudioFile {

    private final static String basePath = "audio/";
    private final static String fileUploadPath = "/data/upload/";
    private final static String fileUploadType = "user,org,business";
    private final static String fileSizeMax = "100MB";
    private final static String audioType = "mp3,wav";

    /**
     * upload audio file
     * @param fileType file type example:ass,aud
     * @param file file stream
     * @param request request for IP address
     * @return the path of the file on the server
     */
    public Result uploadAudio(String fileType, MultipartFile file, HttpServletRequest request) {
        if(file.isEmpty() || file.getOriginalFilename().isEmpty()) return Result.error(1000, "不能上传空文件");
        if (!fileUploadType.contains(fileType.startsWith("/") ? fileType.substring(1) : fileType)) return Result.error(1000, "非法的文件上传路径");
        String fileExtension = file.getOriginalFilename().split("\\.")[file.getOriginalFilename().split("\\.").length - 1];
        if (!audioType.contains(fileExtension.toLowerCase())) return Result.error(1000, "文件类型有误,支持文件类型:" + audioType);
        Integer imageMaxByte = Integer.valueOf(fileSizeMax.substring(0, fileSizeMax.length() - 2)) * 1024 * 1024;
        if (file.getSize() > imageMaxByte) return Result.error(1000, "当前文件超过最大限制,支持大小:" + imageMaxByte + "MB");
        String fileMd5;
        try {
            fileMd5 = DigestUtils.md5Hex(file.getInputStream());
        } catch (Exception e) {
            return Result.error(1000, "当前验证文件md5失败");
        }
        Date now = new Date();
        String newFileName = DateFormatUtils.format(now, "yyyyMMddHHmmssSSS") + (new Random().nextInt(100) + 100) + "." + fileExtension;
        String newFileRoute = (basePath + (fileType.startsWith("/") ? fileType.substring(1) : fileType)).trim().replace(" ","") + getDatePath();
        log.info("文件信息:" + fileUploadPath + newFileRoute + newFileName);
        try {
            File filePath = new File(fileUploadPath + newFileRoute);
            if (!filePath.exists()) {
                filePath.mkdirs();
            }
        } catch (Exception e) {
            log.error("creating folder on linux server error", e);
            return Result.error(1000, "服务端创建文件夹失败");
        }
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(fileUploadPath + newFileRoute + newFileName);
            fileOutputStream.write(file.getBytes());
            fileOutputStream.close();
        } catch (Exception e) {
            return Result.error(1000, "服务端写入文件失败");
        } finally {
            if(null != fileOutputStream){
                try {
                    fileOutputStream.close();
                } catch (IOException e1){
                    log.error("close IO stream error", e1);
                }
            }
        }
        Long duration = null;
        try {
            duration = AudioUtil.getAudioDuration(file, fileUploadPath + newFileRoute + newFileName, fileExtension);
            log.info("=================audio duration:" + duration + "second=================");
        } catch (Exception e){
            log.error("get audio duration error", e);
        }
        Map<String,Object> resultMap = new HashMap<>();
        resultMap.put("fileName", file.getOriginalFilename());
        resultMap.put("filePath", "upload/" + newFileRoute + newFileName);
        resultMap.put("duration", duration);
        return Result.success(resultMap);
    }

    private static String getDatePath(){
        return "/"+ DateFormatUtils.format(new Date(), "yyyy-MM-dd").replaceAll("-","/")+"/";
    }
}
获取音频时长代码
package utils;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import lombok.extern.slf4j.Slf4j;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.audio.mp3.MP3AudioHeader;
import org.jaudiotagger.audio.mp3.MP3File;
import javazoom.jl.player.Player;
import org.springframework.web.multipart.MultipartFile;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

/**
 * audio utils
 * get audio duration, supported formats : mp3, wav
 */
@Slf4j
public class AudioUtil {

    /**
     * get audio duration
     * @param file file
     * @param position file position
     * @param fileExtension file extension type
     * @return audio duration, the unit is seconds
     * @throws Exception exception
     */
    public static Long getAudioDuration(MultipartFile file, String position, String fileExtension) throws Exception{
        if(null == fileExtension || null == file) return null;
        switch (fileExtension.toLowerCase()){
            case "mp3":
                return Long.valueOf(getMp3Duration(position));
            case "wav":
                return getWavDuration(file);
        }
        return null;
    }

    /**
     * get wav audio duration
     * @param position file position
     * @return second
     * @throws LineUnavailableException the audio line not available
     * @throws UnsupportedAudioFileException the audio format not supported
     * @throws IOException file stream exception
     */
    public static Long getWavDuration(String position) throws LineUnavailableException, UnsupportedAudioFileException, IOException{
        Clip clip = AudioSystem.getClip();
        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream(position)));
        clip.open(audioInputStream);
        return clip.getMicrosecondLength() / 1000000;
    }

    /**
     * get wav audio duration
     * @param file file
     * @return second
     * @throws LineUnavailableException the audio line not available
     * @throws UnsupportedAudioFileException the audio format not supported
     * @throws IOException file stream exception
     */
    public static Long getWavDuration(MultipartFile file) throws LineUnavailableException, UnsupportedAudioFileException, IOException{
        Clip clip = AudioSystem.getClip();
        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new BufferedInputStream(file.getInputStream()));
        clip.open(audioInputStream);
        return clip.getMicrosecondLength() / 1000000;
    }

    /**
     * play audio
     * @param position file position
     */
    public static void playMp3File(String position) {
        try {
            BufferedInputStream buffer = new BufferedInputStream(new FileInputStream(position));
            Player player = new Player(buffer);
            player.play();
        } catch (Exception e) {
            log.error("play audio exception:", e);
        }
    }

    /**
     * get mp3 audio duration
     * @param position file position
     * @return second
     */
    public static Integer getMp3Duration(String position) {
        try {
            MP3File mp3File = (MP3File) AudioFileIO.read(new File(position));
            MP3AudioHeader audioHeader = (MP3AudioHeader) mp3File.getAudioHeader();
            return audioHeader.getTrackLength();
        } catch (Exception e) {
            log.error("get mp3 audio duration exception:", e);
        }
        return 0;
    }

    /**
     * play audio
     * @param multipartFile file
     */
    public static void playMp3File(MultipartFile multipartFile) {
        try {
            BufferedInputStream buffer = new BufferedInputStream(multipartFile.getInputStream());
            Player player = new Player(buffer);
            player.play();
        } catch (Exception e) {
            log.error("play audio exception:", e);
        }
    }

    /**
     * get mp3 audio duration
     * @param multipartFile file
     * @return second
     */
    public static Integer getMp3Duration(MultipartFile multipartFile) {
        try {
            File file = multipartFileToFile(multipartFile);
            MP3File mp3File = (MP3File) AudioFileIO.read(file);
            MP3AudioHeader audioHeader = (MP3AudioHeader) mp3File.getAudioHeader();
            deleteTempFile(file);
            return audioHeader.getTrackLength();
        } catch (Exception e) {
            log.error("get mp3 audio duration exception:", e);
        }
        return 0;
    }

    /**
     * MultipartFile to File
     * @param multipartFile multipartFile
     * @return file
     * @throws IOException IOException
     */
    public static File multipartFileToFile(MultipartFile multipartFile) throws IOException {
        File file = null;
        if(null != multipartFile && multipartFile.getSize() > 0 && null != multipartFile.getOriginalFilename()){
            InputStream inputStream = null;
            inputStream = multipartFile.getInputStream();
            file = new File(multipartFile.getOriginalFilename());
            inputStreamToFile(inputStream, file);
            inputStream.close();
        }
        return file;
    }

    /**
     * write input stream to file
     * @param inputStream input stream
     * @param file file
     */
    private static void inputStreamToFile(InputStream inputStream, File file) {
        try {
            OutputStream outputStream = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
            outputStream.close();
            inputStream.close();
        } catch (Exception e) {
            log.error("write input stream to file exception", e);
        }
    }

    /**
     * delete local temporary file
     * @param file local file
     */
    public static void deleteTempFile(File file) {
        if (null == file) return;
        file.delete();
    }

}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

message丶小和尚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值