звуковой поток перестает загружаться - PullRequest
1 голос
/ 28 января 2011

У меня есть небольшой сценарий звукового потока, но иногда, если вы нажимаете кнопку воспроизведения на следующую дорожку до того, как текущая загрузка будет завершена, следующая дорожка не завершится.

package player {
    import flash.events.Event;
    import flash.display.Sprite;
    import flash.external.ExternalInterface;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.net.URLRequest;

    import player.Loader_bar;

    public class Stream extends Sprite {
        private var _Sound = null;
        private var _Channel = null;

        private var isLoading = false;

        private var _Loader_bar = null;
        public var loader_color = null;
        public var loader_width = 0;
        public var loader_height = 0;

        private var i = 0;

        public function Stream(){
            this._Loader_bar = new Loader_bar();
            addChild(this._Loader_bar);
        }

        public function cnstr(){
            this._Loader_bar.color = this.loader_color;
            this._Loader_bar.w = this.loader_width;
            this._Loader_bar.h = this.loader_height;
            this._Loader_bar.cnstr();
        }

        public function play(url){
            this.stop();
            this.close();

            this._Sound = new Sound();
            this.isLoading = true;

            this.addEventListener(Event.ENTER_FRAME, listener_bytesLoaded);
            this._Sound.addEventListener(Event.COMPLETE, listener_loadedComplete);

            this._Sound.load(new URLRequest(url));
            this._Channel = this._Sound.play();
        }

        public function stop(){
            if(this._Channel){
                this._Channel.stop();
            }
        }

        private function close(){
            if(this.isLoading){
                this._Sound.close();
            }
        }

        private function listener_loadedComplete(event){
            this.close();

            this.isLoading = false;

            this.removeEventListener(Event.ENTER_FRAME, listener_bytesLoaded);
        }

        private function listener_bytesLoaded(event){
            var float = this._Sound.bytesLoaded / this._Sound.bytesTotal;
            this._Loader_bar.progress(float);

            var data = {
                i : this.i,
                float : float,
                loaded : this._Sound.bytesLoaded,
                total : this._Sound.bytesTotal
                };
            ExternalInterface.call('swf2js', 'tst_progress', data);
            this.i++;
        }
    }
}

1 Ответ

1 голос
/ 28 января 2011

близко (): недействительным Закрывает поток, вызывая прекращение любой загрузки данных.

попробуйте это:

создайте логическое значение типа hasLoaded , установите для него значение false. Когда звук успешно загрузится, установите его в значение true.

Затем при воспроизведении звука вы можете проверить наличие hasLoaded в функции play () . Если вы вызывали play () до загрузки предыдущего звука, hasLoaded будет иметь значение false, в этом случае вы вызываете this._Sound.close () до создание и загрузка нового звука. Причина тестирования вместо простого вызова close () заключается в том, что если вы приостановили поток, вам не нужно перезагружать его, чтобы воспроизвести его снова.

Сложение:

Что касается нагрузки, которая не сообщает должным образом, у вас неправильно настроена логика выполнения. Попробуйте это:

1) импорт flash.events.ProgressEvent

2) Для слушателя замените this.addEventListener (Event.ENTER_FRAME, listener_bytesLoaded); в вашем методе play () с помощью this._Sound.addEventListener (ProgressEvent.PROGRESS, listener_bytesLoaded);

3) Измените метод listener_bytesLoaded () следующим образом:

private function listener_bytesLoaded(event:ProgressEvent)
{
    var percent = event.bytesLoaded / event.bytesTotal;
    this._Loader_bar.progress(percent);

    var data = {
            i : this.i,
            float : percent,
            loaded : event.bytesLoaded,
            total : event.bytesTotal
            };

        ExternalInterface.call('swf2js', 'tst_progress', data);
        this.i++;
    }

4) Изменить this.removeEventListener (Event.ENTER_FRAME, listener_bytesLoaded); в вашем методе listener_loadedComplete () для this._Sound.removeEventListener (ProgressEvent.PROGRESS, listener_bytesLoaded); а затем переместите его из этого метода и поместите его в условное выражение в методе close ().

ПРИМЕЧАНИЕ. На самом деле я не компилировал, но думаю, что это хорошо. Надеюсь, это поможет. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...