在PHP中检测MP3或WAV音频文件的时长,可以通过以下两种方法实现:
方法一:使用第三方库(推荐)推荐使用 getID3 库,它支持解析多种音频格式的元数据,包括MP3和WAV。
实现步骤:下载并引入getID3从官网 getID3 下载库,解压后将其中的 getid3 目录放到你的项目中。
PHP代码示例:
require_once('getid3/getid3.php');
function getAudioDuration($filePath) {
$getID3 = new getID3;
$fileInfo = $getID3->analyze($filePath);
if (isset($fileInfo['playtime_seconds'])) {
return $fileInfo['playtime_seconds'];
} else {
return false;
}
}
// 使用示例
$mp3Duration = getAudioDuration('audio.mp3');
$wavDuration = getAudioDuration('audio.wav');
echo "MP3时长:" . gmdate("H:i:s", (int)$mp3Duration) . "\n";
echo "WAV时长:" . gmdate("H:i:s", (int)$wavDuration); 方法二:手动解析文件头(简单场景)对于WAV文件:WAV文件的头部信息包含采样率、字节率等字段,可通过计算得到时长。
function getWavDuration($filePath) {
$file = fopen($filePath, 'rb');
if (!$file) return false;
// 读取WAV头部的关键字段
fseek($file, 24); // 定位到“采样率”位置
$sampleRate = unpack('V', fread($file, 4))[1];
fseek($file, 40); // 定位到“数据大小”位置
$dataSize = unpack('V', fread($file, 4))[1];
fclose($file);
// 计算时长(秒):数据大小 / (采样率 * 声道数 * 位深度/8)
// 此处假设为16位立体声(常见情况)
$duration = $dataSize / ($sampleRate * 2 * 2);
return $duration;
}
// 使用示例
$duration = getWavDuration('audio.wav');
echo "WAV时长:" . gmdate("H:i:s", (int)$duration); 对于MP3文件(粗略估算):MP3时长可通过文件大小和比特率估算(仅适用于固定比特率,CBR):
function getMp3Duration($filePath) {
$fileSize = filesize($filePath);
$bitRate = 128000; // 假设比特率为128kbps(需根据实际文件调整)
// 时长(秒)= (文件大小 × 8) / 比特率
$duration = ($fileSize * 8) / $bitRate;
return $duration;
}
// 使用示例
$duration = getMp3Duration('audio.mp3');
echo "MP3时长:" . gmdate("H:i:s", (int)$duration); 方法三:php调用ffmpeg,确保电脑安装了ffmpeg$file = 'path/to/your/audio.mp3'; // 替换为你的音频文件路径
$command = 'ffmpeg -i ' . escapeshellarg($file) . ' 2>&1';
$output = shell_exec($command);
// 使用正则表达式提取时长信息
if (preg_match('/Duration: ([0-9:.]+)/', $output, $matches)) {
$duration = $matches[1];
echo "音频时长: " . $duration;
} else {
echo "无法获取音频时长";
}注意事项:推荐使用 getID3手动解析仅适用于简单场景,而 getID3 能处理可变比特率(VBR)、不同编码格式等复杂情况。安装依赖确保服务器已安装必要的扩展(如 php-mbstring),否则 getID3 可能报错。错误处理添加文件存在性检查(file_exists)和异常捕获以增强健壮性。通过上述方法,可准确或近似获取音频文件的播放时长。
网友回复


