php - 在php中绘制声波

标签 php audio drawing wav waveform

我用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/

相关文章:

exception - Draw.io Uncaught TypeError : dialog. showSaveDialogSync 不是函数

php - 如何在字符串中查找专有名词?

php - PHP将整数转换为32位(4字节)十六进制以进行套接字编程

php - 在 mysql 表中找到 "problematic"行将无法导出

javascript - 在HTML <区域>中使用JavaScript函数在单击时播放音频

ios - GL图纸 View 在旋转时清除图纸

php - 如何检索存储在 mySQL 表中的 HTML/PHP 代码而不将 PHP 注释掉?

java - LWJGL - 加载声音和字体而不平滑

python - scipy.signal.fftconvolve-更多详细信息?

ios - 如何用 UIBezierPath 绘制锯齿线?