El uso de Php para analizar y dibujar diagramas de formas de onda de archivos de audio todavía es algo que rara vez se ve en línea. De hecho, es muy fácil utilizar fseek, fopen, fopen, pack/unpack y otras funciones de PHP de acuerdo con las especificaciones del archivo wav, así como la potente biblioteca de gráficos gd. Es posible que muchas personas no estén familiarizadas con las funciones de empaquetar/desempaquetar; en realidad, esto es un préstamo de Perl por Php, y proporcionan una forma de acceder a estructuras de datos binarios complejas utilizando un lenguaje de programación. Mi programa simplificado solo puede procesar archivos de audio RIFF en formato PCM (que también es el formato wav más común. No hay límite de canales, pero la velocidad de bits (BitsPerSample) es preferiblemente 16).
Aquí se muestran el formato de archivo wave y el formato de archivo de sonido Microsoft wave como referencia. Aquí tienes un ejemplo práctico (descargar para ampliar)
Aquí está la cita:
1 <?Php
2
3 función wav_graph($archivo, $f=0, $w=0)
4 {
5 global $DATA_DIR
6
7 if(!is_file($archivo)) return 0
8 $fp = fopen($DATA_DIR.$archivo; , 'r');
9 $raw = fread($fp, 36);
10 $str = '';
11 $encabezado = descomprimir('A4Riff/VSize/A4Wav/A4Head/VHeadSize/vPCM/vChannels/VSampleRate/VByteRate/ vBlockAlign/vSampleBits', $raw);
12 foreach($encabezado como $k=>$v)
13 $str .= $k.':
'14 fseek($fp, 36 + $encabezado). ['HeadSize'] - 16);
15 $raw = fread($fp, 8);
16 $data = desempacar('A4Data/VDataSize', $raw)
;
18 $cadena .= $k.': '. $v.';
19
20
$b = $encabezado['SampleBits'];
21 $c = $encabezado['Canales'];
$c / 8; // longitud del marco de muestra en bytes
23 $s = $data['DataSize'] / $l // número total de muestras
24 $r = $header['SampleRate']
; ) $h = pow(2, $b) / $f;
26 más { $h = 200; $f = pow(2, $b - 1) / $h }
27 si($w == 0) $
w = round($r/
1000); // por defecto muestra 1k fotogramas de muestra por minuto
28
29 header("Tipo de contenido: imagen/png");
$c * 2);
31 imagecolorallocate($im, 0xff, 0xff, 0xff); // blanco bg
32 $color = imagecolorallocate($im, 0, 0, 255)
; 5, 5, 5, $cadena, $color);
34
35 $x=0; $y = matriz(); $yn = matriz();
$i = 0; $i < $c; $i++ ) $y[$i] = $h * $i + $h;
37 $n = $l * $w
38 mientras(1)
39 {
40 si($
s == 0) romper;
< $n) $n = $s;
42 $muestras = fread($fp, 1000 * $n);
43 if($muestras === FALSE) break
; );
45 foreach($empaquetado como $k=>$v)
46 {
47 $cnt = ($k-1) % ($w * $l) ;
48 if( $cnt > $c - 1) continuar
; $yn[$cnt] = $h * $cnt + $h - $v / $f
50 imageline($im, $x, $y[$cnt], $x+1, $yn[$cnt], $color);
51 $y[$cnt] = $yn[$cnt];
52
$
x++;
53 }
54
$s -=$
n;
59 }
60
61 //wav_graph('audio2.wav');
62 ?>