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

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 获取音频视频文件时长代码示例相关的知识,希望对你有一定的参考价值。

目录

一、github源码地址

二、支持音频、视频文件格式

  • 支持wav 、mp3、m4a、mov、mp4 格式文件

三、代码示例

  • pom.xml文件导入如下依赖包

    <!-- mp3文件支持(如语音时长)-->
    <dependency>
        <groupId>org</groupId>
        <artifactId>jaudiotagger</artifactId>
        <version>2.0.1</version>
    </dependency>
    
    <!-- mp4文件支持(如语音时长)-->
    <dependency>
        <groupId>com.googlecode.mp4parser</groupId>
        <artifactId>isoparser</artifactId>
        <version>1.1.22</version>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.3.7</version>
    </dependency>
    
  • 音频文件工具类

    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);
        
    
    
  • 音频文件时长输出结果
  • 视频文件时长输出结果

以上是关于java 获取音频视频文件时长代码示例的主要内容,如果未能解决你的问题,请参考以下文章

java 怎么获取音频文件时长

java获取音频文件播放时长

在java中怎么获取音频的总时长?

如何获取音频文件的准确时长,比如MP3

PHP获取音频mp3文件时长或音频文件其它参数属性

Flutter获取音频文件的时长