2013-04-24 53 views
1

我有一個線程在那裏我從TargetDataLine的(麥克風)讀取數據並將其寫入到一個ByteArrayOutputStream。我有一個「計時器」,因爲我想記錄聲音10毫秒,然後將捕獲的數據傳遞給另一個對象。目前沒有任何問題,此代碼捕捉音頻10毫秒並傳遞數據。但有時候,while循環需要〜130毫秒......任何人都知道爲什麼會發生這種情況?這裏是我的代碼:Java的:時間從TargetDataLine的聲音讀出和寫入ByteArrayOutPutStream不同有時

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 
      } 
     } 
+0

'read()':從該輸入流中讀取一個字節的數據。如果沒有輸入可用,則此方法**阻止**。 – NINCOMPOOP 2013-04-24 09:02:23

+0

感謝您的回答。這可能是,但是捕捉音頻時可能沒有任何輸入可用。在我看來,在目標數據行中輸入EVERYTIME,所以這不可能,或者? – Phil123 2013-04-24 09:07:06

回答

1

我推薦閱讀鏈接的文章。它講述了Java使「實時」音頻困難的各種方式。不僅由於垃圾收集的中斷以及JVM執行的並行線程的時間拼接,而且代碼可能需要不同的時間來執行,這取決於它是被解釋還是在內存中。

「REAL-TIME,低延遲的音頻處理JAVA」 http://quod.lib.umich.edu/cgi/p/pod/dod-idx?c=icmc;idno=bbp2372.2007.131

如果你希望得到確切10毫秒,最好的辦法是統計樣本。你知道你輸入的採樣率,是嗎?如果它是44100 fps,則10msec將是441個樣本。