我用php开发了一个脚本来绘制一个wav文件的声波。虽然效果很好,但听起来很长,大约 20 分钟,需要 2-3 分钟来绘制图像。我使用样本组的峰值来表示特定像素中的波。我也得到长值,即同时获得左值、右值、负值和正值的 4 个字节。还有一个改进是我在同一次迭代中采用了 4 个 long 值。
wav 是 a-law 立体声 16 位,但我使用解码算法来获取 pcm 值,因此 16 位变为 8 位。
8000Hz,每个样本 8 位,64 Kbps, 立体声,A律
我需要生成 1500 像素宽的图像。
一些算法或网页如何提高脚本的性能也会有所帮助。
Audacity 在大约 2-3 秒内生成相同声音的图像:)
谢谢。如果需要,我会发布一些代码。
这是读取声音数据 block 的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,每一位都是左右声道。因此,对于上述循环的一行,我为左 channel 取 2 个值,为右 channel 取两个值。但是我得到 20 MB 文件的 $this->blocktotal= 20147456,所以上面的循环将重复大约 500 万次。有什么改进的想法吗?我试图同时读取 8 个 Long 值,但给出的图像与预期不同,我不知道为什么。
最佳答案
解决了这个问题。当文件大到 20 MB 时,我根本不读取一些字节,即我跳过它们,因为无论如何我需要一个近似值。我从声音数据中取出每 10 个长的数字。对于较小的文件,我取每个第二长的数字。所以我通过这种方式解决了这个问题。
关于php - 在php中绘制声波,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8928706/