AudioInputStream.read(byte [] b)函数如何工作?

时间:2018-09-01 15:39:29

标签: java arrays byte javax.sound.sampled audioinputstream

我对this方法有疑问。 在下面的代码中,我编写了一个将音频流读取到字节数组中的测试代码(并且是否进行了转换[我将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());

为什么 我的Stream 没有变小,如第一次? (因为这是我不知道的部分)

                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

感谢您的帮助。

约翰

0 个答案:

没有答案