2012-03-17 128 views
2

如何使用java代碼控制麥克風開關功能?我需要控制麥克風開啓的時間。 我試圖在Java中使用下面的代碼:硬件麥克風控制

final AudioFormat format = getFormat();//getformat() has the audio format 
    DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); 
    final TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info); 

    line.open(format);       //open mic for input 
line.start(); 
    byte[] buffer = new byte[1048576]; 
OutputStream out = new ByteArrayOutputStream();//output the audio to buffer 
boolean running = true; 

    try { 
     while (running) { 
     int count = line.read(buffer, 0, buffer.length); 
     running=false; 
      if (count > 0) { 
      out.write(buffer, 0, count);    
      } 
     } 
      out.close();        

    } catch (IOException e) { 
    System.out.println("Error"); 
     System.err.println("I/O problems: " + e); 
     System.exit(-1); 
      } 

但是這基本上取決於緩衝區的大小。而循環可以輸入30secs每音頻音頻。 我需要僅爲10secs採樣輸入。 任何幫助?謝謝。:)

+0

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。另外,請爲代碼塊使用一致的邏輯縮進。 – 2012-03-17 13:16:05

回答

1

看來你試圖通過緩衝區的大小來控制麥克風的持續時間。我很確定這不是常見的做法。通常情況下,人們使用的緩衝區大小隻有一秒(保持延遲較低),並反覆遍歷它。要控制開放式讀取或回放操作的持續時間,更改「running」布爾值的值通常更爲常見。

因此,從循環外部,代碼更新「運行」布爾值,並且當循環注意到有一個請求停止時,讀取循環結束。

我不明白如何獲得許可打開麥克風。我知道java的聲音教程談論它。

http://docs.oracle.com/javase/tutorial/sound/capturing.html

在他們的例子,它們使用一個布爾「已停止」來控制何時結束記錄循環。

+0

明白了..謝謝.. :)假設我通過麥克風在較小的緩衝區中接收數據流。我需要處理這些數據以查找頻率。但是當我處理數據時,有沒有一種方法可以保持麥克風仍然接收並繼續接收另一組數據? – sumit 2012-03-19 12:14:45

+1

如果處理速度很快,您可以在while循環內完成處理。或者,您可以將輸出定向到分析同時發生的另一行和線程。通常,上面的代碼將在其自己的線程中,以免阻塞其他活動。 – 2012-03-19 18:30:53

+0

由於FFT相當長的處理..會做第二個選項..謝謝.. :) – sumit 2012-03-19 20:50:02