3

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

wav 是 a-law 立体声 16 位,但我使用解码算法来获取 pcm 值,因此 16 位变为 8 位。

8000Hz,每个样本 8 位,64 Kbps,立体声,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 bit = 4 * 8 bit,每一位都是左右声道。因此,对于上述循环的一行,我为左声道取 2 个值,为右声道取两个值。但是对于 20 MB 文件,我得到 $this->blocktotal= 20147456 ,因此上述循环将重复大约 500 万次。有什么改进的想法吗?我试图同时读取 8 个 Long 值,但给出的图像与预期不同,我不知道为什么。

4

1 回答 1

0

解决了这个问题。当文件大到 20 MB 时,我根本不读取一些字节,即我跳过它们,因为无论如何我需要近似值。我从声音数据中提取每 10 个长的数字。对于较小的文件,我采用每秒钟长的数字。所以我通过这种方式解决了这个问题。

于 2012-06-29T23:49:22.553 回答