Модераторы: SoWa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Sound.extract() для больших файлов, Постройка АЧХ для MP3 больше 80 Мb 
:(
    Опции темы
C4Grey
Дата 4.12.2011, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 23.5.2007

Репутация: 1
Всего: 1



Приветствую
С постройкой графика АЧХ(Waveform, а-ля soundcloud.com) разобрался, благо примеров в интернете гуляет много. Интересует как сделать то же для больших файлов - либо с большим битрейтом, либо большой длительности. Хотелось бы строить график по ходу загрузки звука, как такое можно провернуть? Есть пару идей:
1. Отлавливать ProgressEvent, смотреть bytesLoaded, писать по порциям в ByteArray чере sound.extract(), как-то так:
Код

var vSize:int = Math.floor(FSound.length * 44.1);
FSound.extract(vData, vSize - FLoadingPosition, FLoadingPosition);
FLoadingPosition = vSize;

2. Строить график один раз, при загрузке на сервер и сохранять данные в XML или бинарник.

Идея номер 2 менее ресурсоемкая, но сильно усложняет загрузку звуков для конечного пользователя(по идее, ему нужно только вставить URL и получить код плеера) и добавляет необходимость содержать сервер с данными по трекам. С первой тоже пока проблемы - никак не удается прочитать данные верно, может чего не так делаю. В общем, подскажите, пожалуйста, может у кого есть другие идеи, или варианты дял развития этих.

P.S. Поправил код для вытягивания данных, там не байты а сэмплы(2 флоата)
P.P.S. Вытянуть данные получилось, даже график можно построить, но зажать его в нужный размер никак не получается. Проблема в том, что до загрузки звука его полную длину получить не получается, а она нужна для получения соотношения "длина звука / длина мувика с графиком" - чтобы правильно строить в ряд линии, сответсвующие значению амплитуды. Вытягиваю данные так:
Код

function OnProgres(e:ProgressEvent):void
{
    var vData:ByteArray = new ByteArray();        
    var vSize:int = Math.floor(FSound.length * 44.1);
    var vPart:int = vSize - FLoadingPosition;
    FSound.extract(vData, vPart, FLoadingPosition);
    FLoadingPosition = vSize;            
    if(vData.length > 0)
    {            
        vData.position = 0;
        FLoadedSamples.push(vData);                                
        if(FFirstLaunch)
        {                    
            FBitrate = 8 * Math.floor(FSound.bytesLoaded / FSound.length);
            FStep = 1 / (8128 * FBitrate * 2 / stage.stageWidth);
            addEventListener(Event.ENTER_FRAME, AnalyzeSample);
            FFirstLaunch = false;
        }
    }            
}


И построение графика:

Код

private function AnalyzeSample(e:Event):void
{
    var h:Number = stage.stageHeight;                
    FCurrentBuffer = FLoadedSamples[FBufferIndex];
    
    if(FCurrentBuffer.bytesAvailable)
    {        
        var vVal:Number;                
        for(var i:int = 0; i < 8128; i++)
        {
            try
            {                        
                vVal = abs(FCurrentBuffer.readFloat());
                Raster.line(FData, FDx, h/2 - vVal * h/2 / 2, FDx, h/2, 0x88FF9933);
                vVal = abs(FCurrentBuffer.readFloat());
                Raster.line(FData, FDx, h/2 + vVal * h/2 / 2, FDx, h/2, 0x88FFFF00);
                FDx += FStep;                                        
            }
            catch(E:Error){}
        }
    }
    else 
    {
        if(FBufferIndex < FLoadedSamples.length-1)
        {
            FBufferIndex++;
        }
        else
        {
            //removeEventListener(Event.ENTER_FRAME, AnalyzeSample);
        }
    }            
}


Значение FStep подобрал эксперементально, верного графика с ним не построишь.

Это сообщение отредактировал(а) C4Grey - 5.12.2011, 04:14
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | ActionScript 3 | Следующая тема »


 




[ Время генерации скрипта: 0.0689 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.