사운드 재생

Flash Player 9 이상, Adobe AIR 1.0 이상

로드된 사운드의 재생은 아래와 같이 Sound 객체에 대한 Sound.play() 메서드를 호출하는 것처럼 간단할 수 있습니다.

var snd:Sound = new Sound(new URLRequest("smallSound.mp3")); 
snd.play();

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

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

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

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

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

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

재생 중에 이러한 작업을 수행하려면 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();

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

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(); 
var req:URLRequest = new URLRequest("smallSound.mp3"); 
snd.load(req); 
 
var channel:SoundChannel = snd.play(); 
channel.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 객체의 bytesLoadedbytesTotal 속성을 사용하여 사운드 데이터의 최종 길이를 추정할 수 있습니다.

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

다음 코드는 좀 더 큰 사운드 파일을 로드하며, 재생 진행률을 표시하는 데 Event.ENTER_FRAME 이벤트를 시간 메커니즘으로 사용합니다. 그리고 현재 위치 값을 사운드 데이터의 전체 길이로 나누어 계산되는 재생 백분율을 정기적으로 보고합니다.

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); 
channel.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 클래스를 사용하여 고유한 시간 메커니즘을 설정할 수 있습니다. 날짜 및 시간을 사용한 작업을 참조하십시오.

사운드 스트리밍 중단

스트리밍되는 사운드 즉, 재생하는 동안 계속 로드되는 사운드의 경우 재생 프로세스에 이상 현상이 발생하기도 합니다. 스트리밍 사운드를 재생 중인 SoundChannel 인스턴스에서 응용 프로그램이 SoundChannel.stop() 메서드를 호출하면 한 프레임에 대한 사운드 재생이 중지되고 다음 프레임에서 사운드를 처음부터 다시 재생합니다. 이러한 현상이 나타나는 이유는 사운드 로드 프로세스가 아직 진행 중이기 때문입니다. 스트리밍 사운드의 로드와 재생을 모두 중단하려면 Sound.close() 메서드를 호출합니다.