+
38
-

回答

在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)和异常捕获以增强健壮性。

通过上述方法,可准确或近似获取音频文件的播放时长。

网友回复

我知道答案,我要回答