因为一朋友需要获取目录下所有wav格式的音频文件时长,让我帮忙,开始打算通过linux命令写的,找了半天没有找到,只找到通过php实现的方法,核心算法是从网上借鉴,我修改了一下,不说太多,直接上代码:
<?php
function getWavLength($file, $base=10) {
$fp = fopen($file, 'r');
if (fread($fp,4) != 'RIFF') {
return '';
}
fseek($fp, 20);
$rawheader = fread($fp, 16);
$header = unpack('vtype/vchannels/Vsamplerate/Vbytespersec/valignment/vbits',$rawheader);
$pos = ftell($fp);
while (fread($fp, 4) != 'data' && !feof($fp)) {
$pos++;
fseek($fp,$pos);
}
$rawheader = fread($fp, 4);
$data = unpack('Vdatasize',$rawheader);
$sec = $data[datasize] / $header[bytespersec];
if($base==60) {
$seconds = intval($sec % 60);
$minutes = intval(($sec - $sec * 60) / 60);
return $minutes.':'.$seconds;
} else {
return $sec;
}
}
$filePath = './wav/';
$arrWavData = array();
$arrWavData = scandir($filePath);
foreach ($arrWavData as $wavData) {
$lengh = getWavLength($filePath . $wavData);
if (!empty($lengh)) {
echo $wavData . ': ' . $lengh . "\n";
}
}
源文件:
输出:
如果需要通过现有的软件实现该功能,推荐一款软件DirectoryLister,它可以获取你需要的数据,并能导出不同的格式,界面如下: