【问题标题】:Check audio file duration in java在java中检查音频文件的持续时间
【发布时间】:2016-02-10 03:41:28
【问题描述】:

我制作了一个 FileChooser 程序来获取 .wav 文件的文件路径,但现在我想添加另一个条件。我只想获取最多 5 分钟的 wav 文件的文件路径。我该怎么做呢?

【问题讨论】:

    标签: java jfilechooser filefilter


    【解决方案1】:

    如果您使用的是JAudioTagger ,您可以像下面这样简单地获得以秒为单位的准确持续时间。

    File target = new File("E:\\sample.wav");
    AudioFile af = AudioFileIO.read(target);
    AudioHeader ah = af.getAudioHeader();
    System.out.println( ah.getTrackLength());
    

    这是一个完整的示例代码

    import org.jaudiotagger.audio.AudioFile;
    import org.jaudiotagger.audio.AudioFileIO;
    import org.jaudiotagger.audio.AudioHeader;
    
    import java.io.File;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Locale;
    
    
    /**
     * Created by RAGINROSE on 9/20/2019.
     */
    
    public class AudioTest {
        public static void main(String[] args) {
    
                try {
    
                    SimpleDateFormat timeInFormat = new SimpleDateFormat("ss", Locale.UK);
                    SimpleDateFormat timeOutFormat = new SimpleDateFormat("mm:ss", Locale.UK);
                    SimpleDateFormat timeOutOverAnHourFormat = new SimpleDateFormat("kk:mm:ss", Locale.UK);
                    String duratin;
    
                    File target = new File("E:\\sample.wav");
                    AudioFile f = AudioFileIO.read(target);
                    AudioHeader ah = f.getAudioHeader();
    
                    long trackLength = (long)ah.getTrackLength();
    
                    Date timeIn;
                    synchronized(timeInFormat) {
                        timeIn = timeInFormat.parse(String.valueOf(trackLength));
                    }
                    if(trackLength < 3600L) {
                        synchronized(timeOutFormat) {
                            duratin =  timeOutFormat.format(timeIn);
                        }
                    } else {
                        synchronized(timeOutOverAnHourFormat) {
                            duratin = timeOutOverAnHourFormat.format(timeIn);
                        }
                    }
    
                    System.out.println("Duration in Integer : " + trackLength);
                    System.out.println("Duration in String : " +duratin);
    
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
    
        }
    }
    

    别忘了添加依赖

    <dependency>
        <groupId>net.jthink</groupId>
        <artifactId>jaudiotagger</artifactId>
        <version>2.2.3</version>
    </dependency>
    

    支持的格式是

    ogg、mp3、flac、mp4、m4a、m4p、wma、wav、ra、rm、m4b 和 aif

    希望这对某人有所帮助。

    【讨论】:

      【解决方案2】:

      您可以通过知道文件大小(以 MB 为单位)然后知道文件的比特率来做到这一点。跟我来看看这个 MP3 示例:

      MP3 Filesize: 3.89MBytes
      Bitrate: 128Kbits
      

      将 Mbytes 转换为 Kbits:

      3.89Mbytes * 1024 = 3983Kbytes
      3989Kbytes * 8 = 31866Kbits
      

      将 Kbits 转换为长度:

      31866Kbits / 128Kbits per second = 249 seconds
      249 seconds / 60 seconds = 4.19 Minutes
      

      请注意,它仍然不能准确表示持续时间,您必须考虑计算中的一些差异。

      【讨论】:

      • 没有更短的方法吗?像 getduration() 什么的?
      • 不,但是您可以使用我提供给您的数学创建自己的方法getDuration()
      • 我的意思是当然我可以通过 audioinputstream 获取音频的文件大小和比特率,但我想要的是仅通过文件路径获取音频的文件大小和比特率。但是怎么做呢?
      猜你喜欢
      • 2012-02-14
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      相关资源
      最近更新 更多