응용 프로그램은 사운드 재생이 언제 중지되는지 인식하여 다른 사운드 재생을 시작하거나 이전 재생 중에 사용된 일부 리소스를 정리할 수 있습니다. 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 객체의
bytesLoaded
및
bytesTotal
속성을 사용하여 사운드 데이터의 최종 길이를 추정할 수 있습니다.
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 클래스를 사용하여 고유한 시간 메커니즘을 설정할 수 있습니다.
날짜 및 시간을 사용한 작업
을 참조하십시오.