我在 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 值,但给出的图像与预期不同,我不知道为什么。