在php中绘制声波

时间:2012-01-19 15:28:13

标签: php audio drawing wav waveform

我在php中开发了一个脚本来绘制wav文件的声波。 Althoug它的效果很好,长约20分钟需要2-3分钟来绘制图像。我使用样本组的峰值来表示某个像素中的波。此外,我得到长值,即4个字节同时左,右,负值和正值。另外一个改进是我在同一次迭代中获取4个长值。

wav是a-law立体声16位,但我使用解码算法得到pcm值,所以16位转到8位。

8000Hz,每个样本8位,64 Kbps, 立体声,A-law

我需要生成1500像素宽的图像。

如果有一些alghoritm或网页如何提高脚本的性能会有所帮助。

Audacity在大约2-3秒内生成相同声音的图像:)

感谢。如果需要,我会发布一些代码。

这是用于读取声音数据块的循环

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-&gt; blocktotal = 20147456为20 MB文件,所以上述周期将重复约5百万次。有什么改进的想法吗?我试图同时读取8个Long值,但这给出了比预期更多的图像,我不知道为什么。

1 个答案:

答案 0 :(得分:0)

解决了这个问题。当文件大到20 MB时,我根本不读取一些字节,即我跳它们,因为无论如何我需要aproximation。我从声音数据中取出每10个长数字。对于较小的文件,我采用每个secodnd长号。所以我这样解决了这个问题。