Форум 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() vs. computeSpectrum() (http://www.flasher.ru/forum/showthread.php?t=159055)

parl 26.06.2011 18:40

sound.extract() vs. computeSpectrum()
 
Пытаюсь получить форму волны для mp3 (в примере только для левого канала), очень удивился, когда обнаружил, что методы sound.extract() и computeSpectrum() возвращают разные значения.

Подскажите в чем проблема? Или, быть может так быть и должно?

Функция onEnterFrame запускается по таймеру каждые 0.5 сек.

Код AS3:

private function onEnterFrame( e : * ) : void {
 
        var bytes : ByteArray = new ByteArray(); // байт аррей для computeSpectrum
        var exBytes : ByteArray = new ByteArray(); // байт аррей для extract
 
        const PLOT_HEIGHT:int = 100;
        const CHANNEL_LENGTH:int = 256;
 
 
 
        SoundMixer.computeSpectrum( bytes );
 
        //SoundMixer.computeSpectrum( exBytes );
 
        _sound.extract( exBytes, 256, _soundChannel.position * 44.1 );
 
 
 
        bytes.position = 0;
        exBytes.position = 0;
 
            var g : Graphics = _place.graphics;
 
            g.clear();
 
            g.lineStyle(0, 0x6600CC);
            g.beginFill(0x6600CC);
            g.moveTo(_x, PLOT_HEIGHT);
 
            // читаем данные от computeSpectrum
            var n:Number = 0;
 
            for (var i:int = 0; i < CHANNEL_LENGTH; i++) {
 
                                //bytes.readFloat();
                                n = (bytes.readFloat() * PLOT_HEIGHT);
                                g.lineTo(i * 2 + _x, PLOT_HEIGHT - n);
 
 
            }
 
            g.lineTo(CHANNEL_LENGTH * 2 + _x, PLOT_HEIGHT);
            g.endFill();
 
 
 
 
            g.lineStyle(0, 0x6600CC);
            g.beginFill(0x6600CC);
            g.moveTo(_x, PLOT_HEIGHT + 300);
 
            // читаем данные от sound.extract()
            var n:Number = 0;
 
            for (var i:int = 0; i < CHANNEL_LENGTH; i++) {
 
                                n = (exBytes.readFloat() * PLOT_HEIGHT);
                                g.lineTo(i * 2 + _x, PLOT_HEIGHT - n + 300);
 
                                exBytes.readFloat();
 
            }
 
            g.lineTo(CHANNEL_LENGTH * 2 + _x, PLOT_HEIGHT + 300);
            g.endFill();
 
}


silin 26.06.2011 19:40

такое предположение: _soundChannel.position просто не совпадает с началом выборки SoundMixer.computeSpectrum, сигналы какбе похожие, только смещены, не ?
во всяком случае, если смотреть частотные характеристики, а не амплитуды, то особых разночтений нет

parl 26.06.2011 19:48

Да, сигналы похожи, в вашем примере с частотами разница тоже заметна. Хотелось бы понять отуда эта разница берется...

Пробовал подбором _soundChannel.position +- 1-20мс, но ничего не добился.

silin 26.06.2011 19:53

сейчас смотрю на ENTER_FRAME
Код AS3:

_sound.extract(exBytes, 256, _soundChannel.position * 44.1 - (shift += 0.001));

но сакрального смещения не удается выловить

alatar 27.06.2011 11:56

А почему length взял 256?

silin 27.06.2011 16:03

computeSpectrum отдает только 256, нет смысла смотреть больше в этом контексте

alatar 27.06.2011 16:14

computeSpectrum отдает 512.

silin 27.06.2011 16:20

512, где первые 256 значений представляют левый канал, а следующие 256 значений — правый

alatar 27.06.2011 16:25

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

silin 27.06.2011 16:39

256 в sound.extract(ba,256,..) не в байтах, а в сэмплах(точках) саунда, в ba запишет 2048 байта
т.е. хотелось просто поерзать относительно soundChannel.position

alatar 27.06.2011 16:45

Блин, точно :) Давно со звуком не работал.

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

silin 27.06.2011 17:04

попробовать-то можно, канеш
но даже если найдешь, то не факт, что смещение это останется таким же на другой машине или при другой нагрузке..
в-общем, не вижу причин сильно упираться: не совпадает, ну и икс с ним, ничего от этого не сломается

alatar 27.06.2011 17:32

Согласен :)


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

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