使用php-ffmpeg获取视频时长需依赖系统ffprobe工具,调用getduration()返回浮点秒数;必须安装ffmpeg套件、启用php执行函数,并推荐异常捕获与路径校验。

使用 php-ffmpeg 库获取视频时长,核心是通过 FFMpeg 实例打开媒体文件,再调用 getDuration() 方法。但要注意:该方法返回的是秒数(浮点型),且依赖 ffprobe 工具——不是仅靠 PHP 就能完成的纯代码解析。
确保环境已正确安装依赖
php-ffmpeg 本身是 PHP 封装库,真正解析元信息的是系统级的 ffprobe(FFmpeg 套件的一部分)。必须满足:
- 服务器已安装完整 FFmpeg(含
ffprobe),可通过命令行运行ffprobe -version验证 - PHP 进程有权限执行外部命令(如未禁用
exec、shell_exec等) - Composer 已安装
php-ffmpeg/php-ffmpeg:composer require php-ffmpeg/php-ffmpeg
基础用法:直接读取时长(秒)
以下是最简可用示例,适用于本地视频文件:
<?php require 'vendor/autoload.php';
use FFMpeg\FFMpeg;
// 指向 ffprobe 可执行文件路径(若不在系统 PATH 中需显式指定)
$ffmpeg = FFMpeg::create([
'ffmpeg.binaries' => '/usr/local/bin/ffmpeg',
'ffprobe.binaries' => '/usr/local/bin/ffprobe',
'timeout' => 3600,
'ffmpeg.threads' => 12,
]);
// 加载视频文件
$video = $ffmpeg->open('/path/to/video.mp4');
// 获取总时长(单位:秒,float 类型)
$durationInSeconds = $video->getDuration();
// 转换为更易读的格式(如分:秒)
$minutes = floor($durationInSeconds / 60);
$seconds = round($durationInSeconds % 60);
echo sprintf('%d:%02d', $minutes, $seconds); // 输出类似 "12:34"
?>
处理异常与边界情况
实际项目中需主动捕获常见问题:
-
文件不存在或路径错误:会抛出
RuntimeException,建议 try-catch 包裹 -
ffprobe 解析失败(如损坏文件、不支持编码):同样触发异常,可检查
$e->getMessage()中是否含"ffprobe failed" - 网络视频(HTTP URL):默认不支持直接传 URL;需先下载到临时文件,或改用流式方案(较复杂,一般不推荐用于单纯查时长)
-
大文件耗时:
getDuration()实际调用ffprobe -v quiet -show_entries format=duration -of default=noprint_wrappers=1:nokey=1,对超长视频可能几秒延迟,注意设置合理timeout
替代方案:绕过 php-ffmpeg 直接调用 ffprobe(轻量快速)
如果只需时长,无需转码等高级功能,可跳过整个库,用 PHP 原生执行命令:
$file = '/path/to/video.mp4';
$cmd = sprintf('ffprobe -v quiet -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "%s" 2>/dev/null', escapeshellarg($file));
$output = trim(shell_exec($cmd));
if (is_numeric($output) && $output > 0) {
echo "时长:{$output} 秒";
} else {
echo "无法获取时长";
}
这种方式更轻、更快,适合高并发或资源受限场景,但需自行保障安全性(如严格校验文件路径)和容错逻辑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











