Java - MP3 декодирование и сохранение его в массив байтов - PullRequest
1 голос
/ 29 ноября 2011

У меня проблема с декодированием звука. У меня есть библиотека SPIMP3 для декодирования mp3, и я пытаюсь декодировать mp3 и сохранять их в виде массива байтов.

Вот в чем дело, когда я пытаюсь декодировать 2-минутную mp3-песню, она дает мне, например, следующие байты:

[-1, 0, 42, -115, -45, 0, 14 ... и т. Д.].

Но когда я разрезаю этот mp3 пополам и пытаюсь декодировать первую половину, я получаю следующие байты:

[1, 0, 0, 65, -97, 135, -64, 32 ... и т. Д.]

Странно то, что они не совпадают. Единственное, что здесь отличается, это длина звука, но я декодирую первую часть обоих сэмплов mp3, которая одинакова.

Вот мой код:

public void testPlay(String mp3) {
    try {
        File file = new File(mp3);
        AudioInputStream in = AudioSystem.getAudioInputStream(file);
        AudioInputStream din = null;
        AudioFormat baseFormat = in.getFormat();
        AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
                baseFormat.getSampleRate(),
                16,
                baseFormat.getChannels(),
                baseFormat.getChannels() * 2,
                baseFormat.getSampleRate(),
                false);
        din = AudioSystem.getAudioInputStream(decodedFormat, in);

        play(decodedFormat, din);
        spi(decodedFormat, in);
        in.close();
    } catch (Exception e) {
        System.out.println("MP3");
    }

}

private void play(AudioFormat targetFormat, AudioInputStream din) throws IOException, LineUnavailableException {

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    byte[] data = new byte[4096];
    SourceDataLine line = getLine(targetFormat);

        int nBytesRead = 0, nBytesWritten = 0;
        while (nBytesRead != -1) {
            nBytesRead = din.read(data, 0, data.length);
            if (nBytesRead != -1) {
                nBytesWritten = line.write(data, 0, nBytesRead);
                out.write(data, 0, 4096);
            }

        }

       byte[] audio = out.toByteArray();

}

Это что-то ожидать или есть проблема в моем коде ???

Как я могу изменить свой код, чтобы получить те же байты для соответствующей части моего mp3?

Спасибо.

1 Ответ

3 голосов
/ 14 декабря 2011

эта строка должна быть:

out.write(data, 0, nBytesRead);
...