لا يزال استخدام PHP لتحليل ورسم المخططات الموجية للملفات الصوتية نادرًا ما يتم مشاهدته عبر الإنترنت. في الواقع، من السهل جدًا استخدام وظائف Php's fseek وfopen وfopen وpack/unpack وغيرها من الوظائف وفقًا لمواصفات ملف wav، بالإضافة إلى مكتبة الرسومات gd القوية. قد لا يكون العديد من الأشخاص على دراية بوظائف الحزمة/التفريغ؛ وهذا في الواقع مستعار من لغة Perl بواسطة Php، وهي توفر طريقة للوصول إلى هياكل البيانات الثنائية المعقدة باستخدام لغة البرمجة النصية. يمكن لبرنامجي المبسط معالجة ملفات الصوت RIFF بتنسيق PCM فقط (وهو أيضًا تنسيق wav الأكثر شيوعًا). لا يوجد حد للقناة، ولكن يفضل أن يكون معدل البت (BitsPerSample) 16.
فيما يلي تنسيق ملف الموجة وتنسيق ملف الصوت الخاص بموجة Microsoft كمرجع. هنا مثال عملي (تحميل للتكبير)
هنا هو الاقتباس:
1 <؟ فب
2
3 وظيفة 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/VHeadSize/vPCM/vChannels/VSampleRate/VByteRate/ vBlockAlign/vSampleBits', $raw);
12 foreach($header as $k=>$v)
13 $str .= $k.': '
14 fseek($fp, 36 + $header ['HeadSize'] - 16);
15 $raw = fread($fp, 8);
16 $
data = unpack('A4Data/VDataSize', $raw);
18 $str .= $k.': '. $v.'';
19
20
$b = $header[
'SampleBits'];
$c / 8; // طول إطار العينة بالبايت
23 $s = $data['DataSize'] / $l; // إجمالي عدد العينات
24 $r = $header['SampleRate']
25 if($f ) $h = pow(2, $b) / $f;
26 else { $h = 200
; w = round($r / 1000); // الافتراضي لإظهار 1k عينة من الإطارات في الدقيقة
28
29 header("Content-type: image/png")
; $c * 2);
31 imagecolorallocate($im, 0xff, 0xff, 0xff); // أبيض bg
32 $color = imagecolorallocate($im, 0, 0, 255); //
imagestring($im, 5, 5, 5, $str, $color);
34
35 $x=0; $y = array();
36 for($i = 0; $i < $c; $i++ ) $y[$i] = $h * $i + $h;
37
$n = $l * $w;
38 while(1)
39 {
40 if($s == 0) فاصل;
< $n) $n = $s;
42 $samples = fread($fp, 1000 * $n);
43 if($samples === FALSE)break;
44 $packed = unpack("s*", $samples );
45 foreach($packed as $k=>$v)
46 {
47 $cnt = ($k-
1) % ($w * $l)
; $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
++
;
59 }
60
61 //wav_graph('audio2.wav');
62 ?>