我有一些像这样的代码:
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。
答案 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
变量)返回的读取字节数。读取不保证填充缓冲区。