Как работает функция AudioInputStream.read(byte[] b)?
У меня проблема с этим методом. Далее я написал тестовый код, который считывает аудиопоток в байтовый массив (и выполняет преобразование [у меня есть 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
Спасибо за вашу помощь.
Джон