您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 3浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

java 获取音频、视频文件时长代码示例

小志的博客 发布时间:2022-08-21 21:24:52 ,浏览量:3

目录
    • 一、github源码地址
    • 二、支持音频、视频文件格式
    • 三、代码示例

一、github源码地址
  • 源码地址:https://github.com/opensourceteams/java-maven-project
二、支持音频、视频文件格式
  • 支持wav 、mp3、m4a、mov、mp4 格式文件 在这里插入图片描述
三、代码示例
  • pom.xml文件导入如下依赖包

    
    
        org
        jaudiotagger
        2.0.1
    
    
    
    
        com.googlecode.mp4parser
        isoparser
        1.1.22
    
    
        cn.hutool
        hutool-all
        5.3.7
    
    
  • 音频文件工具类

    package com.xz.thread.day2;
    import org.jaudiotagger.audio.AudioFileIO;
    import org.jaudiotagger.audio.mp3.MP3AudioHeader;
    import org.jaudiotagger.audio.mp3.MP3File;
    
    
    import javax.sound.sampled.AudioFormat;
    import javax.sound.sampled.AudioInputStream;
    import javax.sound.sampled.AudioSystem;
    import java.io.File;
    /**
     * @description:
     * @author: xz
     * @create: 2022-08-21
     */
    public class AudioUtil {
        /**
         * 获取语音文件播放时长(秒) 支持wav 格式
         * @param filePath
         * @return
         */
        public static Float getDuration(String filePath){
            try{
    
                File destFile = new File(filePath);
                AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(destFile);
                AudioFormat format = audioInputStream.getFormat();
                long audioFileLength = destFile.length();
                int frameSize = format.getFrameSize();
                float frameRate = format.getFrameRate();
                float durationInSeconds = (audioFileLength / (frameSize * frameRate));
                return durationInSeconds;
    
            }catch (Exception e){
                e.printStackTrace();
                return 0f;
            }
    
        }
    
        /**
         * 获取mp3语音文件播放时长(秒) mp3
         * @param filePath
         * @return
         */
        public static Float getMp3Duration(String filePath){
    
            try {
                File mp3File = new File(filePath);
                MP3File f = (MP3File) AudioFileIO.read(mp3File);
                MP3AudioHeader audioHeader = (MP3AudioHeader)f.getAudioHeader();
                return Float.parseFloat(audioHeader.getTrackLength()+"");
            } catch(Exception e) {
                e.printStackTrace();
                return 0f;
            }
        }
    
    
        /**
         * 获取mp3语音文件播放时长(秒)
         * @param mp3File
         * @return
         */
        public static Float getMp3Duration(File mp3File){
    
            try {
                //File mp3File = new File(filePath);
                MP3File f = (MP3File) AudioFileIO.read(mp3File);
                MP3AudioHeader audioHeader = (MP3AudioHeader)f.getAudioHeader();
                return Float.parseFloat(audioHeader.getTrackLength()+"");
            } catch(Exception e) {
                e.printStackTrace();
                return 0f;
            }
        }
    
    
        /**
         * 得到pcm文件的毫秒数
         *
         * pcm文件音频时长计算
         * 同图像bmp文件一样,pcm文件保存的是未压缩的音频信息。 16bits 编码是指,每次采样的音频信息用2个字节保存。可以对比下bmp文件用分别用2个字节保存RGB颜色的信息。 16000采样率 是指 1秒钟采样 16000次。常见的音频是44100HZ,即一秒采样44100次。 单声道: 只有一个声道。
         *
         * 根据这些信息,我们可以计算: 1秒的16000采样率音频文件大小是 2*16000 = 32000字节 ,约为32K 1秒的8000采样率音频文件大小是 2*8000 = 16000字节 ,约为 16K
         *
         * 如果已知录音时长,可以根据文件的大小计算采样率是否正常。
         * @param filePath
         * @return
         */
        public static long getPCMDurationMilliSecond(String filePath) {
            File file = new File(filePath);
    
            //得到多少秒
            long second = file.length() / 32000 ;
    
            long milliSecond = Math.round((file.length() % 32000)   / 32000.0  * 1000 ) ;
    
            return second * 1000 + milliSecond;
        }
    }
    
  • 视频文件工具类

    package com.xz.thread.day2;
    
    import com.coremedia.iso.IsoFile;
    
    import java.io.IOException;
    
    /**
     * @description:
     * @author: xz
     * @create: 2022-08-21
     */
    public class VideoUtil {
        /**
         * 获取视频文件的播放长度(mp4、mov格式)
         * @param videoPath
         * @return 单位为毫秒
         */
        public static long getMp4Duration(String videoPath) throws IOException {
            IsoFile isoFile = new IsoFile(videoPath);
            long lengthInSeconds =
                    isoFile.getMovieBox().getMovieHeaderBox().getDuration() /
                            isoFile.getMovieBox().getMovieHeaderBox().getTimescale();
            return lengthInSeconds;
        }
    
    
        /**
         * 得到语音或视频文件时长,单位秒
         * @param filePath
         * @return
         * @throws IOException
         */
        public static long getDuration(String filePath) throws IOException {
            String format = getVideoFormat(filePath);
            long result = 0;
            if("wav".equals(format)){
                result = AudioUtil.getDuration(filePath).intValue();
            }else if("mp3".equals(format)){
                result = AudioUtil.getMp3Duration(filePath).intValue();
            }else if("m4a".equals(format)) {
                result = VideoUtil.getMp4Duration(filePath);
            }else if("mov".equals(format)){
                result = VideoUtil.getMp4Duration(filePath);
            }else if("mp4".equals(format)){
                result = VideoUtil.getMp4Duration(filePath);
            }
    
            return result;
        }
    
        /**
         * 得到语音或视频文件时长,单位秒
         * @param filePath
         * @return
         * @throws IOException
         */
        public static long getDuration(String filePath,String format) throws IOException {
            long result = 0;
            if("wav".equals(format)){
                result = AudioUtil.getDuration(filePath).intValue();
            }else if("mp3".equals(format)){
                result = AudioUtil.getMp3Duration(filePath).intValue();
            }else if("m4a".equals(format)) {
                result = VideoUtil.getMp4Duration(filePath);
            }else if("mov".equals(format)){
                result = VideoUtil.getMp4Duration(filePath);
            }else if("mp4".equals(format)){
                result = VideoUtil.getMp4Duration(filePath);
            }
    
            return result;
        }
    
    
        /**
         * 得到文件格式
         * @param path
         * @return
         */
        public static String getVideoFormat(String path){
            return  path.toLowerCase().substring(path.toLowerCase().lastIndexOf(".") + 1);
        }
    }
    
  • 测试类

    package com.xz.thread.day2;
    
    import cn.hutool.core.date.DateUtil;
    import java.io.IOException;
    /**
     * @description:
     * @author: xz
     * @create: 2022-08-21
     */
    public class VideoUtilTest {
        public static void main(String[] args) {
            //音频路径
            //String path = "D:\\data\\audio.mp3" ;
            //视频路径
            String path = "D:\\data\\video.mp4" ;
            long result = 0;
            try {
                result = VideoUtil.getDuration(path);
            } catch (IOException e) {
                e.printStackTrace();
            }
            String time =DateUtil.secondToTime((int)result);
            System.out.println(time);
        }
    }
    
  • 音频文件时长输出结果 在这里插入图片描述
  • 视频文件时长输出结果 在这里插入图片描述
关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.3053s