php 8.3+(含未来8.5)需借助ffprobe提取视频章节,要求ffmpeg≥4.4、格式支持mkv/mp4嵌入章节,通过shell_exec调用ffprobe输出json并安全解析。

PHP 8.5 本身不直接支持提取视频章节信息,它需要借助外部工具(如 ffmpeg)并通过系统调用实现。目前(截至 2024 年中),PHP 8.5 尚未正式发布(最新稳定版是 PHP 8.3,8.4 处于 RC 阶段),因此你实际使用的很可能是 PHP 8.3 或 8.4。以下方案适用于 PHP 8.3+,并兼容未来 8.5 的运行环境。
确认 ffmpeg 已安装并支持章节元数据
FFmpeg 提取章节依赖于容器格式(如 MP4、MKV)中嵌入的章节信息(通常来自 chapters 元数据或 CHAPTER* 标签)。不是所有视频都有章节,且不同封装格式支持程度不同:
- MKV 原生支持标准章节(
Chapters),最可靠 - MP4 可通过
udta.chpl或metabox 存储章节,但兼容性较弱 - 确保你的 ffmpeg 版本 ≥ 4.4(推荐 ≥ 5.1),运行
ffmpeg -version查看 - 执行
ffprobe -v quiet -print_format json -show_chapters input.mp4测试是否能输出章节 JSON
用 PHP 调用 ffprobe 获取章节 JSON
不要用 ffmpeg,而应使用轻量、只读的 ffprobe(ffmpeg 自带)来安全提取元数据:
- 构造 shell 命令,以 JSON 格式输出章节(避免解析文本带来的不确定性)
- 使用
shell_exec()或exec(),并严格过滤输入路径防止命令注入 - 示例代码:
<pre class="brush:php;toolbar:false;">$videoPath = '/path/to/video.mkv';
// 白名单校验:只允许字母、数字、下划线、连字符、点、斜杠
if (!preg_match('/^[a-zA-Z0-9_\-\.\/]+$/', basename($videoPath))) {
throw new InvalidArgumentException('Invalid filename');
}
$cmd = sprintf('ffprobe -v quiet -print_format json -show_chapters %s 2>/dev/null', escapeshellarg($videoPath));
$output = shell_exec($cmd);
$chapters = json_decode($output, true);
<p>if (json_last_error() !== JSON_ERROR_NONE || !isset($chapters['chapters'])) {
echo "No chapters found or invalid output.\n";
} else {
foreach ($chapters['chapters'] as $chap) {
$start = (int) round(floatval($chap['start_time']));
$end = (int) round(floatval($chap['end_time']));
$title = $chap['tags']['title'] ?? 'Untitled';
echo "Chapter: {$title} ({$start}s – {$end}s)\n";
}
}</p>处理常见问题与增强健壮性
实际使用中常遇到权限、路径、编码、空章节等问题,建议补充以下措施:
- 检查
ffprobe是否在PATH中,或写死完整路径(如/usr/bin/ffprobe) - 添加超时控制(用
proc_open()+stream_set_timeout()防止卡死) - 对 UTF-8 标题做
mb_convert_encoding()或iconv()清理(尤其 Windows 环境下 GBK 标题) - 若返回空章节,尝试用
-show_entries format_tags检查是否有非标准章节字段(如synopsis,chapter) - 对用户上传文件,先用
finfo_file()验证 MIME 类型为video/*,避免执行恶意文件
替代方案:用 PHP FFmpeg 扩展(可选)
如果你已启用 php-ffmpeg 扩展(非官方,需自行编译),可略过 shell 调用:
- 该扩展本质仍是调用 ffprobe,但封装了 API,例如:
$ffprobe->getChapters($videoPath) - 注意:它不比原生命令更强大,且维护滞后;PHP 8.3+ 下需确认扩展已适配(如 github.com/alchemy-fr/PHP-FFMpeg 已停止更新,推荐 fork 维护版)
- 除非项目已有该扩展且稳定运行,否则优先推荐原生命令方式——更可控、无依赖、调试直观
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











