我用php开发了一个脚本来绘制wav文件的声波。虽然它运行良好,但听起来很长,大约需要20分钟,需要2-3分钟才能画出图像。我用一组样本的峰值来表示某个像素上的波。我还得到了长值,即4个字节,同时得到了左,右,负值和正值。还有一个改进是我在相同的迭代中取了4个长值。
该wav是一个法律立体声16位,但我使用解码算法,以获得PCM值,所以16位到8位。
8000 64,每个采样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位=4*8位,每个位是左、右、左、右声道。所以在上面的循环中,我取左声道的两个值,右声道的两个值。但是对于20MB的文件,我得到$this->blocktotal= 20147456,所以上面的周期将重复大约500万次。有什么改进的想法吗?我试图同时读取8个长值,但这给出了比预期更多的图像,我不知道为什么。
发布于 2012-06-30 07:49:23
解决了这个问题。当文件很大时,比如20MB,我根本不会读取一些字节,也就是说,我会跳过它们,因为不管怎样,我需要一个近似值。我从声音数据中提取每10个长数字。对于较小的文件,我采用每秒和每一个长数字。所以我用这种方式解决了这个问题。
https://stackoverflow.com/questions/8928706
复制相似问题