학습 내용

조 : 2조

작성자 : 김동영

작성일 : 2011. 5. 25

제목 : WindowsPhone7 음향 녹음&재생

 

스마트폰과 음향

WindowsPhone7에서는 Microsoft.Xna.Framework.Audio 네임스페이스의 클래스를 사용하여 휴대폰의 마이크로 음향을 녹음하고 스피커로 재생 할 수 있습니다. XNA 클래스지만 Silverlight 프로그램에서도 사용이 가능합니다.

Microsoft.Xna. Framework.Audio 네임스페이스의 클래스는 오디오 CD 및 Windows WAV 파일에 사용되는 방식과 동일한 표준 PCM 형식의 압축되지 않은 오디오 데이터를 처리합니다. PCM의 경우 아날로그 음향 진폭이 일정한 비율(일반적인 초당 샘플 수, 8000-48000)로 샘플링되고 각 샘플이 8비트 또는 16비트 값으로 저장됩니다. 특정 음향을 저장하는 데 필요한 공간은 재생 시간(초), 샘플 속도, 샘플당 바이트 수를 곱한 값이며 스테레오의 경우 다시 2를 곱합니다.

Silverlight 프로그램이 XNA 오디오 서비스를 사용할 때는 정적 FrameworkDispatcher.Update 메서드를 비디오 새로 고침 빈도와 거의 같은 속도로 호출해야 합니다. 이 속도는 Windows Phone 7의 경우 약 초당 30번에 해당합니다. 이를 수행하는 방법은 XNA 온라인 설명서에 있는 문서"Windows Phone 응용 프로그램에서 XNA Framework 이벤트 활성화"에 나옵니다.

 

음향 녹음

휴대폰의 마이크로 음향을 녹음하려면 Microphone 클래스를 사용하면 됩니다.

 

Microphone Members

Public Fields

 

이름

설명

 

Name

마이크의 이름을 반환합니다

 

 

Public Properties

 

이름

설명

Static

All

모든 현재 사용 가능한 마이크의 컬렉션을 반환합니다.

 

BufferDuration

마이크의 오디오 캡처 버퍼 기간을 설정하거나 가져옵니다.

Static

Default

기본 연결된 마이크를 반환합니다.

 

IsHeadset

유선 헤드셋이나 블루투스 장치를 확인합니다.

 

SampleRate

오디오 데이터를 캡처하는 샘플 속도를 반환합니다.

 

State

마이크 개체의 녹음 상태를 반환합니다

 

 

Public Methods

 

이름

설명

 

GetData

마이크에서 기록 된 최신 데이터를 가져옵니다.

 

GetSampleDuration

버퍼의 크기를 기반으로 하는 오디오의 재생 시간을반환합니다.    

 

GetSampleSizeInBytes

마이크 개체에 대한 오디오의 지정된 기간을 잡고 하는데 필요한 바이트 배열의 크기를 반환합니다.

 

Start

마이크 오디오 캡처를 시작합니다.

 

Stop

마이크 오디오 캡처를 중지합니다.

 

 

Public Events

 

이름

설명

 

BufferReady

오디오 캡처 버퍼를 처리할 준비가 되면 발생

 

 

 

 

mic = Microphone.Default;

정적 Default 속성으로 클래스의 인스턴스를 생성합니다.

 

샘플 속도는 고정되있어 변경할 수 없으며 SampleRate 속성은 초당 샘플 수 16,000을 반환합니다. Nyquist 샘플 정리에 따르면 이 속도는 8,000Hz 주파수까지의 음향에 적합합니다. 즉, 음성의 경우에는 괜찮지만 음악의 경우에는 크게 기대하지 않는 것이 좋답니다. 각 샘플은 2바이트 길이의 모노이며 녹음된 음향은 초당 32,000바이트, 분당 1.9MB공간을 차지합니다.

 

 

마이크 데이터는 바이트 배열인 버퍼를 통해 프로그램에 제공됩니다.

 

mic.BufferReady += new EventHandler<EventArgs>(mic_BufferReady);
mic.Start();

BufferReader 이벤트에 대한 처리기를 설치하고 Start를 호출하여 녹음을 시작합니다.

 

 

int sampleSize = mic.GetSampleSizeInBytes(mic.BufferDuration);

byte[] _buf = new byte[sampleSize];

int data_size = mic.GetData(_buf);

Microphone 개체가 BufferReady 이벤트를 발생시키면 GetData를 호출합니다. GetData가 반환되면 버퍼에 PCM 데이터가 채워집니다. 프로그램에서 녹음을 중지하려면 GetData를 다시 호출하고 마지막 부분 버퍼를 얻으면 됩니다. 메서드는 배열로 전송된 바이트 수를 반환합니다. 그런 다음 Stop을 호출하면 됩니다.

 

Microphone에서 허용하는 유일한 옵션은 GetData 전달하는 버퍼의 바이트 크기를 지정하는 것입니다. BufferSize 속성은 100밀리초에서 1,000밀리초(1) 범위이며 10밀리초 단위로 지정하는 TimeSpan 값입니다. Default값은 1초입니다.

 

 

 

음향 재생(wav)

Microsoft.Xna.Framework.Audio 네임스페이스의 SoundEffect SoundEffectInstance 클래스를 사용하면 미리 녹음된 음향을 재생할 있습니다. 정적 SoundEffect.FromStream 메서드에는 완전한 RIFF 헤더를 포함하는 표준 Windows WAV 파일을 참조하는 Stream 개체가 필요합니다.

WAV 파일이 아닌 원시 PCM 데이터로 작업하려면 SoundEffectInstance에서 파생되는 DynamicSoundEffectInstance 클래스를 사용해야 합니다. 클래스는 Microphone 클래스나 음악 신서사이저 프로그램과 같이 동적으로 오디오 파형을 생성하는 프로그램에 적합합니다.

DynamicSoundEffectInstance 생성자에는 샘플 속도와 채널 수를 지정해야 합니다. 마이크에서 생성한 데이터에 클래스를 사용하려는 경우 값을 일정한 값으로 유지하면 됩니다.

 

playback = new DynamicSoundEffectInstance(mic.SampleRate, AudioChannels.Mono);

반면에 동물 소리와 같은 복잡한 음향을 재생하려면 번째 인수에 2 곱하면 됩니다. DynamicSoundEffectInstance에는 16비트 샘플 크기를 사용합니다. 클래스에는 재생을 제어하는 Play, Pause, Resume Stop 메서드와 현재 상태를 나타내는 State 속성이 있습니다. 클래스는 Microphone과는 거의 반대로 작동하며 버퍼가 필요하면 BufferNeeded 이벤트를 발생시킵니다. SubmitBuffer메소드에 위에서 얻은 PCM데이터(byte[]) 인자로 넘겨주시면 재생됩니다.

 

playback.SubmitBuffer(buffer);

playback.Play();

 

 

 

참고 : MSDN Magazine

 

 

[21기_김동영]_음향_녹음&amp;재생.docx

+ Recent posts