java 中 100 毫秒的音频帧。

Audio Framing of 100 ms in java.

我想从音频文件中获取 100 毫秒的音频帧。我使用下面的代码获取帧,但我只在几个起始帧中获取数据。我不太了解 java 中的音频文件处理。请帮助我并指导我。我是对的,或者有些事情是错的。抱歉我的英语不好。

    public static void main(String[] args) throws UnsupportedAudioFileException, IOException {
    byte[] audioBytes;
    File file = new File("3.wav");
    AudioInputStream frame;
    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
    AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(file);
    AudioFormat format = fileFormat.getFormat();
    long audioFileLength = file.length();
    int frameSize = format.getFrameSize();
    double frameRate =  format.getFrameRate();
    int frameDuration = 10;
    double frameLength =   (  (frameRate * frameSize) / frameDuration );
    double numOfFrames =  (audioFileLength /frameLength);
    long remaining = audioFileLength;
    long framesOfAudioToCopy =  (long) ( format.getFrameRate() / frameDuration );
    System.out.println(framesOfAudioToCopy);
    int i = 0;
    while(remaining > frameLength  )
    {
        audioInputStream.skip((long) (i * frameLength));
        frame = new AudioInputStream(audioInputStream, format,  framesOfAudioToCopy );
        audioBytes = new byte[frame.available()];
        frame.read(audioBytes);
        System.out.println(Arrays.toString(audioBytes)); 
        i++;
        remaining  =  (long) (remaining - frameLength);
      /*  if(remaining < frameLength)
        {
            i++;
            audioInputStream.skip((long) (i * frameLength));            
            frame = new AudioInputStream(audioInputStream, format,  framesOfAudioToCopy );          
            audioBytes = new byte[frame.available()];
            frame.read(audioBytes);                
        }*/
    }        
}

我认为您正在做很多不需要的额外工作。这是一个更简单的重写,它可以完成您所描述的(我认为):

int numBytesIn100Millis =
    ((int) (format.getFrameRate() / 10)) * format.getFrameSize();
byte[] buffer = new byte[numBytesIn100Millis];

for (;;) {
    int bytesRead = audioInputStream.read(buffer);
    if (bytesRead < 0)
        break;
    if (bytesRead < buffer.length)
        // this just fills the end of 'buffer' with 0s
        // if read() didn't fill the entire array
        Arrays.fill(buffer, bytesRead, buffer.length, ((byte) 0));

    // 'buffer' now has 100ms of audio
}

您遇到的问题可能是由于您如何使用 skip 以及每次阅读时都创建了一个新的 AudioInputStream

audioInputStream.skip((long) (i * frameLength));
frame = new AudioInputStream(audioInputStream, format,  framesOfAudioToCopy );

frame 读取导致 audioInputStream 也得到提升。

无论如何,我看不出这样做的理由。这很复杂,也没有必要。