簡體   English   中英

使用JLayer播放MP3時以毫秒為單位指定開始/停止時間

[英]Specifying start/stop time in millisecs when playing MP3 using 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);
}

根據這個 ,一幀持續26millisecs。 但是我需要比這更好的控制度,即我可能希望從40毫米玩到50毫米玩。

我怎樣才能做到這一點? 我需要先將MP3轉換為.wav嗎?

最后,我使用的解決方案是首先編寫代碼以播放wave文件的一部分(即,從xxx毫秒到xxx毫秒),因為我也需要對此文件格式的支持。 這是該代碼:

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轉換為臨時wave文件(然后可以與上面的代碼一起使用)-這是使用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);

如果26毫秒是您在MP3文件中可以達到的最佳分辨率,那么您就不走運了。 將其轉換為WAV可能可行,但是源數據(即MP3)stil具有該基本分辨率限制。

出於好奇,您為什么要播放價值10毫秒的音頻?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM