3

私は、wavファイルの音波を描画するためにphpでスクリプトを開発しました。うまく機能しますが、画像を描画するのに約20分から2〜3分かかります。サンプルのグループのピーク値を使用して、特定のピクセルの波を表します。また、負の値と正の値の両方を取得するために、長い値、つまり同時に4バイトを取得します。また、1つの改善点は、同じ反復で4つの長い値を取ることです。

wavはa-lawステレオ16ビットですが、デコードアルゴリズムを使用してpcm値を取得するため、16ビットは8ビットになります。

8000Hz、サンプルあたり8ビット、64 Kbps、ステレオ、A-law

1500ピクセル幅の画像を生成する必要があります。

スクリプトのパフォーマンスを向上させる方法は、アルゴリズムやWebページにも役立ちます。

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ビット、各ビットは左右左右チャネルです。したがって、上記のサイクルの1行で、左チャネルに2つの値、右チャネルに2つの値を取ります。しかし、20MBのファイルで$this-> blocktotal = 20147456になるので、上記のサイクルは約500万回繰り返されます。改善のためのアイデアはありますか?同時に8つのLong値を読み取ろうとしましたが、予想とは異なる画像が表示されます。理由はわかりません。

4

1 に答える 1

0

問題を解決しました。ファイルが20MBのように大きい場合、バイトをまったく読み取らない、つまり、とにかく近似が必要なため、それらをジャンプします。サウンドデータから10番目ごとの長い数字を取得します。小さいファイルの場合、私は2番目の長い数字をすべて取ります。だからこのように私はこれを解決しました。

于 2012-06-29T23:49:22.553 に答える