How to learn .wav duration in Java media frame wor

2019-05-13 16:57发布

I am tyring to merge an .mov file with a .wav file using java media framework, thus I need to know their duration. How can I do this? Any ideas would be appreciated..

标签: java audio wav jmf
3条回答
贪生不怕死
2楼-- · 2019-05-13 17:38

you can learn the duration of sound files using this way(that is VitalyVal's second way):

  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();
                }
            }

        }
查看更多
Emotional °昔
3楼-- · 2019-05-13 17:41

I tried the accepted answer, but after getting exceptions with it, I decided to just do it the simple way.

If you have a few basic pieces of information, you can figure audio data length. The main pieces are:

  • Sample rate
  • Sample size (bits per sample)
  • File size
  • Number of channels (mono/stereo)

If you have these, you can find out duration. Java is nice because it provides libraries to easily retrieve all of this information with minimal effort. Equation is below:

sample-rate * sample-size * duration * channel-count = file-size

See the code below that does this calculation in 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) { }
    }
}

Hope this helps someone out there! I've only tested it with WAV files, though.

查看更多
时光不老,我们不散
4楼-- · 2019-05-13 17:47

I am not familiar with java media framework, but probably the following will help:

1) Theoretically you can get duration of a wav file from the "fact" chunk. But I doubt, JMF give direct access to the chunk. Moreover the chunk can contain an incorrect value.

2) You can calculate duration, knowing audio data size (in bytes) and sample rate (or bitrate).

查看更多
登录 后发表回答