在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)和异常捕获以增强健壮性。
通过上述方法,可准确或近似获取音频文件的播放时长。
网友回复