使用TargetDataLine获取实时音频:缓冲区不会更改

时间:2017-11-12 07:42:48

标签: java multithreading audio

我有一些像这样的代码:

  byte tempBuffer[] = new byte[10000];

  //call sleep thread (how long specified by second parameter)
  //After sleep time is up it sets stopCapture to true
  AudioSleepThread ast = new AudioSleepThread(this, seconds);
  ast.start();

  while(!this.stopCapture) {
    //this method blocks
    int cnt = targetDataLine.read(tempBuffer, 0, tempBuffer.length);
    System.out.println(cnt);
    if (cnt>0) {
          // Subsequent requests must **only** contain the audio data.
          RequestThread reqt = new RequestThread(responseObserver, requestObserver, tempBuffer);
          reqt.start();
          //Add it to array list
          this.reqtArray.add(reqt);
    }
  }

我有一个tempBuffer,我一次存储10000个字节。每次我有10000字节的音频时,我会沿请求线程发送它来处理这块音频。我的问题是我不断向我的每个请求线程发送具有相同音频的相同缓冲区。

在我看来,应该发生的是targetDataLine将一次读取音频10000字节,并将包含音频不同部分的每个tempBuffers传递给每个请求线程。

也许我误解了TargetDataLine。

1 个答案:

答案 0 :(得分:0)

您只在循环之外创建tempBuffer一次。每次调用targetDataLine.read都会用新数据覆盖缓冲区的内容。除非您在RequestThread构造函数中复制缓冲区,否则会导致问题。您应该为每次读取合理地创建一个新的缓冲区:

while(!this.stopCapture) {
  byte tempBuffer[] = new byte[10000];
  //this method blocks
  int cnt = targetDataLine.read(tempBuffer, 0, tempBuffer.length);

您还必须注意read(您的cnt变量)返回的读取字节数。读取不保证填充缓冲区。