외부 사운드 파일 로드
Flash Player 9 이상, Adobe AIR 1.0 이상
Sound 클래스의 각 인스턴스는 특정 사운드 리소스의 재생을 로드 및 트리거하기 위한 것입니다. 응용 프로그램에서 Sound 객체를 다시 사용하여 둘 이상의 사운드를 로드할 수 없습니다. 새로운 사운드 리소스를 로드하려면 새로운 Sound 객체를 만들어야 합니다.
작은 사운드 파일(예: 버튼에 연결될 클릭 사운드)을 로드하는 경우 응용 프로그램에서 새로운 Sound를 만들어 아래와 같이 사운드 파일을 자동으로 로드할 수 있습니다.
var req:URLRequest = new URLRequest("click.mp3");
var s:Sound = new Sound(req);
Sound() 생성자는 URLRequest 객체를 첫 번째 매개 변수로 받습니다. URLRequest 매개 변수의 값이 제공되면 새로운 Sound 객체는 지정된 사운드 리소스를 자동으로 로드합니다.
아주 단순한 경우를 제외하고는 응용 프로그램은 사운드의 로드 진행률을 살피고 로드 중에 오류가 발생하지 않는지 확인해야 합니다. 예를 들어 클릭 사운드의 용량이 꽤 큰 경우 사운드를 트리거하는 버튼을 사용자가 클릭할 때 사운드가 완전히 로드되지 않을 수 있습니다. 로드되지 않은 사운드를 재생하려고 하면 런타임 오류가 발생할 수 있습니다. 사운드 재생을 시작하는 액션을 취하도록 허용하기 전에 사운드가 완전히 로드될 때까지 기다리는 것이 안전합니다.
Sound 객체는 사운드 로드 프로세스 중에 여러 가지 이벤트를 전달합니다. 응용 프로그램은 이러한 이벤트를 수신하여 로드 진행률을 추적하고 사운드 재생 전에 사운드가 완전히 로드되도록 할 수 있습니다. 다음 표에서는 Sound 객체가 전달할 수 있는 이벤트를 설명합니다.
이벤트
|
설명
|
open(Event.OPEN)
|
사운드 로드 작업이 시작되기 직전에 전달됩니다.
|
progress(ProgressEvent.PROGRESS)
|
사운드 로드 프로세스 중에 파일 또는 스트림으로부터 데이터를 수신할 때 정기적으로 전달됩니다.
|
id3(Event.ID3)
|
mp3 사운드에 대해 ID3 데이터를 사용할 수 있는 경우 전달됩니다.
|
complete(Event.COMPLETE)
|
모든 사운드 리소스 데이터가 로드되었을 때 전달됩니다.
|
ioError(IOErrorEvent.IO_ERROR)
|
사운드 파일을 찾을 수 없거나 모든 사운드 데이터를 수신하기 전에 로드 프로세스가 중단된 경우 전달됩니다.
|
다음 코드는 사운드 로드 완료 후 재생 방법을 보여 줍니다.
import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;
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 및 AIR를 사용하면 사운드를 완전히 로드하기 전에도 응용 프로그램에서 사운드를 재생할 수 있으며 로드된 사운드 데이터의 양과 이미 재생된 사운드의 양을 표시할 수도 있습니다.
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));
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 프레임워크 또는 Adobe Flash 제작 도구와 함께 제공됨)를 쉽게 업데이트할 수 있습니다.
또한 이 예제에서는 사운드 파일을 로드할 때 응용 프로그램이 어떻게 오류를 인식하고 이에 응답하는지 보여 줍니다. 예를 들어 특정 파일 이름을 가진 사운드 파일을 찾을 수 없는 경우, Sound 객체가 Event.IO_ERROR 이벤트를 전달합니다. 이전 코드에서는 오류가 발생할 때 onIOError() 메서드가 실행되고 간단한 오류 메시지가 표시됩니다.