Дополню ответом: чтоб прервать загрузку данных не обходимо отстановить звуковой канал и закрыть объект Sound
т.е. вот так:
Код | // если звук уже проирывается и нам нужно чтоб в этот момент быстро загрузить другой звуковой файл if(s){ sc.stop(); // вырубили звуковой канал // вот если этот try тут не поставить, то при попытки загрузить сразу новый звуковой файл, AS3 будет выдавать ошибки. Тут такой вот парадокс, это блок try как бы подавляет ошибку и с ним, в данном месте, работается более гладко. try{ s.close(); // вырубили звуковой объект } catch(error:Error){ trace(error); } PAUSE_POS = 0; }
|
Добавлено через 6 минут и 6 секунд Переписал музыкальный флеш-плеер, хотел оформить в виде класса, чтоб удобно было работать, но в силу не глубокого знания как там потом подключать эти классы не сделал, сделал структурно. Так же хотелось чтоб минимум было файлов связанных с плеером, к примеру *swf и один *.as. Если бы через класс писать, то наверно бы получилось 3 файла. В общем парится не стал и через ф-ии написал в одном файле. Выложу весь код кому интересно.
Код | import flash.events.Event; import flash.events.ProgressEvent; import flash.media.Sound; import flash.media.SoundLoaderContext; import flash.media.SoundChannel; import flash.net.URLRequest;
var s:Sound; var sc:SoundChannel; var TRANS:SoundTransform; var PLAYING:Boolean = false; var PAUSE_POS:int = 0; var VOLUME:Number = 0.8; var LOADED_PCT:uint = 0; var BUFFER_SIZE:int = 5000;
if(ExternalInterface.available){ var readyTimer:Timer = new Timer(100); readyTimer.addEventListener(TimerEvent.TIMER, timerHandler); readyTimer.start(); }
// проверяем готовность документа тоже function checkReady():Boolean{ var result:Boolean = ExternalInterface.call("Player.isEnabled"); return result; } function timerHandler(event:TimerEvent):void{ var isReady:Boolean = checkReady(); if(isReady){ Timer(event.target).stop(); setupCallbacks(); } }
// делаем связть между js и as function setupCallbacks():void{ ExternalInterface.addCallback("playMp3JS", playMp3AS); ExternalInterface.addCallback("pauseMp3JS", pauseMp3AS); ExternalInterface.addCallback("unPauseMp3JS", unPauseMp3AS); ExternalInterface.addCallback("seekMp3JS", seekMp3AS); ExternalInterface.addCallback("setVolumeJS", setVolumeAS); ExternalInterface.addCallback("fadeOutSndJS", fadeOutSndAS); }
function playMp3AS(url){ if(PLAYING) removeEventListener(Event.ENTER_FRAME, onEnterFrame); if(s){ sc.stop(); try{ s.close(); } catch(error:Error){ trace(error); } PAUSE_POS = 0; } s = new Sound(); sc = new SoundChannel(); s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress); s.addEventListener(Event.COMPLETE, onLoadComplete); // определяем размер буфера s.load(new URLRequest(url), new SoundLoaderContext(BUFFER_SIZE, true)); TRANS = new SoundTransform(VOLUME, 0); // устанавливаем громмоксть на 0.8 и панараму в 0 sc = s.play(0, 0, TRANS); sc.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); addEventListener(Event.ENTER_FRAME, onEnterFrame); LOADED_PCT = 0; PLAYING = true; } function pauseMp3AS():void{ if(!PLAYING) return; PAUSE_POS = sc.position; sc.stop(); removeEventListener(Event.ENTER_FRAME, onEnterFrame); PLAYING = false; } function unPauseMp3AS():void{ if(PLAYING) return; sc = s.play(PAUSE_POS, 0, TRANS); sc.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); // необходим, после стопа он теряется addEventListener(Event.ENTER_FRAME, onEnterFrame); PLAYING = true; } function seekMp3AS(pos:int):void{ var transform:SoundTransform = sc.soundTransform; sc.stop(); sc = s.play(pos, 0, transform); sc.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); // необходим, после стопа он теряется if(!PLAYING) addEventListener(Event.ENTER_FRAME, onEnterFrame); PLAYING = true; } function setVolumeAS(vol:Number):void{ var transform:SoundTransform = sc.soundTransform; transform.volume = VOLUME = vol; sc.soundTransform = transform; }
// когда идет загрузка данных function onLoadProgress(event:ProgressEvent):void{ var temp = Math.round(100 * (event.bytesLoaded/event.bytesTotal)); if(LOADED_PCT < temp){ ExternalInterface.call("Player.onloadProgressJS", temp); LOADED_PCT = temp; } }
// когда файл полностью загружен function onLoadComplete(event:Event):void{}
// когда происходит конец музыки function onPlaybackComplete(event:Event):void{ removeEventListener(Event.ENTER_FRAME, onEnterFrame); ExternalInterface.call("Player.onPlayBackCompleate"); PLAYING = false; PAUSE_POS = 0; sc.stop(); }
// вычисляем время в момент которого звучит музыка function onEnterFrame(event:Event):void{ ExternalInterface.call("Player.updateTime", sc.position); }
// затихание музыки function fadeOutSndAS():void{ var readyTimer:Timer = new Timer(50); readyTimer.addEventListener(TimerEvent.TIMER, fadeOutSndChild); readyTimer.start(); } function fadeOutSndChild(event:TimerEvent):void{ var transform:SoundTransform = sc.soundTransform; var cur_vol:Number = transform.volume * 100 - 10; transform.volume = (cur_vol < 10)? 0: cur_vol/100; sc.soundTransform = transform; if(!transform.volume) Timer(event.target).stop(); }
|
|