【问题标题】:Calculate duration of media files such as mp3/wav programmatically using java使用 java 以编程方式计算媒体文件(如 mp3/wav)的持续时间
【发布时间】:2022-01-03 15:23:18
【问题描述】:

使用 java 以编程方式获取媒体文件的持续时间。文件格式仅限于 mp3wav

【问题讨论】:

    标签: java audio duration


    【解决方案1】:

    找了很久,找到了两种计算mp3和wav文件时长的方法。 对于 wav 文件:

    public static double getDurationOfWavFile(String filename){
        logger.debug("getDuration (wav) -- filename: " + filename);
        File file = null;
        double durationInSeconds=0;
        try {
            file = new File(filename);
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
            AudioFormat format = audioInputStream.getFormat();
            long frames = audioInputStream.getFrameLength();
            durationInSeconds = (frames+0.0) / format.getFrameRate();
    
        } catch (Exception ex) {
            logger.error(ex.getMessage());
        }
        return durationInSeconds;
    }
    

    很遗憾,此方法不适用于 mp3 文件。从该 URL 可以看到MPEG Audio Frame Header 信息。通过执行此answer 中指定的计算,可以计算出mp3 媒体时长。但是有一种更简单的方法是使用 java 库。图书馆链接是jlayer-1.0.1.4.jar。这个库可以从 mp3 文件计算持续时间,但不能从 wav 文件计算。我还尝试使用 python 脚本和库 gtts 将 wav 文件转换为 mp3。但是转换后的 mp3 无法给出正确的持续时间。因此,对于 wav 文件,上述代码表现最佳。对于 mp3 文件,下面的代码可能很有用:

    public static float getDuration(String filename){
        logger.debug("getDuration (mp3) -- filename: " + filename);
        Bitstream bitstream;
        Header h = null;
        FileInputStream file = null;
        try {
            file = new FileInputStream(filename);
        } catch (FileNotFoundException ex) {}
        bitstream = new Bitstream(file);
        try {
            h = bitstream.readFrame();
        } catch (BitstreamException ex) {}
        int size = h.calculate_framesize();
        float ms_per_frame = h.ms_per_frame();
        int maxSize = h.max_number_of_frames(10000);
        float t = h.total_ms(size);
        long tn = 0;
        try {
            tn = file.getChannel().size();
        } catch (IOException ex) {}
        int min = h.min_number_of_frames(500);
        return h.total_ms((int) tn)/1000;
    }
    

    我没有尝试任何其他格式。我希望这个答案能解决你的问题。

    【讨论】:

    • 你试过MediaMetadataRetriever类吗? developer.android.com/reference/android/media/…
    • 我没试过。但我认为它仅适用于android。如果你想用纯 Java 编写代码,这是我找到的方式。
    • 这是一个 15 年左右的众所周知的答案 - 我不知道你在这里运行什么方案 - 我知道核心 Java 中没有人使用“位图” - 现在如果你要现在对待 aac 那将是一件好事!
    • 我公司有。我无法从其他问题中找到合适的答案。这就是我思考的原因。你正在运行什么计划?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 2011-12-18
    • 2011-08-11
    相关资源
    最近更新 更多