使用JLayer播放MP3时指定以毫秒为单位的开始/停止时间

时间:2009-06-30 16:39:35

标签: java audio mp3 jlayer

我需要在我的java代码中播放MP3文件的一部分。我希望通过一个以毫秒为单位接受开始和停止时间的函数来做到这一点。

JLayer包含一个名为AdvancedPlayer的类,它有一个接受帧中起始位置和停止位置的方法:

/**
 * Plays a range of MPEG audio frames
 * @param start The first frame to play
 * @param end       The last frame to play 
 * @return true if the last frame was played, or false if there are more frames.
 */
public boolean play(final int start, final int end) throws JavaLayerException
{
    boolean ret = true;
    int offset = start;
    while (offset-- > 0 && ret) ret = skipFrame();
    return play(end - start);
}

根据this,框架持续26毫秒。但是我需要比这更精细的控制,即我可能希望从40毫秒到50毫秒。

我该怎么做?我需要先将MP3转换为.wav吗?

2 个答案:

答案 0 :(得分:1)

我最后使用的解决方案是首先编写代码来播放波形文件的一部分(即从xxx ms到xxx ms),因为我还需要支持这种文件格式。这是代码:

File soundFile = new File(this.audioFilePath);
AudioInputStream originalAudioInputStream = AudioSystem.getAudioInputStream(soundFile);
AudioFormat audioFormat = originalAudioInputStream.getFormat();

float startInBytes = (startTimeinMs / 1000 * audioFormat.getSampleRate() * audioFormat.getFrameSize());
float lengthInFrames = ((endTimeinMs - startTimeinMs) / 1000 * audioFormat.getSampleRate());

originalAudioInputStream.skip((long) startInBytes);
AudioInputStream partAudioInputStream = new AudioInputStream(originalAudioInputStream,
                originalAudioInputStream.getFormat(), (long) lengthInFrames);

// code to actually play the audio input stream here

一旦这个工作,我编写了这段代码,将MP3转换为临时波形文件(我可以使用上面的代码) - 这是使用JLayer和MP3SPI。我确实尝试直接在转换后的音频流上执行上述操作,而无需先写入文件但无法使其工作。我只使用可立即转换/写出的小型MP3文件,所以我对这个解决方案很满意。

File soundFile = new File(this.inputFilePath);
AudioInputStream mp3InputStream = AudioSystem.getAudioInputStream(soundFile);
AudioFormat baseFormat = mp3InputStream.getFormat();
AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,  baseFormat.getSampleRate(),  16, baseFormat.getChannels(), baseFormat.getChannels() * 2,  baseFormat.getSampleRate(), false);

AudioInputStream convertedAudioInputStream =  AudioSystem.getAudioInputStream(decodedFormat, mp3InputStream);

File outputFile = new File(this.outputFilePath);
AudioSystem.write(convertedAudioInputStream, AudioFileFormat.Type.WAVE, outputFile);

答案 1 :(得分:0)

如果26毫秒是您在MP3文件中可以达到的最佳分辨率,那么您就不走运了。将其转换为WAV可能有效,但源数据(即MP3)stil具有基本的分辨率限制。

出于好奇,你为什么要播放10毫秒的音频?