Usar PHP para analisar e desenhar diagramas de formas de onda de arquivos de áudio ainda é raramente visto online. Na verdade, é muito fácil usar fseek, fopen, fopen, pack/unpack e outras funções do Php de acordo com as especificações do arquivo wav, bem como a poderosa biblioteca gráfica gd. Muitas pessoas podem não estar familiarizadas com as funções pack/unpack; na verdade, isso é um empréstimo do Perl pelo PHP e fornece uma maneira de acessar estruturas de dados binárias complexas usando uma linguagem de script. Meu programa simplificado só pode processar arquivos de áudio RIFF no formato PCM (que também é o formato wav mais comum). Não há limite de canais, mas a taxa de bits (BitsPerSample) é preferencialmente 16.
Aqui estão o formato de arquivo wave e o formato de arquivo de som wave da Microsoft para referência. Aqui está um exemplo prático (baixe para ampliar)
Aqui está a citação:
1 <?Php
2
3
função wav_graph(
$arquivo, $f=0
, $w=0)
4 {
5 global $DATA_DIR;
, 'r');
9 $raw = fread($fp, 36);
10 $str = '';
11 $header = unpack('A4Riff/VSize/A4Wav/A4Head/VHeadSize/vPCM/vChannels/VSampleRate/VByteRate/ vBlockAlign/vSampleBits', $raw);
12 foreach($header as $k=>$v)
13 $str .= $k.': '
. ['HeadSize'] - 16);
15 $raw = fread($fp, 8);
16 $data = unpack('A4Data/VDataSize', $raw
($dados como $k=>$v)
18 $str .= $k.': '.
19
$
b =$
header['SampleBits'];
$c / 8; // comprimento do quadro de amostra em bytes
23
$s = $data['DataSize'] / $l; // número total de amostras
24 $r = $header['SampleRate'];
) $h = pow(2, $b) / $f;
senão {
$h == 200
;w = round($r / 1000); // padrão para mostrar 1k quadros de amostra por minuto
28
29 header("Content-type: image/png")
; $c * 2);
31 imagecolorallocate($im, 0xff, 0xff, 0xff); // branco bg
32 $color = imagecolorallocate($im, 0, 0, 255)
; 5, 5, 5, $str, $cor);
34
35 $x=0; $y = array();
$i++ array(); ) $y[$i] = $h * $i + $h;
37
$
n = $l * $
w
;
< $n) $n = $s;
42 $amostras = fread($fp, 1000 * $n);
43 if($
amostras === FALSE) break;
);
45 foreach($empacotado como $k=>$v)
46
{
47 $cnt = ($k-
1) % ($w * $l) ;
$yn[$cnt] = $h * $cnt + $h - $v / $f;
50 linha de imagem($im, $x, $y[$cnt], $x+1, $yn[$cnt],
$
cor);
51
$y[$cnt] = $yn[$cnt];
52
$
x
++
;
59 }
60
61 //wav_graph('audio2.wav'
);