问题
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..
回答1:
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();
}
}
}
回答2:
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.
回答3:
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).
来源:https://stackoverflow.com/questions/2709508/how-to-learn-wav-duration-in-java-media-frame-work