2013-04-24 4 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

+0

Спасибо за ваш ответ. Это может быть, но возможно, что нет никаких входных данных при захвате аудио? На мой взгляд, в целевой строке данных есть вход EVERYTIME, так что этого не может быть, или? – Phil123

ответ

1

Я рекомендую прочитать связанную статью. В нем рассказывается о различных способах использования Java в режиме реального времени. Есть не только аспекты из-за прерываний от сбора мусора и временного сращивания через параллельные потоки, выполняемые JVM, но код может занять разные промежутки времени для выполнения в зависимости от того, интерпретируется ли он или находится в памяти.

«В РЕЖИМЕ РЕАЛЬНОГО ВРЕМЕНИ, LOW LATENCY ОБРАБОТКА ЗВУКА В JAVA» http://quod.lib.umich.edu/cgi/p/pod/dod-idx?c=icmc;idno=bbp2372.2007.131

Если вы хотите, чтобы получить именно 10 мс, лучший способ для подсчета образцов. Вы знаете частоту дискретизации своего ввода, да? Если бы это было 44100 кадров в секунду, 10 мсек был бы 441 проб длиной.