【问题标题】:Java: time to read sound from TargetDataLine and write to ByteArrayOutPutStream different sometimesJava:有时从 TargetDataLine 读取声音并写入 ByteArrayOutPutStream 的时间不同
【发布时间】:2013-04-24 08:58:47
【问题描述】:

我有一个线程,我从 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
            }
        }

【问题讨论】:

  • read() :从此输入流中读取一个字节的数据。如果还没有可用的输入,则此方法阻塞
  • 感谢您的回答。可能是这样,但是捕获音频时可能没有任何输入可用?在我看来,在目标数据行中,每次都有输入,所以这不可能,或者?

标签: java timer capture javasound bytearrayoutputstream


【解决方案1】:

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

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

如果您希望精确到 10 毫秒,最好的方法是对样本进行计数。您知道输入的采样率,是吗?如果是 44100 fps,则 10 毫秒将是 441 个样本。

【讨论】:

    猜你喜欢
    • 2018-03-20
    • 2020-03-11
    • 2021-04-16
    • 2014-10-06
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2022-10-14
    相关资源
    最近更新 更多