본문 바로가기

Actionscript3.0

[AS3.0] Microphone class (마이크를 이용한 작업)


Actionscript 3.0 에서는 Microphone 클래스를 이용한 마이크의 입출력 데이터를 불러서 작업할수 있는 기능을 제공하고 있다. 이번 졸업 작품에서 마이크를 이용한 사운드 스트리밍을 표현해려고 계획중이라, 공부한 내용을 포스팅 ~ (그다지 예제가 많이 없다)  

우선  일반 클래스와 다르게 Microphone 을 생성자가 없다 . 하지만 Microphone.getMicrophone() 을 이용하여 사용자 컴퓨터에서 검색된 사운드 입력 장치(마이크, 캠마이크 등등) 을 받아서 생성하게 된다.

 var mic:Microphone = Microphone.getMicrophone();

마이크가 연결이 안되있을때나 두개 이상의 마이크가 연결 되어  있을때에는 Microphone.names 속성을 사용하여 지정해줄수 있다.

(연결 안되어 있을때는 names 에서 반환되는 배열이 0 일 것이다.)  

 //swf 가 실행 되고 액서스를 허용 또는 거부를 하면  StatusEvent 가 발생하여 판단한다.
 
  1. import flash.media.Microphone;
  2.  
  3. var mic:Microphone = Microphone.getMicrophone();
  4. mic.addEventListener(StatusEvent.STATUS, this.onMicStatus);
  5.  
  6. function onMicStatus(event:StatusEvent):void
  7. {
  8.     if (event.code == "Microphone.Unmuted")
  9.     {
  10.         trace("Microphone access was allowed.");
  11.     }
  12.     else if (event.code == "Microphone.Muted")
  13.     (
  14.          trace("Microphone access was denied.");
  15.     }
  16. }

 

마이크 입력값 스피커로 듣기

setLoopBack 을 이용하면 마이크로 들어온 값을 로컬 스피커를 통해 들을수 있다. 이때 마이크의 사운드가 스피커로 옮겨 지게 되면 오디오 피드백 루프를 만들어 커다란 빽 소리를 일으키고 잠재적으로 사운드 하드웨어의 손상을 가져 올수 있다고 한다. 이를 방지하는 방법은 Microphone.setUseEchoSuppression(true) 를 setLoopBack 전에 호출하는 방법이다.

  1. var mic:Microphone = Microphone.getMicrophone();
  2. mic.setUseEchoSuppression(true);
  3. mic.setLoopBack(true);
마이크 활동 감지
Flash player 는 마이크가 사운드를 전송하지 않는 때는 감지 하려고 한다. 마이크에 들어 오는 값이 일정
시간 동안 묵음 값 미만을 유지하면 FlashPlayer 에서는 입력전송을 중지 하고 ActivityEvent를 발생시킨다.
 
 
  • 읽기 전용 activityLevel 속성은 마이크가 감지하는 사운드의 양을 0~100의 등급으로 나타냅니다.
  • silenceLevel 속성은 마이크 활성화에 필요한 사운드의 양을 지정하고 ActivityEvent.ACTIVITY 이벤트를 전달합니다. silenceLevel 속성도 0~100의 등급을 사용하고 기본값은 10입니다.
  • silenceTimeout 속성은 마이크가 현재 사용 중이지 않음을 알리기 위해 ActivityEvent.ACTIVITY 이벤트가 전달될  때까지 활동 레벨이 묵음 수준 미만을 유지해야 하는 시간을 밀리초 단위로 정의합니다. 기본 silenceTimeout 값은 2000입니다.
 
위에서 말했듯이 ActivityEvent 는 Flash Player 에서 마이크에서 세션이 시작되거나 종료될 때 전달된다.
이때 시작과 종료의 기준이 되는것이 silenceLevel 이다. 우선 알아 둬야 할것중 하나는 Microphone.silenceLevel
속성과 Microphone.silenceTimeout 속성은 읽기 전용이지만 Microphone.setSilenceLevel() 메서드를 사용하여
이 값을 변경할 수 있다. 이를 이용해서 silenceLevel 변수를 조작하여 ActiveEvent를 통해 활성화 상태를 체크
하고, 오디오 데이터를 수집한다. ( 매개변수가 0 으로 설정하면 사운드가 감지되지 않더라도 마이크의 활성상태를
유지하고, 반대로 100으로 설정하면 마이크가 전혀 활성화되지 않는다.)
 
 
  1. import flash.events.ActivityEvent;
  2. import flash.events.StatusEvent;
  3. import flash.media.Microphone;
  4.  
  5. var deviceArray:Array = Microphone.names;
  6. trace("Available sound input devices:");
  7. for (var i:int = 0; i < deviceArray.length; i++)
  8. {
  9.     trace("   " + deviceArray[i]);
  10. }
  11.  
  12. var mic:Microphone = Microphone.getMicrophone();
  13. mic.gain = 60;
  14. mic.rate = 11;
  15. mic.setUseEchoSuppression(true);
  16. mic.setLoopBack(true);
  17. mic.setSilenceLevel(5, 100);
  18.    
  19. mic.addEventListener(ActivityEvent.ACTIVITY, this.onMicActivity);
  20. mic.addEventListener(StatusEvent.STATUS, this.onMicStatus);
  21.    
  22. var micDetails:String = "Sound input device name: " + mic.name + '\n';
  23. micDetails += "Gain: " + mic.gain + '\n';
  24. micDetails += "Rate: " + mic.rate + " kHz" + '\n';
  25. micDetails += "Muted: " + mic.muted + '\n';
  26. micDetails += "Silence level: " + mic.silenceLevel + '\n';
  27. micDetails += "Silence timeout: " + mic.silenceTimeout + '\n';
  28. micDetails += "Echo suppression: " + mic.useEchoSuppression + '\n';
  29. trace(micDetails);
  30.  
  31. function onMicActivity(event:ActivityEvent):void
  32. {
  33.     trace("activating=" + event.activating + ", activityLevel=" +
  34.         mic.activityLevel);
  35. }
  36.  
  37. function onMicStatus(event:StatusEvent):void
  38. {
  39.     trace("status: level=" + event.level + ", code=" + event.code);
  40. }
 
여기서 궁금한점은 mic.setSilenceLevel(5, 100); 에서 첫번째 매개변수 값을 0 으로 했을때는 ActiveEvent가 생성
이 안된다는점이다. 원래 이런 구조로 만들었겠지만, 0으로 설정하여 데이터를 계속 받아 올수 있는 상태 라면 어떤 이벤트를
호출하여 activityLevel 을 받아 올수 있을까? enterframe? Timer? 아....
 
Timer 로 받아 오는게 그나마 효율적일듯 싶다. 흠 좀더 사운드 activityLevel 을 세분화 할수 있는 방법을 찾아 봐야 겠다.

'Actionscript3.0' 카테고리의 다른 글

CustomTextMotion + MotionCapture  (0) 2008.12.11
[AS3.0] Sound Spectrum  (0) 2008.12.11
[AS3.0] flash.media.Sound 기본내용정리.  (0) 2008.12.11