用PHP读取音频文件wav的录音时限

时间:2021-09-04 16:27:07
对于WAV格式的文件结构,这里有详细的解释: http://dev.gameres.com/Program/Listen/wavePX.htm 。读取其录音时间长度时,我在一个网站找到了下面这种方法。这里用到了PHP的pack函数。近来学习PERL时第一次接触pack函数,却不知道用了这么多年的PHP中也有这个函数,真实惭愧。其实PERL中的Audio::Wav模块也是通过类似的方法实现的,在/usr/lib/perl5/site_perl/5.8.6/Audio/Wav/Read.pm中搜索data_length就可以知道大概。
 1  <?php
 2
 3  /*
 4  calculate the duration of wav files
 5  */
 6  function wav_sec($file, $base=10) /* {{{ */
 7  {
 8      $fp = fopen($file, 'r');
 9      if (fread($fp,4) != 'RIFF') return 'format not valide';
10      fseek($fp, 20);
11      $rawheader = fread($fp, 16);
12      $header = unpack('vtype/vchannels/Vsamplerate/Vbytespersec/valignment/vbits',$rawheader);
13      $pos = ftell($fp);
14      while (fread($fp, 4) != 'data' && !feof($fp))
15      {
16          $pos++;
17          fseek($fp,$pos);
18      }
19      $rawheader = fread($fp, 4);
20      $data = unpack('Vdatasize',$rawheader);
21      $sec = $data[datasize] / $header[bytespersec];
22      if($base==60)
23      {
24          $seconds = intval($sec % 60);
25          $minutes = intval(($sec - $sec * 60) / 60);
26          return $minutes.':'.$seconds;
27      }
28      else return $sec;
29  } /* }}} */
30
31  ?>