actionscript™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업...

34
555 20 20 사운드를 사용한 작업 ActionScript대화식 몰입형 응용 프로그램을 만들 있습니다. 강력한 몰입형 응용 프로그 램에서 자주 간과되는 요소가 사운드인데 비디오 게임에 사운드 효과를 추가하거나, 응용 로그램 사용자 인터페이스에 오디오 피드백을 추가하거나, 인터넷에서 로드한 mp3 파일을 분석하는 프로그램을 만드는 사운드를 응용 프로그램에 중심적으로 활용할 있습니다. 장에서는 외부 오디오 파일의 로딩과 SWF포함된 오디오 관련 작업에 대해 설명합니 . 오디오 제어 방법, 사운드 정보의 시각적 표현 생성 방법, 마이크로부터 사운드를 캡처하 방법 등이 소개됩니다. 목차 사운드를 사용한 작업의 기초 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556 사운드 아키텍처의 이해 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558 외부 사운드 파일 로드 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560 포함된 사운드를 사용한 작업 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562 사운드 파일 스트리밍 작업 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564 사운드 재생 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564 사운드 로드 재생 시의 보안 고려 사항 . . . . . . . . . . . . . . . . . . . . 568 사운드 볼륨 패닝 제어. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 사운드 메타데이터를 사용한 작업 . . . . . . . . . . . . . . . . . . . . . . . . . . . 571 원시 사운드 데이터 액세스 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572 사운드 입력 캡처 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575 예제: Podcast Player . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580

Upload: others

Post on 29-Jan-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

555

20제 20 장

사운드를 사용한 작업

ActionScript로 화식 몰입형 응용 프로그램을 만들 수 있습니다. 강력한 몰입형 응용 프로그

램에서 자주 간과되는 요소가 사운드인데 비디오 게임에 사운드 효과를 추가하거나, 응용 프로그램 사용자 인터페이스에 오디오 피드백을 추가하거나, 인터넷에서 로드한 mp3 파일을

분석하는 프로그램을 만드는 등 사운드를 응용 프로그램에 중심적으로 활용할 수 있습니다.

이 장에서는 외부 오디오 파일의 로딩과 SWF에 포함된 오디오 관련 작업에 해 설명합니

다. 오디오 제어 방법, 사운드 정보의 시각적 표현 생성 방법, 마이크로부터 사운드를 캡처하

는 방법 등이 소개됩니다.

목차

사운드를 사용한 작업의 기초 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556사운드 아키텍처의 이해 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558외부 사운드 파일 로드 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560포함된 사운드를 사용한 작업 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562사운드 파일 스트리밍 작업 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564사운드 재생 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564사운드 로드 및 재생 시의 보안 고려 사항 . . . . . . . . . . . . . . . . . . . . 568사운드 볼륨 및 패닝 제어. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569사운드 메타데이터를 사용한 작업 . . . . . . . . . . . . . . . . . . . . . . . . . . . 571원시 사운드 데이터 액세스 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572사운드 입력 캡처 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575예제: Podcast Player. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580

Page 2: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

556 사운드를 사용한 작업

사운드를 사용한 작업의 기초

사운드를 사용한 작업 소개컴퓨터에서 이미지를 디지털 포맷으로 인코딩하여 저장하고 다시 불러와 표시할 수 있는 것처럼, 컴퓨터에서 디지털 오디오를 캡처하고 인코딩(사운드 정보의 디지털화)하여 저장한

후 다시 불러와서 컴퓨터에 연결된 스피커를 통해 재생할 수 있습니다. 사운드 재생 방법 중하나는 Adobe Flash Player 및 ActionScript를 사용하는 것입니다.

사운드 데이터가 디지털 형식으로 변환되면 사운드 볼륨과 스테레오 또는 모노 사운드 등의

다양한 특성이 생깁니다. ActionScript에서 사운드를 재생할 때 이러한 특성도 조정할 수 있습니다. 예를 들어, 사운드를 더 크게 하거나 특정 방향에서 사운드가 나오는 듯한 효과를 연출할 수 있습니다.

ActionScript에서 사운드를 제어하려면 먼저 사운드 정보를 Flash Player에 로드해야 합니다.ActionScript를 사용하여 작업할 수 있도록 오디오 데이터를 Flash Player에 로드하는 방법은

4가지가 있습니다. 첫째, 외부 사운드 파일(예: mp3 파일)을 SWF에 로드하거나 둘째, SWF파일을 만들 때 사운드 정보를 직접 SWF 파일에 포함하거나 셋째, 컴퓨터에 연결된 마이크

를 사용하여 오디오를 입력하거나 넷째, 서버에서 스트리밍한 사운드 데이터에 액세스할 수있습니다.

외부 사운드 파일로부터 사운드 데이터를 로드할 때는 나머지 사운드 데이터를 로드하는 중에도 사운드 파일의 시작 부분을 먼저 재생할 수 있습니다.

디지털 오디오를 인코딩하는 데 사용되는 사운드 파일 포맷은 다양하지만 ActionScript 3.0및 Flash Player는 mp3 포맷으로 저장된 사운드 파일을 지원합니다. WAV 또는 AIFF 등의 다른

포맷으로 된 사운드 파일은 직접 로드하거나 재생할 수 없습니다.

ActionScript에서 사운드 관련 작업을 하는 동안에는 flash.media 패키지의 몇 가지 클래스를 다루게 될 것입니다. Sound 클래스는 사운드 파일을 로드하고 재생을 시작하여 오디오 정보에

한 액세스 권한을 얻는 데 사용하는 클래스입니다. 사운드 재생을 시작하면 Flash Player 사용자에게 SoundChannel 객체에 한 액세스 권한이 부여됩니다. 로드한 오디오 파일은 사용

자의 컴퓨터에서 재생하는 몇 가지 사운드 중 하나일 수 있으므로 재생되는 각 개별 사운드는

자체의 SoundChannel 객체를 사용합니다. 함께 믹싱되는 모든 SoundChannel 객체의 조합된

출력은 컴퓨터 스피커를 통해 실제로 재생되는 사운드입니다. 이 SoundChannel 인스턴스를

사용하여 사운드의 속성을 제어하거나 재생을 중지할 수 있습니다. 마지막으로, 조합된 오디

오를 제어하려는 경우 SoundMixer 클래스를 통해 믹싱된 출력을 제어할 수 있습니다.

ActionScript에서 사운드 관련 작업을 할 때 기타 몇 가지 클래스를 사용하여 특정 작업을 수행할 수도 있습니다. 사운드 관련 클래스 전반에 한 자세한 내용은 558페이지의 “사운드

아키텍처의 이해”를 참조하십시오.

Page 3: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

사운드를 사용한 작업의 기초 557

사운드와 관련된 일반적인 작업이 장에서는 사용자가 수행할 다음과 같은 사운드 관련 작업에 해 설명합니다.

■ 외부 mp3 파일 로드 및 로드 진행률 추적

■ 사운드의 재생, 일시 정지, 다시 시작 및 중지

■ 로드하는 동안 스트리밍 사운드 재생

■ 사운드 볼륨 및 패닝 조작

■ mp3 파일에서 ID3 메타데이터 검색

■ 원시 사운드 웨이브 데이터 사용

■ 사용자의 마이크에서 사운드 입력 캡처 및 재생

중요한 개념 및 용어다음 참조 목록에는 이 장에 사용된 중요한 용어가 포함되어 있습니다.

■ 진폭: 사운드 파형의 한 점과 0 또는 기준선 사이의 거리입니다.■ 비트율: 사운드 파일의 초당 인코딩 또는 스트리밍된 데이터의 양입니다. mp3 파일의

경우 비트율은 보통 kbps(초당 킬로비트) 단위로 표현됩니다. 비트율이 높을수록 일반적

으로 음질이 좋습니다.■ 버퍼링: 사운드 재생 전에 사운드 데이터를 수신하여 저장하는 과정입니다.■ mp3: MPEG-1 Audio Layer 3, 즉 mp3는 널리 사용되는 사운드 압축 포맷입니다.■ 패닝: 스테레오 사운드 필드의 왼쪽과 오른쪽 채널 간에 오디오 신호를 지정하는 과정입

니다.■ 피크: 파형에서 가장 높은 위치입니다.■ 샘플링 속도: 디지털 신호를 만들기 위해 아날로그 오디오 신호로부터 추출한 초당 샘플링

수를 정의합니다. 표준 콤팩트 디스크 오디오의 샘플링 속도는 44.1kHz, 즉 44,100샘플

링/초입니다.■ 스트리밍: 사운드 파일 또는 비디오 파일의 뒷 부분을 서버에서 로드하는 동안, 이미 로드

된 앞 부분을 재생하는 프로세스입니다.■ 볼륨: 사운드의 크기입니다.■ 파형: 시간에 따른 사운드 신호의 진폭 변화를 나타내는 그래프 모양입니다.

Page 4: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

558 사운드를 사용한 작업

이 장의 예제를 사용하여 작업이 장의 내용을 따라 작업하면서 예제 코드 목록을 직접 테스트할 수 있습니다. 이 장은 ActionScript에서의 사운드 관련 작업을 다루므로, 부분의 예제가 사운드 파일 작업(파일 재생, 재생 중지, 사운드 조절 등)과 관련되어 있습니다. 이 장의 예제를 테스트하려면:

1. 새 Flash 문서를 만들고 컴퓨터에 저장합니다.2. 타임라인에서 첫 번째 키프레임을 선택하고 [액션] 패널을 엽니다.3. [스크립트] 창에 예제 코드 샘플을 복사합니다.4. 코드에서 외부 사운드 파일을 로드할 경우 다음과 같은 코드 행이 포함됩니다.

var req:URLRequest = new URLRequest("click.mp3");var s:Sound = new Sound(req);

여기서 “click.mp3”는 로드될 사운드 파일의 이름입니다. 이러한 예제를 테스트하려면 사용할 mp3 파일이 있어야 하며, 이 mp3 파일을 Flash 문서와 동일한 폴더에 넣어야 합니다.그런 다음, 코드의 이름을 코드 샘플에 있는 이름 신 mp3 파일 이름으로 바꿉니다. 예를

들어, 위의 코드의 경우 “click.mp3”라는 이름을 해당 mp3 파일의 이름으로 변경합니다.5. 주 메뉴에서 [컨트롤] > [무비 테스트]를 선택하여 SWF 파일을 만들고, 예제의 결과를

미리 보고 듣습니다.

일부 예제는 오디오 재생뿐만 아니라 trace() 함수를 사용하여 값을 나타내기도 합니다. 이러한 예제를 테스트할 경우 해당 값의 결과를 [출력] 패널에서 확인할 수 있습니다. 일부

예제는 내용을 스크린에 그리므로, 이러한 예제의 경우에는 해당 내용을 Flash Player 윈도우

에서도 볼 수 있습니다.

이 설명서의 예제 코드 샘플 테스트에 한 자세한 내용은 60페이지의 “이 장에 제시된 예제

코드 샘플 테스트”를 참조하십시오.

사운드 아키텍처의 이해응용 프로그램은 다음과 같은 4가지 소스로부터 사운드 데이터를 로드할 수 있습니다.

■ 런타임 시 로드된 외부 사운드 파일

■ 응용 프로그램의 SWF 파일에 포함된 사운드 리소스

■ 사용자의 시스템에 연결된 마이크로부터 입력된 사운드 데이터

■ Flash Media Server 등의 원격 미디어 서버로부터 스트리밍된 사운드 데이터

사운드 데이터는 완전히 로드된 후에 재생되거나 스트리밍(로드 중 재생)될 수 있습니다.

ActionScript 3.0 및 Flash Player는 mp3 포맷으로 저장된 사운드 파일을 지원합니다. WAV 또는 AIFF 등의 다른 포맷으로 된 사운드 파일은 직접 로드하거나 재생할 수 없습니다.

Page 5: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

사운드 아키텍처의 이해 559

Adobe Flash CS3 Professional을 사용하면 WAV 또는 AIFF 사운드 파일을 가져와서 이 파일을

mp3 포맷으로 사용자 응용 프로그램의 SWF 파일에 포함할 수 있습니다. Flash 제작 도구를

사용하면 포함된 사운드 파일을 압축하여 파일 크기를 줄일 수도 있습니다. 단, 파일 크기가

작아지면 사운드 품질이 저하됩니다. 자세한 내용은 Flash 사용 설명서의 “사운드 가져오기”를 참조하십시오.

ActionScript 3.0 사운드 아키텍처는 flash.media 패키지에 있는 다음 클래스를 사용합니다.

로드 및 재생되는 각 사운드에는 Sound 클래스 및 SoundChannel 클래스의 고유한 인스턴스가

필요합니다. 그리고 다중 SoundChannel 인스턴스의 출력이 재생 중에 전역 SoundMixer 클래스에 의해 함께 믹싱됩니다.

클래스 설명

flash.media.Sound Sound 클래스는 사운드의 로드를 처리하고 기본적인 사운드 속성을 관리하며 사운드 재생을 시작합니다.

flash.media.SoundChannel 응용 프로그램이 Sound 객체를 재생할 때는 새로운 SoundChannel 객체가 만들어져 재생을 제어합니다. SoundChannel 객체는 사운드의 왼쪽과 오른쪽 재생 채널의 볼륨을 제어합니다. 재생되는 각 사운드에는 자체

의 SoundChannel 객체가 있습니다.

flash.media.SoundLoaderContext SoundLoaderContext 클래스는 사운드를 로드할 때 사용할 버퍼링 시간(초)을 지정하고 파일을 로드할 때 서버에서 크로스 도메인 정책 파일을 찾을지 여부를 지정합

니다. SoundLoaderContext 객체는 Sound.load() 메서드에 대한 매개 변수로 사용됩니다.

flash.media.SoundMixer SoundMixer 클래스는 응용 프로그램의 모든 사운드와 관련된 보안 속성 및 재생을 제어합니다. 사실상, 다중 사운드 채널은 공통 SoundMixer 객체를 통해 믹싱되므로 SoundMixer 객체의 속성 값은 현재 재생되는 모든 SoundChannel 객체에 영향을 미칩니다.

flash.media.SoundTransform SoundTransform 클래스에는 사운드 볼륨과 패닝을 제어하는 값이 포함됩니다. SoundTransform 객체는 무엇보다 개별 SoundChannel 객체, 전역 SoundMixer 객체 또는 Microphone 객체에 적용될 수 있습니다.

flash.media.ID3Info ID3Info 객체에는 종종 mp3 사운드 파일에 저장되는 ID3 메타데이터 정보를 나타내는 속성이 포함됩니다.

flash.media.Microphone Microphone 클래스는 사용자의 컴퓨터에 연결된 마이

크 또는 기타 사운드 입력 장치를 나타냅니다. 마이크로부

터 입력된 오디오는 로컬 스피커나 원격 서버로 라우팅될 수 있습니다. Microphone 객체는 게인, 샘플링 속도 및 자체 사운드 스트림의 기타 특성을 제어합니다.

Page 6: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

560 사운드를 사용한 작업

Sound, SoundChannel, SoundMixer 클래스는 마이크를 통해 캡처한 사운드 데이터 또는 Flash Media Server 등의 스트리밍 미디어에서 캡처한 사운드 데이터에 사용되지 않습니다.

외부 사운드 파일 로드Sound 클래스의 각 인스턴스는 특정 사운드 리소스의 재생을 로드 및 트리거하기 위한 것입

니다. 응용 프로그램에서 Sound 객체를 다시 사용하여 둘 이상의 사운드를 로드할 수 없습니

다. 새로운 사운드 리소스를 로드하려면 새로운 Sound 객체를 만들어야 합니다.

작은 사운드 파일(예: 버튼에 연결될 클릭 사운드)을 로드하는 경우 응용 프로그램에서 새로

운 Sound를 만들어 아래와 같이 사운드 파일을 자동으로 로드할 수 있습니다.var req:URLRequest = new URLRequest("click.mp3");var s:Sound = new Sound(req);

Sound() 생성자는 URLRequest 객체를 첫 번째 매개 변수로 받습니다. URLRequest 매개 변수의 값이 제공되면 새로운 Sound 객체는 지정된 사운드 리소스를 자동으로 로드합니다.

아주 단순한 경우를 제외하고는 응용 프로그램은 사운드의 로드 진행률을 살피고 로드 중에

오류가 발생하지 않는지 확인해야 합니다. 예를 들어, 클릭 사운드의 용량이 꽤 큰 경우 사운

드를 트리거하는 버튼을 사용자가 클릭할 때 사운드가 완전히 로드되지 않을 수 있습니다.로드되지 않은 사운드를 재생하려고 하면 런타임 오류가 발생할 수 있습니다. 사운드 재생을

시작하는 액션을 취하도록 허용하기 전에 사운드가 완전히 로드될 때까지 기다리는 것이 안전합니다.

Sound 객체는 사운드 로드 프로세스 중에 여러 가지 이벤트를 전달합니다. 응용 프로그램은

이러한 이벤트를 수신하여 로드 진행률을 추적하고 사운드 재생 전에 사운드가 완전히 로드

되도록 할 수 있습니다. 다음 표에서는 Sound 객체가 전달할 수 있는 이벤트를 설명합니다.

다음 코드는 사운드 로드 완료 후 재생 방법을 보여 줍니다. import flash.events.Event;import flash.media.Sound;import flash.net.URLRequest;

이벤트 설명

open(Event.OPEN) 사운드 로드 작업이 시작되기 직전에 전달됩니다.

progress(ProgressEvent.PROGRESS) 사운드 로드 프로세스 중에 파일 또는 스트림으로부터 데이터를 수신할 때 정기적으로 전달됩니다.

id3(Event.ID3) mp3 사운드에 대해 ID3 데이터를 사용할 수 있는 경우 전달됩니다.

complete(Event.COMPLETE) 모든 사운드 리소스 데이터가 로드되었을 때 전달됩니다.

ioError(IOErrorEvent.IO_ERROR) 사운드 파일을 찾을 수 없거나 모든 사운드 데이터를 수신

하기 전에 로드 프로세스가 중단된 경우 전달됩니다.

Page 7: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

외부 사운드 파일 로드 561

var s:Sound = new Sound();s.addEventListener(Event.COMPLETE, onSoundLoaded);var req:URLRequest = new URLRequest("bigSound.mp3");s.load(req);

function onSoundLoaded(event:Event):void{ var localSound:Sound = event.target as Sound; localSound.play();}

이 코드 샘플은 먼저 새 Sound 객체를 만듭니다. 이때 이 객체에 URLRequest 매개 변수에 한

초기 값을 지정하지 않습니다. 그런 다음 Sound 객체로부터 Event.COMPLETE 이벤트를 수신

하고, 모든 사운드 데이터가 로드되면 onSoundLoaded() 메서드를 실행합니다. 다음으로, 사운드 파일에 한 새로운 URLRequest 값을 사용하여 Sound.load() 메서드를 호출합니다.

사운드 로드가 완료되면 onSoundLoaded() 메서드가 실행됩니다. Event 객체의 상 속성은

Sound 객체에 한 참조입니다. Sound 객체의 play() 메서드를 호출하면 사운드 재생이 시작됩니다.

사운드 로드 프로세스 모니터링사운드 파일은 용량이 너무 커서 로드하는 데 오랜 시간이 걸릴 수 있습니다. Flash Player를사용하면 사운드를 완전히 로드하기 전에도 응용 프로그램에서 사운드를 재생할 수 있으며

로드된 사운드 데이터의 양과 이미 재생된 사운드의 양을 표시할 수도 있습니다.

Sound 클래스는 사운드의 로드 진행률을 상 적으로 쉽게 표시하도록 하는 두 개의 이벤트인

ProgressEvent.PROGRESS 및 Event.COMPLETE를 전달합니다. 다음 예제는 이러한 이벤트를

사용하여 로드되는 사운드에 한 진행률 정보를 표시하는 방법을 보여 줍니다.import flash.events.Event;import flash.events.ProgressEvent;import flash.media.Sound;import flash.net.URLRequest;

var s:Sound = new Sound();s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress);s.addEventListener(Event.COMPLETE, onLoadComplete);s.addEventListener(IOErrorEvent.IO_ERROR, onIOError);

var req:URLRequest = new URLRequest("bigSound.mp3");s.load(req);

function onLoadProgress(event:ProgressEvent):void{

var loadedPct:uint = Math.round(100 * (event.bytesLoaded / event.bytesTotal));

Page 8: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

562 사운드를 사용한 작업

trace("The sound is " + loadedPct + "% loaded.");}

function onLoadComplete(event:Event):void{

var localSound:Sound = event.target as Sound;localSound.play();

}function onIOError(event:IOErrorEvent){

trace("The sound could not be loaded: " + event.text);}

이 코드는 Sound 객체를 만든 다음 ProgressEvent.PROGRESS 및 Event.COMPLETE 이벤트에 해 리스너를 이 객체에 추가합니다. Sound.load() 메서드가 호출되고 첫 번째 데이터가

사운드 파일로부터 수신된 후에 ProgressEvent.PROGRESS 이벤트가 발생하고 onSoundLoadProgress() 메서드가 트리거됩니다.

로드된 사운드 데이터의 백분율은 ProgressEvent 객체의 bytesLoaded 속성 값을 bytesTotal속성 값으로 나눈 값과 같습니다. 동일한 bytesLoaded 및 bytesTotal 속성은 Sound 객체에

서도 사용 가능합니다. 위 예제에서는 사운드 로드 진행률에 한 메시지만 보여 주지만, 사용자가 bytesLoaded 및 bytesTotal 값을 사용하여 진행률 막 구성 요소(Adobe Flex 2 프레임워크 또는 Flash 제작 도구와 함께 제공됨)를 쉽게 업데이트할 수 있습니다.

또한 이 예제는 사운드 파일을 로드할 때 응용 프로그램이 오류를 어떻게 인식하고 이에 응답하는지 보여 줍니다. 예를 들어 특정 파일 이름을 가진 사운드 파일을 찾을 수 없는 경우,Sound 객체가 Event.IO_ERROR 이벤트를 전달합니다. 이전 코드에서는 오류가 발생할 때onIOError() 메서드가 실행되고 간단한 오류 메시지가 표시됩니다.

포함된 사운드를 사용한 작업외부 파일로부터 사운드를 로드하는 신 포함된 사운드를 사용하는 것은 응용 프로그램의

사용자 인터페이스에서 지시자로 사용되는 작은 사운드(예: 버튼을 클릭했을 때 재생되는

사운드)에 가장 유용합니다.

사운드 파일을 응용 프로그램에 포함시키면 SWF 파일의 크기는 사운드 파일의 크기만큼 증가합니다. 즉, 응용 프로그램에 용량 사운드 파일을 포함시키면 SWF 파일의 크기가 지나치

게 커질 수 있습니다.

사운드 파일을 응용 프로그램의 SWF 파일에 포함시키는 정확한 방법은 개발 환경에 따라

다릅니다.

Page 9: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

포함된 사운드를 사용한 작업 563

포함된 사운드 파일을 Flash에서 사용Flash 제작 도구를 사용하면 다양한 사운드 포맷의 사운드를 가져와서 라이브러리에 심볼로

저장할 수 있습니다. 그런 다음, 사운드를 타임라인 내의 프레임 또는 버튼 상태의 프레임에

할당한 후 비헤이비어와 함께 사용하거나, 사운드를 직접 ActionScript 코드에서 사용할 수도

있습니다. 이 단원에서는 Flash 제작 도구를 활용하여 ActionScript 코드에 포함된 사운드를

사용하는 방법에 해 설명합니다. 포함된 사운드를 Flash에서 사용하는 기타 방법에 한

자세한 내용은 Flash 사용 설명서의 “사운드 가져오기”를 참조하십시오.

사운드 파일을 Flash 무비에 포함하려면:

1. [파일] > [가져오기] > [라이브러리로 가져오기]를 선택한 다음 사운드 파일을 하나 선택

하여 가져옵니다. 2. 가져온 파일 이름을 [라이브러리] 패널에서 마우스 오른쪽 버튼으로 클릭한 후 [속성]을

선택합니다. [ActionScript에 내보내기] 체크 상자를 클릭합니다.3. [클래스] 필드에 이 포함된 사운드를 ActionScript에서 참조할 때 사용할 이름을 입력합니

다. 기본적으로 이 필드의 사운드 파일 이름이 사용됩니다. “DrumSound.mp3”의 경우와 같이 파일 이름에 마침표가 포함된 경우 “DrumSound” 등으로 변경해야 합니다. ActionScript는 클래스 이름에 마침표 문자를 허용하지 않습니다. [기본 클래스] 필드에는 flash.media.Sound가 여전히 표시됩니다.

4. [확인]을 클릭합니다. 이 클래스에 한 정의를 클래스 경로에서 찾을 수 없다는 화 상자가 나타날 수 있습니다. [확인]을 클릭하고 계속합니다. 사용자 응용 프로그램의 클래스 경로에 있는 클래스 이름과 일치하지 않는 클래스 이름을 입력하는 경우, flash.media.Sound 클래스에서 상속된 새 클래스가 자동으로 생성됩니다.

5. 포함된 사운드를 사용하려면 이 사운드에 한 클래스 이름을 ActionScript에서 참조합니다.예를 들어, 다음 코드는 자동으로 생성된 DrumSound 클래스의 새 인스턴스를 만듭니다.var drum:DrumSound = new DrumSound();var channel:SoundChannel = drum.play();

DrumSound는 flash.media.Sound 클래스의 하위 클래스이므로 위에 나와 있는 play() 메서드를 포함하여 Sound 클래스의 메서드와 속성을 상속합니다.

Page 10: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

564 사운드를 사용한 작업

사운드 파일 스트리밍 작업사운드 파일이나 비디오 파일의 데이터를 로드하고 있는 중에 먼저 로드된 부분을 재생하는

것을 스트리밍이라고 합니다. 원격 서버로부터 로드되는 외부 사운드 파일은 스트리밍되는

경우가 많으므로 전체 사운드 데이터의 로드가 완료되지 않아도 사운드를 들을 수 있습니다.

SoundMixer.bufferTime 속성은 사운드 재생 전에 Flash Player가 수집해야 하는 사운드 데이터의 밀리초를 나타냅니다. 즉, bufferTime 속성이 5000인 경우 Flash Player가 사운드 파일로부터 최소한 5000밀리초 상당의 데이터를 로드해야 사운드 재생을 시작할 수 있습니다.기본 SoundMixer.bufferTime 값은 1000입니다.

응용 프로그램은 사운드를 로드할 때 새로운 bufferTime 값을 명시적으로 지정하여 개별 사운드에 한 전역 SoundMixer.bufferTime 값을 재정의할 수 있습니다. 기본 버퍼링 시간을

재정의하려면 아래와 같이 먼저 SoundLoaderContext 클래스의 새 인스턴스를 만들고 해당

bufferTime 속성을 설정하여 Sound.load() 메서드에 매개 변수로 전달합니다.import flash.media.Sound;import flash.media.SoundLoaderContext;import flash.net.URLRequest;

var s:Sound = new Sound();var req:URLRequest = new URLRequest("bigSound.mp3");var context:SoundLoaderContext = new SoundLoaderContext(8000, true);s.load(req, context);s.play();

재생을 계속하는 동안 Flash Player는 사운드 버퍼 크기를 동일 수준 이상으로 유지하려고 합니다. 사운드 데이터가 재생 속도보다 빠르게 로드되면 재생은 중단 없이 계속됩니다. 하지

만 네트워크 제한으로 인해 데이터 로드 속도가 저하되는 경우 재생 헤드가 사운드 버퍼의

끝에 도달할 수 있습니다. 이렇게 되면 재생이 일시 중단되지만 추가 사운드 데이터가 로드

되면 재생이 자동으로 다시 시작됩니다.

Flash Player가 데이터 로드를 기하느라 재생이 일시 중단되었는지 확인하려면 Sound.isBuffering 속성을 사용합니다.

사운드 재생로드된 사운드의 재생은 아래와 같이 Sound 객체에 한 Sound.play() 메서드를 호출하는

것처럼 간단할 수 있습니다.var snd:Sound = new Sound(new URLRequest("smallSound.mp3"));snd.play();

ActionScript 3.0을 사용하여 사운드를 재생할 경우 다음 작업을 수행할 수 있습니다.

■ 특정 시작 위치에서 사운드 재생

■ 사운드를 일시 정지하고 나중에 같은 위치에서 다시 재생 시작

Page 11: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

사운드 재생 565

■ 사운드 재생이 끝나는 정확한 시간 알아보기

■ 사운드의 재생 진행률 추적

■ 사운드 재생 중에 볼륨 변경 및 패닝

재생 중에 이러한 작업을 수행하려면 SoundChannel, SoundMixer 및 SoundTransform 클래스

를 사용합니다.

SoundChannel 클래스는 단일 사운드의 재생을 제어합니다. SoundChannel.position 속성

은 재생 헤드로 간주할 수 있으며 재생 중인 사운드 데이터의 현재 위치를 나타냅니다.

응용 프로그램이 Sound.play() 메서드를 호출하면 SoundChannel 클래스의 새로운 인스턴

스가 만들어져 재생을 제어합니다.

응용 프로그램은 특정 시작 위치로부터 해당 위치를 지나면서 사운드를 재생할 수 있습니다.시작 위치는 기준이 밀리초이며 Sound.play() 메서드의 startTime 매개 변수로 지정됩니

다. Sound.play() 메서드의 loops 매개 변수에 숫자 값을 전달하여 사운드를 연속으로 빠르

게 반복할 고정 횟수를 지정할 수도 있습니다.

Sound.play() 메서드가 startTime 매개 변수 및 loops 매개 변수를 사용하여 호출되면 다음

코드에서 볼 수 있는 것처럼 사운드가 매번 동일한 시작 위치에서 반복적으로 재생됩니다.var snd:Sound = new Sound(new URLRequest("repeatingSound.mp3"));snd.play(1000, 3);

위 예제에서는 사운드가 시작된지 1초 후 시점에 재생되며 연속 세 번 반복됩니다.

사운드 정지 및 다시 시작응용 프로그램이 노래나 포드캐스트 등의 긴 사운드를 재생하는 경우 이러한 사운드의 재생

을 일시 정지 및 다시 시작하도록 할 수 있습니다. ActionScript에서는 엄밀한 의미로 사운드

를 재생 중에 일시 정지할 수는 없고 중단만 가능합니다. 하지만 어느 위치에서든 사운드 재생을 시작할 수 있습니다. 사운드가 중지된 시점의 위치를 기록하여 나중에 해당 위치에서

사운드 재생을 시작할 수 있습니다.

예를 들어, 코드가 다음과 같이 사운드 파일을 로드하여 재생한다고 가정합니다.var snd:Sound = new Sound(new URLRequest("bigSound.mp3"));var channel:SoundChannel = snd.play();

사운드가 재생되는 동안 SoundChannel.position 속성은 사운드 파일에서 현재 재생 중인

위치를 나타냅니다. 응용 프로그램은 다음과 같이 사운드 재생이 중지되기 전에 위치 값을

저장할 수 있습니다.var pausePosition:int = channel.position;channel.stop();

Page 12: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

566 사운드를 사용한 작업

사운드 재생을 다시 시작하려면 이전에 저장된 위치 값을 전달하여 사운드가 중지되었던 위치에서 다시 시작합니다.channel = snd.play(pausePosition);

재생 모니터링응용 프로그램은 사운드 재생이 언제 중지되는지 인식하여 다른 사운드 재생을 시작하거나

이전 재생 중에 사용된 일부 리소스를 정리할 수 있습니다. SoundChannel 클래스는 사운드

재생이 끝날 때 Event.SOUND_COMPLETE 이벤트를 전달합니다. 응용 프로그램은 아래와 같이 이 이벤트를 수신하여 적절한 액션을 취할 수 있습니다.import flash.events.Event;import flash.media.Sound;import flash.net.URLRequest;

var snd:Sound = new Sound("smallSound.mp3");var channel:SoundChannel = snd.play();s.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);

public function onPlaybackComplete(event:Event){

trace(“The sound has finished playing.”);}

SoundChannel 클래스는 재생 중에 진행률 이벤트를 전달하지 않습니다. 재생 진행률을 보고

하려면 응용 프로그램은 자체의 시간 메커니즘을 설정하고 사운드 재생 헤드의 위치를 추적

해야 합니다.

재생된 사운드 백분율을 계산하려면 다음과 같이 SoundChannel.position 속성 값을 재생

중인 사운드 데이터의 길이로 나누어야 합니다.var playbackPercent:uint = 100 * (channel.position / snd.length);

이 코드는 재생 시작 전에 사운드 데이터가 완전히 로드된 경우에만 정확한 재생 백분율을

보고합니다. Sound.length 속성은 전체 사운드 파일의 최종 크기가 아닌 현재 로드된 사운

드 데이터의 크기를 표시합니다. 아직 로드 중인 스트리밍 사운드의 재생 진행률을 추적하기

위해 응용 프로그램은 전체 사운드 파일의 최종 크기를 추정하여 그 값을 계산에 사용해야

합니다. 다음과 같이 Sound 객체의 bytesLoaded 및 bytesTotal 속성을 사용하여 사운드 데이터의 최종 길이를 추정할 수 있습니다.var estimatedLength:int =

Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal));var playbackPercent:uint = 100 * (channel.position / estimatedLength);

다음 코드는 좀 더 큰 사운드 파일을 로드하며, 재생 진행률을 표시하는 데 Event.ENTER_FRAME 이벤트를 시간 메커니즘으로 사용합니다. 그리고 현재 위치 값을 사운

드 데이터의 전체 길이로 나누어 계산되는 재생 백분율을 정기적으로 보고합니다.

Page 13: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

사운드 재생 567

import flash.events.Event;import flash.media.Sound;import flash.net.URLRequest;

var snd:Sound = new Sound();var req:URLRequest = new

URLRequest("http://av.adobe.com/podcast/csbu_dev_podcast_epi_2.mp3");snd.load(req);

var channel:SoundChannel;channel = snd.play();addEventListener(Event.ENTER_FRAME, onEnterFrame);snd.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);

function onEnterFrame(event:Event):void{

var estimatedLength:int = Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal));

var playbackPercent:uint = Math.round(100 * (channel.position / estimatedLength));

trace("Sound playback is " + playbackPercent + "% complete.");}

function onPlaybackComplete(event:Event){

trace("The sound has finished playing.");removeEventListener(Event.ENTER_FRAME, onEnterFrame);

}

사운드 데이터 로드가 시작되고 나면 이 코드는 snd.play() 메서드를 호출하고 결과 SoundChannel 객체를 channel 변수에 저장합니다. 그런 다음 이벤트 리스너를 Event.ENTER_FRAME 이벤트에 한 기본 응용 프로그램에 추가하고 또 다른 이벤트 리스너를 재생 완료 시 발생하는 Event.SOUND_COMPLETE 이벤트에 한 SoundChannel 객체에 추가합

니다.

응용 프로그램이 해당 애니메이션의 새로운 프레임에 도달할 때마다 onEnterFrame() 메서

드가 호출됩니다. onEnterFrame() 메서드는 이미 로드된 데이터 양을 기준으로 사운드 파일의 전체 길이를 추정한 다음 현재 재생 백분율을 계산하여 표시합니다.

전체 사운드가 재생되었으면 onPlaybackComplete() 메서드가 실행되어 Event.ENTER_FRAME 이벤트에 한 이벤트 리스너를 제거합니다. 그러면 재생이 완료된 후에 진행률 업데이트를 더 이상 표시하지 않습니다.

Event.ENTER_FRAME 이벤트는 초당 여러 번 전달될 수 있습니다. 어떤 경우에는 그렇게 빈번

하게 재생 진행률을 표시할 필요가 없을 수 있습니다. 이런 경우에는 사용자의 응용 프로그

램에서 flash.util.Timer 클래스를 사용하여 고유한 시간 메커니즘을 설정할 수 있습니다. 181페이지의 “날짜 및 시간을 사용한 작업”을 참조하십시오.

Page 14: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

568 사운드를 사용한 작업

사운드 스트리밍 중단스트리밍되는 사운드 즉, 재생하는 동안 계속 로드되는 사운드의 경우 재생 프로세스에 이상

현상이 발생하기도 합니다. 스트리밍 사운드를 재생 중인 SoundChannel 인스턴스에서 응용

프로그램이 SoundChannel.stop() 메서드를 호출하면 한 프레임에 한 사운드 재생이 중지되고 다음 프레임에서 사운드를 처음부터 다시 재생합니다. 이러한 현상이 나타나는 이유

는 사운드 로드 프로세스가 아직 진행 중이기 때문입니다. 스트리밍 사운드의 로드와 재생을

모두 중단하려면 Sound.close() 메서드를 호출합니다.

사운드 로드 및 재생 시의 보안 고려 사항응용 프로그램의 사운드 데이터 액세스 기능은 Flash Player 보안 모델에 따라 제한됩니다. 각 사운드에는 두 가지 보안 샌드박스의 제한 사항이 적용됩니다. 보안 샌드박스는 내용 자체에 한 샌드박스(“내용 샌드박스”)와 사운드를 로드하여 재생하는 응용 프로그램 또는

객체에 한 샌드박스(“소유자 샌드박스”)가 있습니다. 전반적인 Flash Player 보안 모델 및샌드박스 정의에 한 자세한 내용은 707페이지의 “Flash Player 보안”을 참조하십시오.

내용 샌드박스는 id3 속성 또는 SoundMixer.computeSpectrum() 메서드를 사용하여 사운

드에서 세부 사운드 데이터를 추출할 수 있는지 여부를 제어하는 것으로, 사운드 파일 자체

의 로드 또는 재생을 제한하지는 않습니다.

사운드 파일의 원본 도메인은 내용 샌드박스의 보안 제한 사항을 정의합니다. 일반적으로 사운드 파일을 로드하는 응용 프로그램 또는 객체의 SWF 파일과 동일한 도메인 또는 폴더에

사운드 파일이 있으면 응용 프로그램 또는 객체는 해당 사운드 파일에 액세스할 수 있습니다.응용 프로그램과는 다른 도메인에서 사운드가 제공되는 경우에도 크로스 도메인 정책 파일

을 사용하여 내용 샌드박스에서 사운드를 가져올 수 있습니다.

응용 프로그램은 checkPolicyFile 속성을 사용하여 SoundLoaderContext 객체를 Sound.load() 메서드에 매개 변수로 전달할 수 있습니다. checkPolicyFile 속성을 true로 설정하면 Flash Player는 사운드가 로드된 서버에서 크로스 도메인 정책 파일을 찾습니다. 크로스 도메인 정책 파일이 존재하고 로드하는 SWF 파일의 도메인에 액세스 권한이 부여되면 SWF 파일은 사운드 파일을 로드하고 Sound 객체의 id3 속성에 액세스한 다음 로드된 사운

드에 한 SoundMixer.computeSpectrum() 메서드를 호출합니다.

소유자 샌드박스는 사운드의 로컬 재생을 제어합니다. 사운드 재생을 시작하는 응용 프로그

램 또는 객체가 소유자 샌드박스를 정의합니다.

다음 조건에 맞는 경우 SoundMixer.stopAll() 메서드는 현재 재생 중인 모든 SoundChannel 객체의 사운드를 중지합니다.

■ 동일한 소유자 샌드박스 내의 객체에 의해 시작된 사운드

■ SoundMixer.stopAll() 메서드를 호출하는 응용 프로그램 또는 객체의 도메인에 한

액세스를 허용하는 크로스 도메인 정책 파일을 가진 소스에서 제공되는 사운드

Page 15: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

사운드 볼륨 및 패닝 제어 569

SoundMixer.stopAll() 메서드가 모든 재생 사운드를 실제로 중지하는지 알아보기 위해 응용 프로그램이 SoundMixer.areSoundsInaccessible() 메서드를 호출할 수 있습니다. 해당

메서드가 true 값을 반환하면 재생 중인 일부 사운드는 현재 소유자 샌드박스의 제어 범위

를 벗어나므로 SoundMixer.stopAll() 메서드에 의해 중지되지 않습니다.

또한 SoundMixer.stopAll() 메서드는 외부 파일로부터 로드된 모든 사운드에 해 재생

헤드가 계속 진행되지 않도록 중지합니다. 하지만 Flash 제작 도구를 사용하여 FLA 파일에

포함된 사운드 및 타임라인 내 프레임에 연결된 사운드는애니메이션이 새 프레임으로 이동

하면 다시 재생되기 시작합니다.

사운드 볼륨 및 패닝 제어개별 SoundChannel 객체는 사운드에 해 왼쪽 및 오른쪽 스테레오 채널을 모두 제어합니다.mp3 사운드가 모노인 경우, SoundChannel 객체의 왼쪽 및 오른쪽 스테레오 채널에 동일한

파형이 포함됩니다.

SoundChannel 객체의 leftPeak 및 rightPeak 속성을 사용하여 재생 중인 사운드에 한 각스테레오 채널의 진폭을 알 수 있습니다. 이러한 속성은 사운드 파형 자체의 피크 진폭을 표시하는 것으로, 실제 재생 볼륨을 나타내지는 않습니다. 실제 재생 볼륨은 SoundChannel 객체 및 SoundMixer 클래스에 설정된 볼륨 값 및 사운드 웨이브 진폭의 함수입니다.

SoundChannel 객체의 팬 속성은 재생 중에 왼쪽 및 오른쪽 채널 각각에 다른 볼륨 수준을 지정하는 데 사용될 수 있습니다. 팬 속성은 -1 ~ 1 범위의 값을 가질 수 있습니다. 여기서 -1은오른쪽 채널 음을 소거한 상태에서 왼쪽 채널을 최고 볼륨으로 재생한다는 의미이며, 1은 왼쪽 채널 음을 소거한 상태에서 오른쪽 채널을 최고 볼륨으로 재생한다는 의미입니다. -1과 1사이의 숫자 값은 왼쪽과 오른쪽 채널 값에 한 비례 값을 설정하며, 0은 양쪽 채널이 균형

있는 중간 볼륨 수준으로 재생된다는 의미입니다.

다음 코드 예제는 볼륨 값이 0.6이고 팬 값이 -1(즉, 왼쪽 채널이 최고 볼륨으로 재생되고 오른쪽 채널은 음소거)인 SoundTransform 객체를 만듭니다. 이 코드는 SoundTransform 객체를

play() 메서드에 매개 변수로 전달하여 재생 제어를 위해 만들어진 새로운 SoundChannel객체에 해당 SoundTransform 객체를 적용합니다.var snd:Sound = new Sound(new URLRequest("bigSound.mp3")); var trans:SoundTransform = new SoundTransform(0.6, -1);var channel:SoundChannel = snd.play(0, 1, trans);

사운드 재생 도중 SoundTransform 객체의 pan 속성이나 volume 속성을 설정한 다음, 이 객체

를 SoundChannel 객체의 soundTransform 속성으로 적용하여 패닝 및 볼륨을 변경할 수 있습니다.

다음 예제에서처럼 SoundMixer 클래스의 soundTransform 속성을 사용하여 한번에 모든 사운드에 한 전역 볼륨 값과 팬 값을 설정할 수도 있습니다.SoundMixer.soundTransform = new SoundTransform(1, -1);

Page 16: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

570 사운드를 사용한 작업

또는 SoundTransform 객체를 사용하여 Microphone 객체에 한(575페이지의 “사운드 입력

캡처” 참조) 볼륨 및 팬 값을 설정할 수도 있고, Sprite 객체와 SimpleButton 객체에 해서도

설정할 수 있습니다.

다음 예제에서는 사운드 재생 중에 사운드의 패닝을 왼쪽 채널에서 오른쪽 채널로 교 하고

또 그 반 로 전환합니다.import flash.events.Event;import flash.media.Sound;import flash.media.SoundChannel;import flash.media.SoundMixer;import flash.net.URLRequest;

var snd:Sound = new Sound(); var req:URLRequest = new URLRequest("bigSound.mp3");snd.load(req);

var panCounter:Number = 0;

var trans:SoundTransform;trans = new SoundTransform(1, 0);var channel:SoundChannel = snd.play(0, 1, trans);channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);

addEventListener(Event.ENTER_FRAME, onEnterFrame);

function onEnterFrame(event:Event):void{

trans.pan = Math.sin(panCounter);channel.soundTransform = trans; // 또는 SoundMixer.soundTransform = trans;panCounter += 0.05;

}

function onPlaybackComplete(event:Event):void{

removeEventListener(Event.ENTER_FRAME, onEnterFrame);}

이 코드는 사운드 파일을 로드한 다음 볼륨이 1(최 볼륨)로, 팬이 0(좌우 밸런스 동일)으로

설정된 새 SoundTransform 객체를 만듭니다. 그런 다음 snd.play() 메서드를 호출하여

SoundTransform 객체를 매개 변수로 전달합니다.

사운드가 재생되는 동안 onEnterFrame() 메서드가 반복적으로 실행됩니다. onEnterFrame() 메서드는 Math.sin() 함수를 사용하여 -1과 1 사이의 값을 생성합니다. 이 범위는 SoundTransform.pan 속성으로 사용할 수 있는 값에 해당합니다. SoundTransform 객체의 pan 속성은 새로운 값으로 설정되고 채널의 soundTransform 속성은 변경된 SoundTransform 객체를 사용하도록 설정됩니다.

Page 17: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

사운드 메타데이터를 사용한 작업 571

이 예제를 실행하려면 bigSound.mp3라는 파일 이름을 로컬 mp3 파일 이름으로 체합니다.그리고 예제를 실행합니다. 오른쪽 채널 볼륨이 작아지면서 왼쪽 채널 볼륨이 커지고, 왼쪽

채널 볼륨이 작아지면서 오른쪽 채널 볼륨이 커집니다.

이 예제에서 SoundMixer 클래스의 soundTransform 속성을 설정하여 동일한 효과를 거둘

수 있습니다. 하지만 이 경우 이 SoundChannel 객체에 의해 재생되는 단일 사운드뿐 아니라

현재 재생되는 모든 사운드의 패닝에 영향을 미칩니다.

사운드 메타데이터를 사용한 작업mp3 포맷을 사용하는 사운드 파일에는 해당 사운드에 한 추가 데이터가 ID3 태그의 형태

로 포함될 수 있습니다.

일부 mp3 파일에는 ID3 메타데이터가 없습니다. mp3 사운드 파일에 ID3 메타데이터가 포함된 경우, Sound 객체가 이 사운드 파일을 로드하면 Event.ID3 이벤트가 전달됩니다. 런타

임 오류를 방지하려면 응용 프로그램에서 Event.ID3 이벤트를 수신할 때까지 기다린 후에

로드된 사운드의 Sound.id3 속성에 액세스해야 합니다.

다음 코드는 사운드 파일의 ID3 메타데이터가 로드된 시점을 인식하는 방법을 보여 줍니다.import flash.events.Event;import flash.media.ID3Info;import flash.media.Sound;

var s:Sound = new Sound();s.addEventListener(Event.ID3, onID3InfoReceived);s.load("mySound.mp3");

function onID3InfoReceived(event:Event){

var id3:ID3Info = event.target.id3;

trace("Received ID3 Info:");for (var propName:String in id3){

trace(propName + " = " + id3[propName]);}

}

이 코드는 Sound 객체를 만든 후 Event.ID3 이벤트를 수신하도록 지시합니다. 사운드 파일

의 ID3 메타데이터가 로드되면 onID3InfoReceived() 메서드가 호출됩니다. onID3InfoReceived() 메서드에 전달되는 Event 객체의 상은 원본 Sound 객체이며, 이 메서드는 Sound 객체의 id3 속성을 가져온 다음, 이름이 지정된 모든 속성을 반복하여 그 값을 추적합니다.

Page 18: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

572 사운드를 사용한 작업

원시 사운드 데이터 액세스SoundMixer.computeSpectrum() 메서드를 사용하면 현재 재생 중인 파형에 한 원시 사운드 데이터를 응용 프로그램이 읽을 수 있습니다. 둘 이상의 SoundChannel 객체가 현재 재생 중인 경우, SoundMixer.computeSpectrum() 메서드는 함께 믹싱된 모든 SoundChannel객체의 조합된 사운드 데이터를 표시합니다.

사운드 데이터는 512바이트의 데이터가 포함된 ByteArray 객체로 반환되며 각 개체는 -1과 1사이의 부동 소수점 값을 포함합니다. 이러한 값은 재생 중인 사운드 파형의 위치 진폭을 나타냅니다. 값은 두 개의 256바이트 그룹으로 제공됩니다. 첫 번째 그룹은 왼쪽 스테레오 채널용이고 두 번째 그룹은 오른쪽 스테레오 채널용입니다.

FFTMode 매개 변수가 true로 설정된 경우, SoundMixer.computeSpectrum() 메서드는 파형 데이터가 아니라 주파수 스펙트럼 데이터를 반환합니다. 주파수 스펙트럼은 가장 낮은 주파수에서 가장 높은 주파수까지 사운드 주파수에 따라 배열된 진폭을 표시합니다. FFT(FastFourier Transform)는 파형 데이터를 주파수 스펙트럼 데이터로 변환하는 데 사용됩니다. 결과 주파수 스펙트럼 값은 0에서 약 1.414(2의 제곱근)까지입니다.

다음 그림에서는 FFTMode 매개 변수가 true로 설정되었을 때와 false로 설정되었을 때computeSpectrum() 메서드로부터 반환된 데이터를 비교합니다. 이 그림에 사용된 사운드

데이터는 왼쪽 채널은 큰 베이스 사운드, 오른쪽 채널은 드럼 사운드에 한 것입니다.

Page 19: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

원시 사운드 데이터 액세스 573

또한 computeSpectrum() 메서드는 더 낮은 비트율로 다시 샘플링된 데이터를 반환할 수 있습니다. 이렇게 하면 일반적으로 더 부드러운 파형 데이터 또는 주파수 데이터가 반환되고

세부적인 요소는 제거됩니다. stretchFactor 매개 변수는 computeSpectrum() 메서드 데이터가 샘플링되는 속도를 제어합니다. stretchFactor 매개 변수가 기본값인 0으로 설정된

경우 사운드 데이터는 44.1kHz의 속도로 샘플링됩니다. 이 속도는 stretchFactor 매개 변수의

각 연속 값에서 절반으로 되어 값 1은 22.05kHz, 값 2는 11.025kHz 등으로 속도를 지정합니

다. computeSpectrum() 메서드는 더 높은 stretchFactor 값이 사용되어도 스테레오 채널

당 256바이트를 반환합니다.

SoundMixer.computeSpectrum() 메서드는 다음과 같은 제한 사항이 있습니다.

■ 마이크 또는 RTMP 스트림의 사운드 데이터는 전역 SoundMixer 객체를 통과하지 않으

므로 SoundMixer.computeSpectrum() 메서드는 이러한 소스로부터 데이터를 반환하지

않습니다.■ 재생 중인 하나 이상의 사운드가 현재 내용 샌드박스 외부의 소스로부터 제공되는 경우

보안 제한 사항으로 인해 SoundMixer.computeSpectrum() 메서드에서 오류가 발생할 수 있습니다. SoundMixer.computeSpectrum() 메서드의 보안 제한에 한 자세한 내용

은 568페이지의 “사운드 로드 및 재생 시의 보안 고려 사항” 및 732페이지의 “데이터로 로드된 미디어 액세스”를 참조하십시오.

간단한 사운드 파형 표시기 만들기다음 예제에서는 SoundMixer.computeSpectrum() 메서드를 사용하여 각 프레임과 함께 움직이는 사운드 파형 차트를 표시합니다.import flash.display.Graphics;import flash.events.Event;import flash.media.Sound;import flash.media.SoundChannel;import flash.media.SoundMixer;import flash.net.URLRequest;

const PLOT_HEIGHT:int = 200;const CHANNEL_LENGTH:int = 256;

var snd:Sound = new Sound();var req:URLRequest = new URLRequest("bigSound.mp3");snd.load(req);

var channel:SoundChannel;channel = snd.play();addEventListener(Event.ENTER_FRAME, onEnterFrame);snd.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);

var bytes:ByteArray = new ByteArray();

Page 20: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

574 사운드를 사용한 작업

function onEnterFrame(event:Event):void{

SoundMixer.computeSpectrum(bytes, false, 0);

var g:Graphics = this.graphics;

g.clear();g.lineStyle(0, 0x6600CC);g.beginFill(0x6600CC);g.moveTo(0, PLOT_HEIGHT);

var n:Number = 0;

// 왼쪽 채널for (var i:int = 0; i < CHANNEL_LENGTH; i++) {

n = (bytes.readFloat() * PLOT_HEIGHT);g.lineTo(i * 2, PLOT_HEIGHT - n);

}g.lineTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT);g.endFill();

// 오른쪽 채널g.lineStyle(0, 0xCC0066);g.beginFill(0xCC0066, 0.5);g.moveTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT);

for (i = CHANNEL_LENGTH; i > 0; i--) {

n = (bytes.readFloat() * PLOT_HEIGHT);g.lineTo(i * 2, PLOT_HEIGHT - n);

}g.lineTo(0, PLOT_HEIGHT);g.endFill();

}

function onPlaybackComplete(event:Event){

removeEventListener(Event.ENTER_FRAME, onEnterFrame);}

이 예제는 사운드 파일을 로드하여 재생한 다음, 사운드 재생 동안 onEnterFrame() 메서드

를 트리거할 Event.ENTER_FRAME 이벤트를 수신합니다. onEnterFrame() 메서드는 사운드

웨이브 데이터를 bytes ByteArray 객체에 저장하는 SoundMixer.computeSpectrum() 메서

드를 호출하는 것으로 시작됩니다.

Page 21: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

사운드 입력 캡처 575

사운드 파형은 벡터 드로잉 API를 사용하여 그려집니다. for 루프는 왼쪽 스테레오 채널을

나타내는 처음 256개 데이터 값을 찾은 후 Graphics.lineTo() 메서드를 사용하여 각각의

위치 사이에 차례로 선을 그립니다. 두 번째 for 루프는 다음 세트의 256개 값을 순환한 후이 값들을 역순으로(오른쪽에서 왼쪽으로) 배치합니다. 결과 파형 형태는 다음 이미지와 같이 흥미로운 거울 이미지 효과를 나타낼 수 있습니다.

사운드 입력 캡처Microphone 클래스를 사용하면 응용 프로그램이 사용자 시스템의 마이크 또는 기타 사운드

입력 장치에 연결하여 입력 오디오를 해당 시스템에 브로드캐스팅하거나 오디오 데이터를

Flash Media Server 등의 원격 서버에 보냅니다.

마이크 액세스Microphone 클래스에는 생성자 메서드가 없습니다. 신 다음과 같이 정적 Microphone.getMicrophone() 메서드를 사용하여 새 Microphone 인스턴스를 구합니다.var mic:Microphone = Microphone.getMicrophone();

매개 변수 없이 Microphone.getMicrophone() 메서드를 호출하면 사용자 시스템에서 검색

된 첫 번째 사운드 입력 장치가 반환됩니다.

Page 22: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

576 사운드를 사용한 작업

시스템에는 둘 이상의 사운드 입력 장치가 연결되어 있을 수 있습니다. 응용 프로그램은

Microphone.names 속성을 사용하여 사용 가능한 모든 사운드 입력 장치의 이름 배열을 가져옵니다. 그런 다음 배열에 있는 장치 이름의 인덱스 값과 일치하는 index 매개 변수를 사용하여 Microphone.getMicrophone() 메서드를 호출합니다.

시스템에 마이크 또는 기타 사운드 입력 장치가 연결되어 있지 않을 수도 있습니다. Microphone.names 속성 또는 Microphone.getMicrophone() 메서드를 사용하여 사용자의 시스템에 사운드 입력 장치가 설치되어 있는지 여부를 확인합니다. 사용자의 시스템에 사운

드 입력 장치가 설치되어 있지 않으면 names 배열 길이는 0이고 getMicrophone() 메서드가 null 값을 반환합니다.

응용 프로그램이 Microphone.getMicrophone() 메서드를 호출하면 Flash Player는 [Flash Player 설정] 화 상자를 표시합니다. 이 화 상자에서 사용자는 시스템의 카메라 및 마이크

에 한 Flash Player의 액세스를 허용 또는 거부할 수 있습니다. 이 화 상자에서 [허용] 또는 [거부] 버튼을 클릭하면 StatusEvent가 전달됩니다. 다음 예제에서와 같이, 해당 StatusEvent 인스턴스의 code 속성은 마이크 액세스의 허용 또는 거부를 나타냅니다.import flash.media.Microphone;

var mic:Microphone = Microphone.getMicrophone();mic.addEventListener(StatusEvent.STATUS, this.onMicStatus);

function onMicStatus(event:StatusEvent):void{

if (event.code == "Microphone.Unmuted"){

trace("Microphone access was allowed.");} else if (event.code == "Microphone.Muted")( trace("Microphone access was denied.");}

}

StatusEvent.code 속성에는 “Microphone.Unmuted”(액세스가 허용된 경우) 또는 “Microphone.Muted”(액세스가 거부된 경우)가 포함됩니다.

중요 사용자가 마이크 액세스를 허용 또는 거부할 때 Microphone.muted 속성은 각각 true 또는

false로 설정됩니다. 하지만 muted 속성은 StatusEvent가 전달될 때까지 Microphone 인스

턴스에 설정되지 않으므로 응용 프로그램은 Microphone.muted 속성을 확인하기 전에 StatusEvent.STATUS 이벤트가 전달되기를 기다려야 합니다.

Page 23: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

사운드 입력 캡처 577

마이크 오디오를 로컬 스피커로 라우팅매개 변수 값을 true로 하여 Microphone.setLoopback() 메서드를 호출하면 마이크의 오디오 입력을 로컬 시스템 스피커로 라우팅할 수 있습니다.

로컬 마이크의 사운드가 로컬 스피커로 라우팅되면 오디오 피드백 루프를 만들어 커다란 빽 소리를 일으키고 잠재적으로 사운드 하드웨어의 손상을 초래할 위험이 있습니다. 매개 변수 값을 true로 하여 Microphone.setUseEchoSuppression() 메서드를 호출하면 오디오 피드

백이 발생할 위험이 완전히 배제되지는 않지만 낮아집니다. 사용자가 헤드폰을 사용하거나 스피커 이외의 다른 장치를 사용하여 사운드를 재생하고 있음을 확신할 수 없는 경우라면 Microphone.setLoopback(true)을 호출하기 전에 항상 Microphone.setUseEchoSuppression(true)을 호출하는 것이 좋습니다.

다음 코드는 로컬 마이크의 오디오를 로컬 시스템 스피커로 라우팅하는 방법을 보여 줍니다.var mic:Microphone = Microphone.getMicrophone();mic.setUseEchoSuppression(true);mic.setLoopBack(true);

마이크 오디오 변경응용 프로그램은 마이크로부터 전달되는 오디오 데이터를 두 가지 방법으로 변경할 수 있습

니다. 먼저 입력 사운드의 게인을 변경할 수 있습니다. 게인은 입력 값을 지정된 양만큼 곱하

여 더 크거나 작은 사운드를 생성합니다. Microphone.gain 속성은 0부터 100까지의 숫자

값을 받습니다. 값을 50으로 지정하면 1을 곱한 것과 같게 되어 보통 볼륨을 생성합니다. 값을 0으로 지정하면 0을 곱한 것과 같게 되어 입력 오디오를 제거합니다. 값을 50 이상으로

지정하면 보통 볼륨보다 높은 볼륨을 생성합니다.

응용 프로그램에서 입력 오디오의 샘플링 속도를 변경할 수도 있습니다. 샘플링 속도가 높을

수록 사운드 품질은 향상되지만, 전송과 저장에 더 많은 리소스를 사용하는 좀 더 밀집된 데이터 스트림이 생성됩니다. Microphone.rate 속성은 kHz로 측정되는 오디오 샘플링 속도

를 나타냅니다. 기본 샘플링 속도는 8kHz입니다. 마이크가 더 높은 속도를 지원하는 경우 Microphone.rate 속성 값을 8kHz 이상으로 설정할 수 있습니다. 예를 들어 Microphone.rate 속성의 값을 11로 설정하면 샘플링 속도가 11kHz로 지정되고, 22로 설정

하면 샘플링 속도가 22kHz로 지정됩니다.

Page 24: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

578 사운드를 사용한 작업

마이크 활동 감지역폭과 처리 리소스를 보존하기 위해 Flash Player는 마이크가 사운드를 전송하지 않는 때

를 감지하려고 합니다. 마이크의 활동 레벨이 일정 시간 동안 묵음 레벨 임계값 미만을 유지

하면 Flash Player는 오디오 입력 전송을 중지하고 신 단순 ActivityEvent를 전달합니다.

Microphone 클래스의 다음 세 가지 속성은 활동을 모니터링하고 제어합니다.

■ 읽기 전용 activityLevel 속성은 마이크가 감지하는 사운드의 양을 0~100의 등급으로

나타냅니다.■ silenceLevel 속성은 마이크 활성화에 필요한 사운드의 양을 지정하고

ActivityEvent.ACTIVITY 이벤트를 전달합니다. silenceLevel 속성도 0~100의 등급을 사용하고 기본값은 10입니다.

■ silenceTimeout 속성은 마이크가 현재 사용 중이지 않음을 알리기 위해 ActivityEvent.ACTIVITY 이벤트가 전달될 때까지 활동 레벨이 묵음 수준 미만을 유지

해야 하는 시간을 밀리초 단위로 정의합니다. 기본 silenceTimeout 값은 2000입니다.

Microphone.silenceLevel 속성과 Microphone.silenceTimeout 속성은 읽기 전용이지만

Microphone.setSilenceLevel() 메서드를 사용하여 이 값을 변경할 수 있습니다.

새로운 활동이 감지되었을 때 마이크를 활성화하는 프로세스에서 약간의 지연이 발생하는 경우도 있습니다. 마이크를 항상 활성화시켜 두면 이러한 활성화 지연을 방지할 수 있습니다. 응용 프로그램이 silenceLevel 매개 변수를 0으로 설정하여 Microphone.setSilenceLevel() 메서드를 호출하면 Flash Player는 사운드가 감지되지 않더

라도 마이크의 활성 상태를 유지하고 오디오 데이터를 계속 수집합니다. 반 로, silenceLevel 매개 변수를 100으로 설정하면 마이크가 전혀 활성화되지 않습니다.

다음 예제는 마이크에 한 정보를 표시하고 Microphone 객체가 전달한 activity 이벤트 및status 이벤트를 보고합니다.import flash,events.ActivityEvent;import flash,events.StatusEvent;import flash.media.Microphone;

var deviceArray:Array = Microphone.names;trace("Available sound input devices:");for (var i:int = 0; i < deviceArray.length; i++){

trace(" " + deviceArray[i]);}

var mic:Microphone = Microphone.getMicrophone();mic.gain = 60;mic.rate = 11;mic.setUseEchoSuppression(true);mic.setLoopBack(true);mic.setSilenceLevel(5, 1000);

Page 25: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

사운드 입력 캡처 579

mic.addEventListener(ActivityEvent.ACTIVITY, this.onMicActivity);mic.addEventListener(StatusEvent.STATUS, this.onMicStatus);

var micDetails:String = "Sound input device name: " + mic.name + '\n';micDetails += "Gain: " + mic.gain + '\n';micDetails += "Rate: " + mic.rate + " kHz" + '\n';micDetails += "Muted: " + mic.muted + '\n';micDetails += "Silence level: " + mic.silenceLevel + '\n';micDetails += "Silence timeout: " + mic.silenceTimeout + '\n';micDetails += "Echo suppression: " + mic.useEchoSuppression + '\n';trace(micDetails);

function onMicActivity(event:ActivityEvent):void{

trace("activating=" + event.activating + ", activityLevel=" + mic.activityLevel);

}

function onMicStatus(event:StatusEvent):void{

trace("status: level=" + event.level + ", code=" + event.code);}

위 예제를 실행할 때 시스템 마이크에 고 말하거나 소리를 낸 다음, 콘솔이나 디버그 윈도

우에 표시되는 결과 trace 문을 확인합니다.

미디어 서버에서의 오디오 송수신Flash Media Server와 같은 스트리밍 미디어 서버와 함께 ActionScript를 사용할 때 추가 오디

오 기능을 사용할 수 있습니다.

특히 응용 프로그램은 Microphone 객체를 NetStream 객체에 연결하여 마이크에서 서버로 직접 데이터를 전송할 수 있습니다. 또한 오디오 데이터는 서버에서 Flash 또는 Flex 응용 프로그

램으로 스트리밍되어 MovieClip의 일부로서 또는 Video 객체를 사용하여 재생될 수 있습니다.

자세한 내용은 http://livedocs.macromedia.com_kr에서 온라인으로 제공되는 Flash Media Server 설명서를 참조하십시오.

Page 26: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

580 사운드를 사용한 작업

예제: Podcast Player포드캐스트는 인터넷이나 주문 또는 구독을 통해 배포되는 사운드 파일입니다. 일반적으로

포드캐스트는 포드캐스트 채널이라고도 하는 시리즈의 일부로 제작됩니다. 포드캐스트 에피소드는 길이가 1분이 될 수도 있고 몇 시간이 될 수도 있으므로 일반적으로 스트리밍으

로 재생됩니다. 포드캐스트 에피소드는 아이템이라고도 하며 보통 mp3 파일 포맷으로 전달

됩니다. 비디오 포드캐스트도 널리 사용되지만 이 샘플 응용 프로그램은 mp3 파일을 사용하

는 오디오 포드캐스트만 재생합니다.

이 예제는 모든 기능을 갖춘 포드캐스트 수집기 응용 프로그램이 아닙니다. 예를 들어, 특정

포드캐스트에 한 구독을 관리하지 않으며 사용자가 이전에 들은 포드캐스트가 다음에 응용 프로그램이 실행될 때 기억되지 않습니다. 이 예제는 더 복잡한 기능의 포드캐스트 수집

기 작성을 위한 토 가 될 수 있습니다.

Podcast Player 예제는 다음과 같은 ActionScript 프로그래밍 기술을 보여 줍니다.

■ 외부 RSS 피드 읽기 및 해당 XML 내용 파싱

■ SoundFacade 클래스를 만들어 사운드 파일을 간편하게 로드 및 재생

■ 사운드 재생 진행률 표시

■ 사운드 재생 일시 정지 및 다시 시작

이 샘플에 한 응용 프로그램 파일을 가져오려면 www.adobe.com/go/learn_programmingAS3samples_flash_kr을 참조하십시오. Podcast Player 응용 프로그램 파일

은 Samples/PodcastPlayer 폴더에 있습니다. 이 응용 프로그램은 다음과 같은 파일로 구성됩

니다.

파일 설명

PodcastPlayer.mxml또는

PodcastPlayer.fla

Flex(MXML) 또는 Flash(FLA)용 응용 프로그램

의 사용자 인터페이스입니다.

RSSBase.as RSSChannel 클래스와 RSSItem 클래스에 대한 일반 속성 및 메서드를 제공하는 기본 클래스입니다.

RSSChannel.as RSS 채널에 대한 데이터를 보관하는 ActionScript 클래스입니다.

RSSItem.as RSS 항목에 대한 데이터를 보관하는 ActionScript 클래스입니다.

SoundFacade.as 응용 프로그램에 대한 기본 ActionScript 클래스입

니다. Sound 클래스와 SoundChannel 클래스의 메서드 및 이벤트를 캡슐화하고 재생 일시 정지 및 다시 시작에 대한 지원을 추가합니다.

Page 27: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

예제: Podcast Player 581

포드캐스트 채널용 RSS 데이터 읽기Podcast Player 응용 프로그램은 몇 개의 포드캐스트 채널과 해당 에피소드에 한 정보를 읽는

것으로 시작합니다.

1. 먼저 응용 프로그램은 포드캐스트 채널 목록이 포함된 XML 구성 파일을 읽고 채널 목록

을 사용자에게 표시합니다.

2. 사용자가 포드캐스트 채널 중 하나를 선택하면 응용 프로그램은 채널에 한 RSS 피드를

읽고 채널 에피소드 목록을 표시합니다.

이 예제는 URLLoader 유틸리티 클래스를 사용하여 원격 위치 또는 로컬 파일로부터 텍스트

기반 데이터를 가져옵니다. Podcast Player는 먼저 playerconfig.xml 파일로부터 XML 포맷의

RSS 피드 목록을 가져오기 위한 URLLoader 객체를 만듭니다. 그리고 사용자가 목록에서 특정 피드를 선택하면 새로운 URLLoader 객체가 만들어져 해당 피드의 URL로부터 RSS 데이

터를 읽습니다.

SoundFacade 클래스를 사용하여 사운드 로드 및 재생 단순화ActionScript 3.0 사운드 아키텍처는 강력하지만 복잡합니다. 기본적인 사운드 로드와 재생

기능만 필요한 응용 프로그램은 간단한 메서드 호출 및 이벤트 집합을 제공하여 일부 복잡한

기능을 숨기는 클래스를 사용할 수 있습니다. 이러한 클래스는 소프트웨어 디자인 패턴 분야

에서 facade라고 합니다.

SoundFacade 클래스는 다음과 같은 작업을 수행하는 단일 인터페이스를 제공합니다.

■ Sound 객체, SoundLoaderContext 객체 및 SoundMixer 클래스를 사용하여 사운드 파일

로드

■ Sound 객체 및 SoundChannel 객체를 사용하여 사운드 파일 재생

■ 재생 진행률 이벤트 전달

■ Sound 객체 및 SoundChannel 객체를 사용하여 사운드 재생 일시 정지 및 다시 시작

SoundFacade 클래스는 부분의 ActionScript 사운드 클래스 기능을 보다 단순하게 제공하려

고 합니다.

URLService.as 원격 URL로부터 데이터를 가져오는 ActionScript 클래스입니다.

playerconfig.xml 포드캐스트 채널을 나타내는 RSS 피드 목록이 포함

된 XML 파일입니다.

파일 설명

Page 28: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

582 사운드를 사용한 작업

다음 코드는 클래스 선언, 클래스 속성 및 SoundFacade() 생성자 메서드를 보여 줍니다.public class SoundFacade extends EventDispatcher{

public var s:Sound;public var sc:SoundChannel;public var url:String;public var bufferTime:int = 1000;

public var isLoaded:Boolean = false;public var isReadyToPlay:Boolean = false;public var isPlaying:Boolean = false;public var isStreaming:Boolean = true;public var autoLoad:Boolean = true;public var autoPlay:Boolean = true;

public var pausePosition:int = 0;

public static const PLAY_PROGRESS:String = "playProgress";public var progressInterval:int = 1000;public var playTimer:Timer;

public function SoundFacade(soundUrl:String, autoLoad:Boolean = true,autoPlay:Boolean = true, streaming:Boolean = true, bufferTime:int = -1):void

{this.url = soundUrl;

// 이 객체의 비헤이비어를 결정하는 Boolean 값을 설정합니다 .this.autoLoad = autoLoad;this.autoPlay = autoPlay;this.isStreaming = streaming;

// 전역 bufferTime 값이 기본값으로 사용됩니다 .if (bufferTime < 0){

bufferTime = SoundMixer.bufferTime;}

// 0-30초의 적절한 버퍼링 시간을 유지합니다 .

this.bufferTime = Math.min(Math.max(0, bufferTime), 30000); if (autoLoad){

load();}

}

Page 29: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

예제: Podcast Player 583

SoundFacade 클래스는 EventDispatcher 클래스를 확장하여 자체의 이벤트를 전달하도록 합니

다. 이 클래스 코드는 먼저 Sound 객체와 SoundChannel 객체의 속성을 선언합니다. 이 클래

스는 사운드를 스트리밍할 때 사용할 bufferTime 속성과 사운드 파일의 URL 값도 저장합

니다. 또한 로딩 및 재생 비헤이비어에 영향을 미치는 다음과 같은 몇 가지 부울 매개 변수 값을 받습니다.

■ autoLoad 매개 변수는 객체가 만들어지면 바로 사운드 로드를 시작하도록 객체에 지시합

니다.■ autoPlay 매개 변수는 충분한 사운드 데이터가 로드되면 바로 재생을 시작함을 나타냅

니다. 스트리밍 사운드의 경우에는 bufferTime 속성에 지정된 충분한 데이터가 로드되

었을 때 재생이 시작됩니다.■ streaming 매개 변수는 로드가 완료되기 전에 이 사운드 파일 재생을 시작할 수 있음을

나타냅니다.

bufferTime 매개 변수의 기본값은 -1입니다. 생성자 메서드가 bufferTime 매개 변수에서

음수 값을 감지하면 bufferTime 속성이 SoundMixer.bufferTime 값으로 설정됩니다. 이렇

게 되면 필요한 전역 SoundMixer.bufferTime 값으로 응용 프로그램의 기본값이 설정될 수있습니다.

autoLoad 매개 변수가 true로 설정된 경우, 생성자 메서드는 즉시 다음 load() 메서드를 호출

하여 사운드 파일 로드를 시작합니다.public function load():void{

if (this.isPlaying){

this.stop();this.s.close();

}this.isLoaded = false;

this.s = new Sound();

this.s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress);this.s.addEventListener(Event.OPEN, onLoadOpen);this.s.addEventListener(Event.COMPLETE, onLoadComplete);this.s.addEventListener(Event.ID3, onID3);this.s.addEventListener(IOErrorEvent.IO_ERROR, onIOError);this.s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onIOError);

var req:URLRequest = new URLRequest(this.url);

var context:SoundLoaderContext = new SoundLoaderContext(this.bufferTime,true);

this.s.load(req, this.slc);}

Page 30: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

584 사운드를 사용한 작업

load() 메서드는 새로운 Sound 객체를 생성한 후 모든 중요 사운드 이벤트에 한 리스너를

추가합니다. 그런 다음 Sound 객체에 사운드 파일 로드를 지시하고 SoundLoaderContext 객체를 사용하여 bufferTime 값을 전달하도록 합니다.

url 속성은 변경 가능하므로, SoundFacade 인스턴스를 사용하여 여러 사운드 파일을 연속적

으로 재생할 수 있습니다. url 속성을 변경하고 load() 메서드를 호출하기만 하면 새 사운드

파일이 로드됩니다.

다음 세 가지 이벤트 리스너 메서드는 SoundFacade 객체가 로드 프로세스를 추적하고 사운

드 재생 시점을 결정하는 방법을 보여 줍니다.public function onLoadOpen(event:Event):void{

if (this.isStreaming){

this.isReadyToPlay = true;if (autoPlay){

this.play();}

}this.dispatchEvent(event.clone());

}

public function onLoadProgress(event:ProgressEvent):void{

this.dispatchEvent(event.clone());}

public function onLoadComplete(event:Event):void{

this.isReadyToPlay = true;this.isLoaded = true;this.dispatchEvent(evt.clone());

if (autoPlay && !isPlaying){

play();}

}

사운드 로드가 시작되면 onLoadOpen() 메서드가 실행됩니다. 사운드가 스트리밍 모드에서

재생될 수 있는 경우 onLoadComplete() 메서드는 즉시 isReadyToPlay 플래그를 true로설정합니다. isReadyToPlay 플래그는 사용자가 재생 버튼을 클릭하는 등의 액션을 수행할

때 응용 프로그램이 사운드 재생을 시작할 수 있는지 여부를 결정합니다. SoundChannel 클래스는 사운드 데이터의 버퍼링을 관리하므로 play() 메서드를 호출하기 전에 충분한 데이

터가 로드되었는지 명시적으로 확인할 필요가 없습니다.

Page 31: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

예제: Podcast Player 585

onLoadProgress() 메서드는 로드 프로세스 중에 정기적으로 실행됩니다. 이 메서드는 이 SoundFacade 객체를 사용하는 코드가 사용할 해당 ProgressEvent 객체의 복제본을 전달합니다.

사운드 데이터가 완전히 로드되었으면 onLoadComplete() 메서드가 실행되어, 필요한 경우

비스트리밍 사운드에 해 play() 메서드를 호출합니다. play() 메서드는 아래와 같습니다. public function play(pos:int = 0):void{

if (!this.isPlaying){

if (this.isReadyToPlay){

this.sc = this.s.play(pos);this.sc.addEventListener(Event.SOUND_COMPLETE, onPlayComplete);this.isPlaying = true;

this.playTimer = new Timer(this.progressInterval);this.playTimer.addEventListener(TimerEvent.TIMER, onPlayTimer);this.playTimer.start();

}}

}

사운드 재생 준비가 되었으면 play() 메서드가 Sound.play() 메서드를 호출합니다. 결과 SoundChannel 객체는 sc 속성에 저장됩니다. 그런 다음 play() 메서드는 재생 진행률 이벤

트를 정기적으로 전달하는 데 사용될 Timer 객체를 만듭니다.

재생 진행률 표시재생 모니터링을 구동하는 Timer 객체 생성은 복잡한 작업으로 한 번만 코딩해야 합니다. 이 Timer 논리를 SoundFacade 클래스 등의 다시 사용할 수 있는 클래스에 캡슐화하면 사운드

로드와 재생 시 동일한 종류의 진행률 이벤트를 응용 프로그램이 수신할 수 있습니다.

SoundFacade.play() 메서드가 생성한 Timer 객체는 매 초마다 TimerEvent 인스턴스를 전달

합니다. 다음 onPlayTimer() 메서드는 새 TimerEvent가 도착할 때마다 실행됩니다.public function onPlayTimer(event:TimerEvent):void {

var estimatedLength:int = Math.ceil(this.s.length / (this.s.bytesLoaded / this.s.bytesTotal));

var progEvent:ProgressEvent = new ProgressEvent(PLAY_PROGRESS, false, false, this.sc.position,

estimatedLength);this.dispatchEvent(progEvent);

}

Page 32: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

586 사운드를 사용한 작업

onPlayTimer() 메서드는 566페이지의 “재생 모니터링” 단원에 설명된 크기 예측 기법을 구현합니다. 그런 다음, 이벤트 유형이 SoundFacade.PLAY_PROGRESS bytesLoaded 속성이 SoundChannel 객체의 현재 위치로 설정되고 bytesTotal 속성이 사운드 데이터의 추정된 길이로 설정된 새로운 ProgressEvent 인스턴스를 만듭니다.

재생 일시 정지 및 다시 시작앞에서 설명한 SoundFacade.play() 메서드는 사운드 데이터의 시작 위치에 해당하는 pos매개 변수를 받습니다. pos 값이 0이면 사운드는 처음부터 재생을 시작합니다.

아래와 같이 SoundFacade.stop() 메서드도 pos 매개 변수를 받습니다.public function stop(pos:int = 0):void{

if (this.isPlaying){

this.pausePosition = pos;this.sc.stop();this.playTimer.stop();this.isPlaying = false;

}}

SoundFacade.stop() 메서드가 호출될 때마다 동일한 사운드의 재생을 사용자가 다시 시작

하려는 경우 응용 프로그램이 재생 헤드의 위치를 지정할 수 있도록 pausePosition 속성이

설정됩니다.

아래와 같은 SoundFacade.pause() 및 SoundFacade.resume() 메서드는 SoundFacade.stop() 및 SoundFacade.play() 메서드를 각각 호출하여 pos 매개 변수 값을 전달합니다.public function pause():void{

stop(this.sc.position);}

public function resume():void{

play(this.pausePosition);}

pause() 메서드는 현재의 SoundChannel.position 값을 play() 메서드에 전달하고 play() 메서드는 해당 값을 pausePosition 속성에 저장합니다. resume() 메서드는 pausePosition 값을 시작 위치로 사용하여 동일한 사운드의 재생을 다시 시작합니다.

Page 33: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

예제: Podcast Player 587

Podcast Player 예제 확장이 예제에서는 재사용 가능한 SoundFacade 클래스의 기능을 보여 주는 Podcast Player의 핵심

을 나타냅니다. 이 응용 프로그램의 기능을 확장하기 위해 다음과 같은 기타 기능을 추가할

수 있습니다.

■ 사용자가 응용 프로그램을 다음에 실행할 때 사용할 수 있는 SharedObject 인스턴스에 각에피소드와 관련한 피드 및 사용 정보 목록을 저장합니다.

■ 사용자가 자신의 RSS 피드를 포드캐스트 채널 목록에 추가할 수 있도록 합니다.■ 사용자가 에피소드를 중지하거나 종료했을 때 재생 헤드의 위치를 기억하여 사용자가

다음에 응용 프로그램을 실행할 때 해당 위치에서 다시 시작할 수 있도록 합니다.■ 사용자가 인터넷에 연결되어 있지 않을 때 오프라인 상태에서 수신하도록 에피소드 mp3

파일을 다운로드합니다.■ 포드캐스트 채널에서 새로운 에피소드가 있는지 정기적으로 확인하고 에피소드 목록을

자동으로 업데이트하는 구독 기능을 추가합니다.■ Odeo.com 등의 포드캐스트 호스팅 서비스로부터 API를 사용하여 포드캐스트 검색 및 탐

색 기능을 추가합니다.

Page 34: ACTIONSCRIPT™ 3.0 프로그래밍 · 555 제20 장 20 사운드를 사용한 작업 ActionScript로 대화식 몰입형 응용 프로그램을 만들 수 있습니다.강력한

588 사운드를 사용한 작업