1

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によると、1 フレームは 26 ミリ秒続きます。ただし、これよりも細かい制御が必要です。つまり、40 ミリ秒から 50 ミリ秒まで再生したい場合があります。

これどうやってするの?最初に MP3 を .wav に変換する必要がありますか?

4

2 に答える 2

2

私が最後に使用した解決策は、このファイル形式のサポートも必要なため、最初に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);
于 2009-07-02T06:58:28.433 に答える
0

26 ミリ秒が MP3 ファイルで達成できる最高の解像度である場合、運が悪いことになります。WAV への変換はうまくいくかもしれませんが、ソース データ (つまり MP3) には依然としてその基本的な解像度の制限があります。

好奇心から、なぜ 10 ミリ秒分のオーディオを再生したいのでしょうか?

于 2009-06-30T19:27:18.573 に答える