Возможно, приложению потребуется информация о том, когда заканчивается воспроизведение одного звука, чтобы запустить другой или удалить ресурсы, использованные при предыдущем воспроизведении. Класс 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 не отправляет события progress во время воспроизведения. Чтобы регистрировать прогресс воспроизведения, приложение может создать собственный механизм контроля времени и отслеживать позицию точки воспроизведения.
Чтобы вычислить, какой процент звука уже воспроизведен, можно разделить значение свойства
SoundChannel.position
на продолжительность аудиоданных.
var playbackPercent:uint = 100 * (channel.position / snd.length);
Однако этот код сообщает точные проценты воспроизведения, только если оно началось после полной загрузки аудиоданных. Свойство
Sound.length
показывает размер загруженных на данный момент аудиоданных, а не конечный размер всего аудиофайла. Чтобы отслеживать прогресс воспроизведения потокового звука, загрузка которого еще не завершилась, приложение должно подсчитать конечный размер полного аудиофайла и использовать это значение в вычислениях. Подсчитать конечную продолжительность аудиоданных можно с помощью свойств
bytesLoaded
и
bytesTotal
объекта Sound, как показано ниже.
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
, а для объекта SoundChannel — прослушиватель события
Event.SOUND_COMPLETE
, которое отправляется после завершения воспроизведения.
Каждый раз, когда приложение достигает следующего кадра анимации, вызывается метод
onEnterFrame()
. Метод
onEnterFrame()
рассчитывает общую продолжительность аудиофайла на основе уже загруженного объема данных, а затем вычисляет и отображает текущий процент воспроизведения.
По завершении воспроизведения всего звука выполняется метод
onPlaybackComplete()
, который удаляет прослушиватель события
Event.ENTER_FRAME
, чтобы предотвратить попытки отображения обновлений прогресса после окончания воспроизведения.
Событие
Event.ENTER_FRAME
может отправляться много раз в секунду. Иногда отображать прогресс воспроизведения с такой частотой не требуется. В таких случаях приложение может создать собственный механизм определения времени с помощью класса flash.util.Timer. Сведения см. в разделе
Работа с датами и временем
.