Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вопрос по методу sound.extract() и памяти (http://www.flasher.ru/forum/showthread.php?t=149168)

TWETTI 20.01.2011 11:24

Вопрос по методу sound.extract() и памяти
 
Я загружаю во флеш звук и хочу отобразить его спектр. Делаю я это с помощью метода sound.extract. Я загрузил mp3 файл 15Мб и этот метод съел 200 Мб оперативной памяти. Как можно уменьшить потребление памяти?

alatar 20.01.2011 11:38

Это вопрос из серии: я распаковал zip архив и получил файл размером 200Мб, как уменьшить потребление памяти?
Вы получили из сжатого формата несжатые данные, что вы собрались уменьшать?
Как вариант, экстрактите частями, без сохранения распакованных данных.

TWETTI 20.01.2011 11:46

Спасибо за ответ.

Добавлено через 2 часа 5 минут
А кто-нибудь подскажет как сделать так, чтобы во время распаковки флеш плеер не зависал?

alatar 20.01.2011 13:53

Распаковывать частями.

TWETTI 20.01.2011 13:55

А есть другой метод?

alatar 20.01.2011 13:57

Цитата:

А есть другой метод?
А чем вас этот метод не устраивает? Ну можете изучить формат mp3 и написать свою альтернативу, но вряд ли это будет быстрее и все равно прийдется делать экстракт частями, что бы избежать тормозов.

TWETTI 20.01.2011 14:03

Я имею ввиду есть ли другой метод избежать тормозов? Например я знаю что есть какой то класс Chunker от gskinner'а но не знаю как им пользоваться.

gloomyBrain 20.01.2011 14:08

Цитата:

Ну можете изучить формат mp3
Ага, только сначала спецификацию надо купить =) Ну, или изучать исходники Lame

Цитата:

есть ли другой метод избежать тормозов
По сути, что-то вроде extract'а делается во время проигрывания звука. Но, так как этот процесс "размазан" по времени, тормозов нет. Соответственно, делайте это не циклом, а по кадрам или по таймеру.

TWETTI 20.01.2011 14:12

gloomyBrain, А как сделать по таймеру?

gloomyBrain 20.01.2011 14:21

Мне Вам что сейчас ответить? Как сделать экстракт части звука? Или как таймер запустить? =)

TWETTI 20.01.2011 14:28

Пожалуйста скажите как сделать extract по таймеру, чтобы флеш не зависал и я мог поставить прелоадер.

Добавлено через 1 минуту
Вот мой класс визуализации звука
Код AS3:

package src
{
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.geom.Rectangle;
        import flash.media.Sound;
        import flash.media.SoundChannel;
        import flash.net.URLRequest;
        import flash.utils.ByteArray;
 
        public class Visualizator extends Sprite
        {
                var samples:ByteArray = new ByteArray();
                var buffer:BitmapData = new BitmapData(1024,256,true,0x00FFFFFF);
                var screen:Bitmap = new Bitmap(buffer);
                var rect:Rectangle = new Rectangle(0,0,1,0);
                var playingTime:int;
                var ratio:Number;
                var step:int;
                var sound:Sound;
                public function Visualizator(_sound:Sound):void
                {
                        sound = _sound;
                }
 
                public function show():void
                {
                        addChild(screen);
 
                        buffer.fillRect( buffer.rect, 0 );
                        var extract:Number = Math.floor ((sound.length/1000)*44100);
                        playingTime = sound.length;
                        ratio = playingTime / buffer.width;
                        var lng:Number = sound.extract(samples,extract);
                        samples.position = 0;
                        step = samples.length / 4096;
                        do
                        {
                                step--;
                        }
                        while ( step % 4 );
 
                        var left:Number;
                        var right:Number;
                        var mono:Number;
 
                        for (var c:int = 0; c < 4096; c++)
                        {
                                rect.x = c / 4;
                                left = samples.readFloat() * 128;
                                right = samples.readFloat() * 128;
                                mono = Math.abs(Math.max(left, right)) + Math.abs(Math.min(left, right));
 
                                samples.position = c * step;
 
                                if (left > 0)
                                {
                                        rect.y = 128 - left;
                                        rect.height = left;
                                }
                                else
                                {
                                        rect.y = 128;
                                        rect.height =  -  left;
                                }
 
                                buffer.fillRect( rect, 0xFF5d96da );
 
                                if (right > 0)
                                {
                                        rect.y = 128 - right;
                                        rect.height = right;
                                }
                                else
                                {
                                        rect.y = 128;
                                        rect.height =  -  right;
                                }
 
                                buffer.fillRect( rect, 0xFF5d96da );
                        }
                        screen.width = 930;
                        screen.height = 90;
                        dispatchEvent(new Event(Event.COMPLETE));
                }
        }
}

Добавлено через 1 час 11 минут
Ну, что никто не знает как сделать? Срочно надо. Готов заплатить.

alatar 20.01.2011 16:55

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.media.Sound;
        import flash.net.URLRequest;
        import flash.utils.ByteArray;
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private var _sound:Sound;
                private var _bytes:ByteArray = new ByteArray();
                private var _soundLenght:Number;
                private var _sample:Number = 32768;
                private var _startPosition:Number = 0;
 
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        var req:URLRequest = new URLRequest("Sunglasses.mp3");
 
                        _sound = new Sound();
                        _sound.addEventListener(Event.COMPLETE, sound_CompleteHandler);
                        _sound.load(req);
                }
 
                private function sound_CompleteHandler(event:Event):void
                {
                        _soundLenght = _sound.length * 44.1;
 
                        addEventListener(Event.ENTER_FRAME, extractPart);
                }
 
                private function extractPart(event:Event):void
                {
                        if (_startPosition < (_soundLenght - _sample))
                        {
                                _startPosition += _sound.extract(_bytes, _sample);
                        }
                        else
                        {
                                _startPosition += _sound.extract(_bytes, _soundLenght - _startPosition);
                                removeEventListener(Event.ENTER_FRAME, extractPart);
                        }
                        trace("soundLenght: " + _soundLenght);
                        trace("extraxted: " + int(_startPosition / _soundLenght * 100) + '%');
                        trace(_startPosition);
                }
        }
}



Часовой пояс GMT +4, время: 22:52.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.