2

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
            }
        }
4

1 に答える 1

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 サンプルの長さになります。

于 2013-04-24T16:29:42.623 に答える