gpt4 book ai didi

Java:有时从 TargetDataLine 读取声音和写入 ByteArrayOutPutStream 的时间不同

转载 作者:行者123 更新时间:2023-11-30 11:33:12 25 4
gpt4 key购买 nike

我有一个线程,我从 TargetDataLine(麦克风)读取数据并将其写入 ByteArrayOutputStream。我有一个小“计时器”,因为我想录制 10 毫秒的声音,然后将捕获的数据传递给另一个对象。到目前为止没有问题,此代码捕获 10 毫秒的音频并传递数据。但有时,while 循环需要大约 130 毫秒……有人知道为什么会这样吗?这是我的代码:

while (true) {
byte tempBuffer[] = new byte[2];
try {
byteArrayOutputStream = new ByteArrayOutputStream();
start = System.nanoTime();

double recording = System.nanoTime();
// Get microphone input
while (System.nanoTime() - start <= 10 * 1000000) {
int count = targetDataLine.read(tempBuffer, 0,
tempBuffer.length);

if (count > 0) {
byteArrayOutputStream.write(tempBuffer, 0, count);
}
}

byteArrayOutputStream.close();

LLCapturedData.push(byteArrayOutputStream.toByteArray());

byteArrayOutputStream.flush();

// Tell observers, that input is captured
setChanged();
notifyObservers();
} catch (Exception e) {
// TODO
}
}

最佳答案

我建议阅读链接的文章。它讨论了 Java 使“实时”音频变得困难的各种方式。由于垃圾收集中断和 JVM 通过并行线程进行的时间拼接,不仅有一些方面,而且代码可能需要不同的时间来执行,具体取决于它是被解释还是在内存中。

“用 JAVA 进行实时、低延迟的音频处理” http://quod.lib.umich.edu/cgi/p/pod/dod-idx?c=icmc;idno=bbp2372.2007.131

如果你想得到精确的 10 毫秒,最好的方法是对样本进行计数。您知道输入的采样率,是吗?如果它是 44100 fps,10 毫秒就是 441 个样本长。

关于Java:有时从 TargetDataLine 读取声音和写入 ByteArrayOutPutStream 的时间不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16187711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com