如何在Java媒体框架中学习.wav文件的时长?

4

我正在尝试使用Java媒体框架将.mov文件与.wav文件合并,因此我需要知道它们的持续时间。我该如何做?有什么想法可以提供吗?

3个回答

7
您可以使用这种方式(即VitalyVal的第二种方式)来学习声音文件的持续时间:
  import java.net.URL;

        import javax.sound.sampled.AudioFormat;
        import javax.sound.sampled.AudioInputStream;
        import javax.sound.sampled.AudioSystem;
        import javax.sound.sampled.Clip;
        import javax.sound.sampled.DataLine;

        public class SoundUtils {
            public static double getLength(String path) throws Exception {
                AudioInputStream stream;
                stream = AudioSystem.getAudioInputStream(new URL(path));
                AudioFormat format = stream.getFormat();
                if (format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
                    format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, format
                            .getSampleRate(), format.getSampleSizeInBits() * 2, format
                            .getChannels(), format.getFrameSize() * 2, format
                            .getFrameRate(), true); // big endian
                    stream = AudioSystem.getAudioInputStream(format, stream);
                }
                DataLine.Info info = new DataLine.Info(Clip.class, stream.getFormat(),
                        ((int) stream.getFrameLength() * format.getFrameSize()));
                Clip clip = (Clip) AudioSystem.getLine(info);
                clip.close();
                return clip.getBufferSize()
                        / (clip.getFormat().getFrameSize() * clip.getFormat()
                                .getFrameRate());
            }

            public static void main(String[] args) {
                try {

                    System.out
                            .println(getLength("..."));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

        }

5
我尝试了被接受的答案,但是在使用它时出现异常,我决定只用简单的方法来完成。
如果您拥有一些基本信息,您可以计算音频数据长度。主要要素包括:
- 采样率 - 每个采样的位数 - 文件大小 - 通道数(单声道/立体声)
如果您拥有这些信息,您就可以找到持续时间。Java非常好,因为它提供了库以最小的努力轻松检索所有这些信息。方程如下所示:
采样率 x 每个采样的位数 x 持续时间 x 通道数 = 文件大小
请参见以下代码,在Java中执行此计算:
public static double getDurationOfWavInSeconds(File file)
{   
    AudioInputStream stream = null;

    try 
    {
        stream = AudioSystem.getAudioInputStream(file);

        AudioFormat format = stream.getFormat();

        return file.length() / format.getSampleRate() / (format.getSampleSizeInBits() / 8.0) / format.getChannels();
    }
    catch (Exception e) 
    {
        // log an error
        return -1;
    }
    finally
    {
        try { stream.close(); } catch (Exception ex) { }
    }
}

希望这能对某些人有所帮助!不过我只测试了WAV文件。

当音频处于压缩格式时,您需要使用@ibrahimyilmaz解决方案中显示的细节。例如,如果文件是MP3,则使用file.length()将是不正确的长度引用。 - metasim

1

我不熟悉Java媒体框架,但以下内容可能会有所帮助:

1)理论上,您可以从“fact”块中获取wav文件的持续时间。但我怀疑JMF是否直接访问该块。此外,该块可能包含不正确的值。

2)您可以通过知道音频数据大小(以字节为单位)和采样率(或比特率)来计算持续时间。


请您能否给一个具体的例子? - yasemin
1
很抱歉,我不确定你所说的“具体示例”是什么意思。正如我所说,我对JMF不熟悉。此外,关于第一点:你只需要阅读RIFF-WAV文件规范。至于第二点:持续时间(以秒为单位)=数据大小/块对齐/采样率。我想要告诉你的是,只有两种常见的方法可以在不解压缩的情况下确定wav文件的持续时间。 - VitalyVal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接