Рисование звуковой волны в php
Я разработал скрипт в php, чтобы нарисовать звуковую волну wav-файла. Хотя это хорошо работает, звучит долго, около 20 минут, чтобы нарисовать изображение, требуется 2-3 минуты. Я использую пиковое значение группы образцов для представления волны в определенном пикселе. Также я получаю длинные значения, то есть 4 байта одновременно, чтобы получить левый, правый, как отрицательные, так и положительные значения. Также одним из улучшений является то, что я беру 4 длинных значения в одной итерации
WAV - это 16-битный стереозвук по закону, но я использую алгоритм декодирования, чтобы получить значение pcm, поэтому 16 бит идут в 8 бит.
8000 Гц, 8 бит на выборку, 64 Кбит / с, стерео, A-закон
Мне нужно создать изображение шириной 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 ответ
Решил проблему. Когда файл большой, например, 20 МБ, я вообще не читаю несколько байтов, то есть прыгаю их, потому что в любом случае мне нужно приближение. Я беру каждый 10-й длинный номер из звуковых данных. Для меньшего файла я беру каждый длинный номер. Таким образом, я решил это.