Как работает функция AudioInputStream.read (byte [] b)? - PullRequest
0 голосов
/ 01 сентября 2018

У меня проблема с этим методом. Далее я написал тестовый код, который считывает аудиопоток в байтовый массив (и выполняет преобразование [у меня есть mp3plugin.jar в качестве внешнего jar, если вам интересно, почему это работает) и некоторые другие вещи, но у меня есть только пусть это сделает код исполняемым). Проблема в том, что метод не всегда выполняет одно и то же. Иногда AudioInputStream становится меньше, а иногда нет. У меня вопрос почему?

package doej.test;

import java.io.File;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;

public class Test2 {

    public static void main(String[] args) {
        @SuppressWarnings("unused")
        int totalFramesRead = 0;
        File fileIn = new File("D:/User/Music/eclipseTestfiles/test.mp3");
        try {
            AudioInputStream mp3Stream = AudioSystem.getAudioInputStream(fileIn);
            AudioFormat sourceFormat = mp3Stream.getFormat();
            AudioFormat convertFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, sourceFormat.getSampleRate(), 16, sourceFormat.getChannels(), sourceFormat.getChannels() * 2, sourceFormat.getSampleRate(), false);
            AudioInputStream converted = AudioSystem.getAudioInputStream(convertFormat, mp3Stream);
            int bytesPerFrame = converted.getFormat().getFrameSize();
            int numBytes = 1024 * bytesPerFrame;
            byte[] audioBytes = new byte[numBytes];
            try {
                int numBytesRead = 0;

                //My simplified Test part
                System.out.println(converted.available());

Хорошо, это оригинальный размер аудиопотока. (Пока здесь все нормально)

                System.out.println("read " + converted.read(audioBytes));
                System.out.println(converted.available());

Почему мой поток становится меньше? (в документации говорится, что он читает в массив, так что я немного понимаю эту часть)

                System.out.println("read " + converted.read(audioBytes));
                System.out.println(converted.available());

Почему мой поток не становится меньше, как это было в первый раз? (для этой части я понятия не имею)

                while ((numBytesRead = converted.read(audioBytes)) != -1) {
                    System.out.println(converted.available());

Почему означает , а поток становится меньше каждые одиннадцать раз ? (здесь я больше не понимаю мир)

                }
                //End of my test part

            } catch (Exception ex) {
            }
            System.out.println("finished");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Наконец, вот что я получаю:

6043688
read 4096
6035592
read 4096
6035592
6035592
6035592
6035592
6035592
6035592
6035592
6035592
6035592
6035592
6029324
6029324
6029324
[...]
4444
4444
4444
0
0
0
0
0
0
0
0
0
0
0
0
finished

Спасибо за вашу помощь.

John

...