Рисование звуковой волны в php - PullRequest
3 голосов
/ 19 января 2012

Я разработал скрипт в php, чтобы нарисовать звуковую волну wav-файла. Хотя это хорошо работает, звучит долго, около 20 минут, чтобы нарисовать изображение, требуется 2-3 минуты. Я использую пиковое значение группы образцов для представления волны в определенном пикселе. Также я получаю длинные значения, то есть 4 байта одновременно, чтобы получить левый, правый, как отрицательные, так и положительные значения. Также одним из улучшений является то, что я принимаю 4 длинных значения на одной итерации.

WAV - это стереофонический 16-битный формат, но я использую алгоритм декодирования, чтобы получить значение pcm, поэтому 16 бит переходят в 8 бит.

8000 Гц, 8 бит на выборку, 64 Кбит / с, стерео, А-закон

Мне нужно сгенерировать изображение шириной 1500 пикселей.

Было бы полезно также немного алгоритма или веб-страницы, как улучшить производительность сценария.

Audacity создает изображение того же звука примерно за 2-3 секунды:)

спасибо. При необходимости я выложу код.

Вот цикл for для чтения блоков звуковых данных

for ($i = 0; $i < $this->blocktotal / 4; $i+=4) 
    {
        // unpack 32 bit numbers from the sound data in groups of 4
        $blocks[] = @unpack('L', substr($this->data, $i * 4, 4));
        $blocks[] = @unpack('L', substr($this->data, ($i + 1) * 4, 4));
        $blocks[] = @unpack('L', substr($this->data, ($i + 2) * 4, 4));
        $blocks[] = @unpack('L', substr($this->data, ($i + 3) * 4, 4));
    }

32 бита = 4 * 8 бит, каждый бит слева направо, справа, справа. Таким образом, я беру 2 значения для левого и два для правого канала для одной строки вышеуказанного цикла. Но я получаю $ this-> blocktotal = 20147456 для файла размером 20 МБ, поэтому цикл, описанный выше, будет повторяться около 5 миллионов раз. Есть идеи по улучшению? Я пытался прочитать 8 длинных значений одновременно, но это дает другое изображение, чем ожидалось, я не знаю почему.

1 Ответ

0 голосов
/ 30 июня 2012

решил проблему. Когда размер файла составляет около 20 МБ, я вообще не читаю несколько байтов, т. Е. Прыгаю их, потому что в любом случае мне нужно приближение. Я беру каждый 10-й длинный номер из звуковых данных. Для меньшего файла я беру каждый длинный номер. Вот так я решил это.

...