2012-03-17 3 views
2

자바 코드를 사용하여 마이크 켜기/끄기 기능을 제어하려면 어떻게해야합니까? 마이크가 켜져있는 시간을 조절해야합니다. 나는 자바에 다음 코드를 사용하여 시도 :하드웨어 마이크 컨트롤

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); 
      } 

을하지만 이것은 기본적으로 버퍼의 크기에 따라 달라집니다. 그리고 루프는 패스 당 30 초 동안 오디오를 입력 할 수 있습니다. 샘플 입력을 10 초 만에해야합니다. 어떤 도움? ?? 고마워. :)

+0

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. 또한 코드 블록에 일관되고 논리적 인 들여 쓰기를 사용하십시오. –

답변

1

당신은 버퍼의 크기를 통해 마이킹의 지속 시간을 제어하려는 것 같습니다. 나는 이것이 일반적인 관행이 아니라고 확신한다. 일반적으로 크기가 1 초 미만인 버퍼를 사용하여 대기 시간을 낮게 유지하고 반복적으로 반복합니다. 개방형 읽기 또는 재생 작업 기간을 제어하려면 "실행 중"부울 값을 변경하는 것이 더 일반적입니다.

따라서 루프 외부에서 코드는 "실행 중"부울을 업데이트하고 루프가 중지 요청이 있음을 감지하면 읽기 루프가 끝납니다.

마이크를 켰을 때 허락을 받았는지 아닌지에 관해서는 구체적이지 않습니다. 자바 사운드 튜토리얼이 그것에 대해 이야기하는 것을 알고 있습니다. 이들 예에서

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

, 그들은 부울는 기록 루프를 종료 할 때 제어 "정지"를 사용.

+0

잡았어 .. 고마워 .. :) 내가 작은 버퍼에서 마이크를 통해 데이터 스트림을 가져 간다고 가정 해보자. 주파수를 찾기 위해 그 데이터를 처리해야합니다. 그러나 데이터를 처리 할 때 마이크가 여전히 남아 있고 다른 데이터 집합을 계속 수신하는 방법이 있습니까 ?? – sumit

+1

처리가 빠르면 while 회 돌이에서 처리 할 수 ​​있습니다. 또는 출력을 다른 라인으로 보내고 분석이 동시에 발생하는 곳으로 스레드 할 수 있습니다. 대개 위의 코드는 다른 활동을 차단하지 않도록 자체 스레드에 있습니다. –

+0

FFT로 인해 처리 시간이 오래 걸림 ... 두 번째 옵션을 사용합니다 .. 감사합니다 .. :) – sumit