PHP生成视频列表页的核心是扫描目录、提取元信息并输出含video标签的HTML,需用ffprobe获取时长、过滤非视频文件、校验路径防XSS、配置正确MIME类型及CORS。

PHP 读取视频文件并生成 HTML 列表页的核心逻辑
PHP 本身不处理视频解码或播放,它的作用是扫描目录、提取元信息(如文件名、大小、时长)、生成带 标签的 HTML 页面。关键不是“生成视频”,而是“生成能播视频的页面”。
- 必须用
scandir()或glob()获取视频文件路径,注意过滤掉非视频后缀(如.mp4、.webm、.mov) - 用
filesize()和date()获取大小与修改时间,但**无法直接获取视频时长**——PHP 原生不支持,需调用外部工具(如ffprobe)或依赖前端 JS 播放器加载后读取duration - 生成的 HTML 必须包含
controls属性,否则用户无法操作;若要自动播放,需同时加autoplay muted(浏览器强制要求静音)
用 PHP + ffprobe 获取真实视频时长(避免前端空等待)
仅靠 PHP 文件系统函数拿不到时长,硬写死或留空会导致列表页体验割裂。推荐在服务端预查一次,把时长存为 JSON 或写入 HTML data-duration 属性。
function getVideoDuration($path) {
$cmd = 'ffprobe -v quiet -show_entries format=duration -of default=nw=1:nk=1 "' . escapeshellarg($path) . '"';
$output = shell_exec($cmd);
return round(floatval(trim($output)), 1);
}
// 示例:遍历目录
$videos = glob('videos/*.mp4');
foreach ($videos as $file) {
$duration = getVideoDuration($file);
echo '';
}
-
escapeshellarg()必须使用,防止路径含空格或特殊字符导致命令执行失败 - 若服务器没装
ffmpeg,ffprobe会报错——先运行which ffprobe确认存在,否则降级为不显示时长 - 频繁调用
ffprobe有性能开销,建议生成静态 HTML 页或加缓存(如写入videos.json)
生成可点击跳转的视频列表页(非单个 video 标签堆砌)
用户需要的是“列表页”,不是“一堆自动播放的 video 标签”。应以链接形式组织,点击后在新页或 modal 中播放,避免页面卡顿和资源浪费。
- 用
路由,而不是把所有视频都渲染进同一页面 -
play.php接收$_GET['v'],校验后输出单个标签,路径需白名单过滤(如限定在videos/目录下) - 校验示例:
if (strpos($_GET['v'], '..') !== false || !in_array(pathinfo($_GET['v'], PATHINFO_EXTENSION), ['mp4','webm'])) die('Invalid file'); - 避免直接输出用户传入的文件名到 HTML,防止 XSS,始终用
htmlspecialchars()处理显示内容
常见踩坑:MIME 类型缺失、跨域限制、移动端不自动播放
生成的页面跑不起来,大概率不是 PHP 写错了,而是 HTTP 层或浏览器策略挡住了。
立即学习“PHP免费学习笔记(深入)”;
- Apache/Nginx 需配置正确 MIME 类型,否则
.mp4可能被当成text/plain下载而非播放——检查响应头中Content-Type: video/mp4 - 若视频放在子域名或 CDN,需确保
的src支持 CORS,否则 Chrome 控制台报No 'Access-Control-Allow-Origin' - 移动端 Safari/Chrome 默认禁止自动播放音频,即使加了
autoplay muted,首次交互前也可能静音或暂停——不要依赖自动播放做核心流程 - PHP 输出 HTML 前不能有任何
echo、BOM 或空白符,否则可能解析异常(尤其 IE 兼容模式)











