2012-03-17 127 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