L’utilisation de Php pour analyser et dessiner des diagrammes de forme d’onde de fichiers audio est encore rarement vue en ligne. En fait, il est très simple d'utiliser les fonctions fseek, fopen, fopen, pack/unpack et autres de Php selon les spécifications du fichier wav, ainsi que la puissante bibliothèque graphique gd. Beaucoup de gens ne sont peut-être pas familiers avec les fonctions pack/unpack ; il s'agit en fait d'un emprunt à Perl par Php, et elles fournissent un moyen d'accéder à des structures de données binaires complexes à l'aide d'un langage de script. Mon programme simplifié ne peut traiter que les fichiers audio RIFF au format PCM (qui est également le format wav le plus courant). Il n'y a pas de limite de canaux, mais le débit binaire (BitsPerSample) est de préférence de 16.
Voici le format de fichier wave et le format de fichier son Microsoft wave pour référence. Voici un exemple pratique (télécharger pour agrandir)
Voici la citation :
1 <?Php
2
3 function wav_graph($file, $f=0, $w=0)
4 {
5 global $DATA_DIR;
6
7 if(!is_file($file)) return 0;
8 $fp = fopen($DATA_DIR.$file , 'r');
9 $raw = fread($fp, 36);
10 $str = '';
11 $header = unpack('A4Riff/VSize/A4Wav/A4Head/vPCM/vChannels/VSampleRate/VByteRate/ vBlockAlign/vSampleBits', $raw);
12
foreach($header as $k=>$v)
13 $str .= $k.': '$v.'
['HeadSize'] - 16);
15 $raw = fread($fp, 8);
16 $
data = unpack('A4Data/VDataSize', $raw);
18 $str .= $k.' : '$v.';
19
20
$b = $header[
'SampleBits'];
$c / 8; // longueur de la trame d'échantillon en octets
23 $s = $data['DataSize'] / $l; // nombre total d'échantillons
24 $r = $header['SampleRate']
25 if($f) ) $h = pow(2, $b) / $f;
26 sinon { $h = 200; $f = pow(2, $b - 1) / $h }
27 si($w == 0) $ w = round($r / 1000); // affiche par défaut 1 000 images par minute
28
29 header("Content-type: image/png");
30 $im = imagecreate($s / $w, $h * $c * 2);
31 imagecolorallocate($im, 0xff, 0xff, 0xff); // blanc bg
32 $color = imagecolorallocate($im, 0, 0, 255); // noir
33 //imagestring($im, 5, 5, 5, $str, $color);
34
35 $x=0; $y = array(); $yn = array();
36 pour($i = 0; $i < $c; $i++ ) $y[$i] = $h * $i + $h;
37 $n = $l * $w;
tandis
que(1)
39 {
40 if($s == 0) break;
< $n) $n = $s;
42 $samples = fread($fp, 1000 * $n);
43 if($samples
=== FALSE) break;
);
45 foreach($packed as $k=>$v)
46 {
47 $cnt = ($k-1) % ($w * $l)
48
if( $cnt > $c - 1) continue;
$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;
56
57 imagepng(
$im);
59 }
60
61 //wav_graph('audio2.wav');
62 ?>