Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Сохранить диаграмму mp3 файла после его загрузки (http://www.flasher.ru/forum/showthread.php?t=166180)

sarjick 31.08.2011 01:39

Сохранить диаграмму mp3 файла после его загрузки
 
Здравствуйте,


я с помощью FileReference гружу mp3 файл и отправляю data на серверный скрипт. Здесь у меня все работает и сохраняет.

Не подскажите, как мне правильно воспользоваться sound.extract чтоб я смог сохранить диаграмму или набор байтов, который позволит мне потом ее нарисовать?

Добавлено через 7 часов 18 минут
Я смогу создать sound из fileReference.data или мне этот mp3 после сохранения на сервер опять загружать во флеш чтоли?

Fillini 31.08.2011 10:35

http://etcs.ru/blog/as3/wav_player/ может это?

cleptoman 31.08.2011 11:16

https://gist.github.com/218226

Добавлено через 32 секунды
обратите внимаение на метод createSWFFromMP3

sarjick 31.08.2011 23:45

Спасибо,

первая ссылка что-то mp3 не захотела загружать, а вот createSWFFromMP3 - похоже оно, буду пробовать

Добавлено через 1 час 19 минут
А не растолкуете, как дальше мне быть? На сайте silin.su видел примеры, но все-таки, если мне нужно прорисовать полностью диаграмму для mp3 файла, как мне использовать sound.extract?

Добавлено через 24 часа 8 минут
Пользуясь несколькими примерами в сети получилось сделать показ диаграммы звука на EnterFrame событие

вот кусок кода

Код AS3:

private function enterFrameHandler (event:Event):void {
                        // get bytes of 1024 samples
                        bytes.position = 0;
                        sound.extract (bytes, 1024, channel.position * 44.1);
 
                        // get samples of left channel
                        bytes.position = 0;
                        while (bytes.bytesAvailable > 0) {
                                samples [int (bytes.position / 8)] = bytes.readFloat (); bytes.readFloat ();
                        }
 
                        // analyze samples
                        fft.analyze (samples);
 
                        // fft.magnitudes contain full spectrum, we want 1st 5KHz
                        var limitHz:Number = 5000;
                        var i:int, n:int = fft.magnitudes.length * limitHz / (44100 / 2), w:int = 800 / n;
 
                        // draw spectrum
                        drawArea.graphics.clear ();
                        drawArea.graphics.lineStyle ();
                        drawArea.graphics.beginFill (0);
                        for (i = 0; i < n; i++) {
                                drawArea.graphics.drawRect (w * i, 50, w, 400 * fft.magnitudes [i]);
                        }
                        drawArea.graphics.endFill ();
 
                        // draw 1KHz ticks
                        var ticksStep:Number = 1000;
                        drawArea.graphics.lineStyle (0);
                        for (i = 0; i < limitHz / ticksStep + 1; i++) {
                                drawArea.graphics.moveTo (w * (ticksStep / limitHz * n * i), 50);
                                drawArea.graphics.lineTo (w * (ticksStep / limitHz * n * i), 45);
                        }
                }

там fft - это экземпляр стороннего класса, который что-то там на базе рядов Фурье преобразовывает.

А если мне все сразу нужно показать? Я пробую аналогично один раз вызвать эту функцию, только пишу

Код AS3:

sound.extract (bytes, sound.length*44.1);

но не работает.

Может кто сталкивался, подскажет, как правильно?

Добавлено через 24 часа 24 минуты
Хотя я его до этого с помощью FileReference загрузил, и у меня есть data, может тогда extract и не нужен?

silin 02.09.2011 17:15

extact нужен, потому как распарсить mp3 вручную врядли получиться
а если скормить его саунду, то у него через extact можно взяьт все что нужно:
Код AS3:

public class Main extends Sprite 
{
        private var sound:Sound;
 
        public function Main():void
        {
                sound = new Sound();
                sound.load(new URLRequest("test.mp3"));
                sound.play();
                sound.addEventListener(Event.COMPLETE, sound_complete);
        }
 
        private function sound_complete(e:Event):void
        {
                //ByteArray сэмплов
                var ba:ByteArray = new ByteArray();
                var soundLength:int = (sound.length / 1000) * 44100;
                sound.extract(ba, soundLength);
 
                // массивы всех сэмплов саунда в Namber'ах
                var samplesLength:int = ba.length / 8;
                var arrLeft:Array = [];
                var arrRight:Array = [];
                ba.position = 0;
                for (var i:int = 0; i < samplesLength; i++)
                {
                        arrLeft.push(ba.readFloat());
                        arrRight.push(ba.readFloat());
                }
                // что с ними  такими здоровыми делать не ясно
                // например нарисуем левый канал через каждую 10000-ную точку
                // остальные 9999 - баласт,
                // т.е. лучше видимо сразу из ByteArray брать только то что надо, не загоняя в массив
                var tY:Number = 200;
                var kY:Number = 100;
                graphics.lineStyle(1, 0xFF0000);
                graphics.moveTo(0, tY);
                var step:int = 1e4;
 
                for (var j:int = 0; j < arrLeft.length; j+=step)
                {
                        var dX:Number = j / step;
                        var dY:Number = kY * arrLeft[j];
                        graphics.lineTo(dX, tY + dY);
 
                }
        }
}


sarjick 03.09.2011 02:31

конкретное спасибо большое


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

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