Я разработал скрипт в 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 длинных значений одновременно, но это дает другое изображение, чем ожидалось, я не знаю почему.