最简单的方式(使用 HTML5 <video>
这是最直接、最推荐的方法,PHP 在这里主要负责提供视频文件,而播放的核心功能由浏览器内置的 HTML5 视频引擎完成。
(图片来源网络,侵删)
准备工作
在你的项目目录下创建一个文件夹来存放视频文件,videos/。
my-project/
├── index.php
└── videos/
└── sample.mp4 <-- 你的视频文件
重要提示: 视频文件(如 .mp4, .webm, .ogg)需要放在你的网站根目录或一个可公开访问的目录下,PHP 代码本身不能“播放”视频,它只是告诉浏览器去哪里找这个视频文件。
PHP 代码 (index.php)
这个 PHP 文件会生成一个包含 HTML5 视频播放器的网页。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">PHP 视频播放器示例</title>
<style>
/* 简单的样式,让播放器居中 */
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f0f0f0;
}
video {
max-width: 800px;
width: 100%;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0,0,0,0.2);
}
</style>
</head>
<body>
<video controls>
<!--
src 属性指向你的视频文件。
使用 PHP 的 echo 可以动态地生成路径,这对于从数据库获取文件名很有用。
-->
<source src="videos/sample.mp4" type="video/mp4">
<!--
提供备选格式,以提高浏览器兼容性。
如果浏览器不支持 MP4,它可以尝试播放 WebM 或 OGG。
-->
<source src="videos/sample.webm" type="video/webm">
<source src="videos/sample.ogg" type="video/ogg">
<!--
如果浏览器不支持 HTML5 视频,将显示这段文本。
你也可以在这里放置一个 Flash 播放器的 fallback 代码(但现在已不推荐)。
-->
您的浏览器不支持 HTML5 视频,请升级您的浏览器。
</video>
</body>
</html>
代码解释:
(图片来源网络,侵删)
<video>: 这是 HTML5 的视频标签。
controls: 这是一个重要属性,它告诉浏览器显示播放控件(播放/暂停、进度条、音量、全屏等)。
<source>: 标签用于为视频提供多个备选源,浏览器会使用它支持的第一个格式。type 属性帮助浏览器快速判断是否能播放该格式,无需下载尝试。
src="videos/sample.mp4": 这是视频文件的路径。这个路径是相对于当前 PHP 文件的位置的。
动态加载视频(从数据库或目录读取)
在实际应用中,视频的文件名和路径通常存储在数据库中,或者你想动态列出某个目录下的所有视频,PHP 在这里就派上大用场了。
示例:从目录动态列出视频并播放
假设你的 videos/ 目录里有多个视频文件。
<?php
// 定义视频文件夹的路径
$videoDir = 'videos/';
$videoFiles = [];
// 检查目录是否存在
if (is_dir($videoDir)) {
// 扫描目录,获取所有文件
$files = scandir($videoDir);
// 遍历文件,筛选出视频文件
foreach ($files as $file) {
// 跳过 '.' 和 '..' 目录
if ($file === '.' || $file === '..') {
continue;
}
// 获取文件扩展名
$extension = strtolower(pathinfo($file, PATHINFO_EXTENSION));
// 定义常见的视频扩展名
$allowedExtensions = ['mp4', 'webm', 'ogg', 'mov'];
// 如果是允许的视频格式,则添加到数组中
if (in_array($extension, $allowedExtensions)) {
$videoFiles[] = $file;
}
}
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">动态视频播放列表</title>
<style>
body { font-family: Arial, sans-serif; background-color: #222; color: #fff; padding: 20px; }
.video-list { list-style: none; padding: 0; }
.video-list li { margin-bottom: 10px; }
.video-list a { display: block; padding: 10px; background-color: #444; color: #fff; text-decoration: none; border-radius: 5px; }
.video-list a:hover { background-color: #555; }
video { width: 100%; max-width: 800px; margin-top: 20px; border-radius: 8px; }
</style>
</head>
<body>
<h1>视频列表</h1>
<ul class="video-list">
<?php if (empty($videoFiles)): ?>
<li>没有找到任何视频文件。</li>
<?php else: ?>
<?php foreach ($videoFiles as $video): ?>
<li>
<!--
创建一个链接,点击后播放对应的视频。
使用 URL 的查询字符串 (?video=...) 来传递视频文件名。
-->
<a href="?video=<?php echo urlencode($video); ?>">
<?php echo htmlspecialchars($video); ?>
</a>
</li>
<?php endforeach; ?>
<?php endif; ?>
</ul>
<?php
// 检查 URL 中是否有 'video' 参数,如果有则显示播放器
if (isset($_GET['video']) && !empty($_GET['video'])) {
$videoToPlay = $_GET['video'];
$videoPath = $videoDir . $videoToPlay;
// 安全检查:确保请求的文件确实在视频目录下,防止路径遍历攻击
if (file_exists($videoPath) && is_file($videoPath)) {
echo '<h2>正在播放: ' . htmlspecialchars($videoToPlay) . '</h2>';
echo '<video controls autoplay>';
echo '<source src="' . htmlspecialchars($videoPath) . '" type="video/mp4">'; // 假设主要是 mp4
echo '您的浏览器不支持 HTML5 视频。';
echo '</video>';
} else {
echo '<p style="color: red;">错误:请求的视频文件不存在或无效。</p>';
}
}
?>
</body>
</html>
代码解释:
scandir(): 扫描指定目录,返回一个包含文件和目录名称的数组。
pathinfo(): 获取文件路径的信息,如扩展名、文件名等。
in_array(): 检查一个值是否在数组中,我们用它来过滤出视频文件。
isset($_GET['video']): 检查 URL 中是否存在 video 这个查询参数。
urlencode() 和 htmlspecialchars(): 这两个函数是至关重要的。
urlencode() 对 URL 中的特殊字符进行编码,确保链接的正确性。
htmlspecialchars() 将 HTML 特殊字符(如 <, >, &)转换为实体,防止 XSS (跨站脚本攻击),在输出到 HTML 时,这是必须的安全措施。
- 安全检查:
file_exists($videoPath) && is_file($videoPath) 这行代码非常重要,它可以防止恶意用户通过类似 ?video=../wp-config.php 这样的请求来访问你服务器上的敏感文件。
进阶 - 自定义播放器与 API
如果你需要更高级的功能,比如自定义播放器皮肤、添加广告、或者通过 JavaScript 控制播放,你可以使用像 Video.js 或 Plyr 这样的 JavaScript 视频库,PHP 的角色依然是提供视频源和后端逻辑。
(图片来源网络,侵删)
使用 Video.js 示例
-
引入 Video.js 库
你可以从 Video.js 官网 下载库文件,或使用 CDN。
-
PHP 代码 (index.php)
<?php
// 视频文件路径,同样可以动态生成
$videoPath = 'videos/sample.mp4';
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">Video.js 自定义播放器</title>
<!-- 引入 Video.js CSS -->
<link href="https://vjs.zencdn.net/8.6.1/video-js.css" rel="stylesheet">
<!-- 自定义样式 -->
<style>
body { background-color: #2c2c2c; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; }
.video-js { width: 800px; height: 450px; }
</style>
</head>
<body>
<video
id="my-video"
class="video-js vjs-default-skin"
controls
preload="auto"
data-setup="{}"
>
<source src="<?php echo htmlspecialchars($videoPath); ?>" type="video/mp4">
<p class="vjs-no-js">
要播放此视频,你需要启用 JavaScript,并安装支持 HTML5 video 的浏览器。
<a href="https://videojs.com/html5-video-support/" target="_blank">
查看哪些浏览器支持
</a>
</p>
</video>
<!-- 引入 Video.js JavaScript -->
<script src="https://vjs.zencdn.net/8.6.1/video.min.js"></script>
</body>
</html>
优点:
- 高度可定制: 可以轻松更改播放器的外观和皮肤。
- 丰富的插件: 有大量的官方和社区插件,如广告、弹幕、直播等。
- 跨浏览器兼容性: 处理了旧版浏览器的兼容性问题。
- API 丰富: 提供了强大的 JavaScript API,让你可以通过代码精确控制播放器的行为。
总结与建议
方案
优点
缺点
适用场景
方案一 (原生 HTML5)
简单、快速、性能好,无需额外库。
自定义程度低,功能有限。
个人博客、简单的视频展示页面。
方案二 (PHP 动态)
灵活、安全,能根据后端数据动态生成内容。
需要编写 PHP 逻辑来处理文件和 URL。
视频网站、内容管理系统、需要播放列表的应用。
方案三 (JS 库)
功能强大、高度可定制,社区支持好。
需要引入外部库,增加了一定的复杂度。
专业视频平台、需要复杂交互和自定义 UI 的项目。
对于大多数 PHP 项目,方案二 是最常用和最平衡的选择,它结合了 PHP 的后端处理能力和 HTML5 视频的跨平台优势。
这是最直接、最推荐的方法,PHP 在这里主要负责提供视频文件,而播放的核心功能由浏览器内置的 HTML5 视频引擎完成。

(图片来源网络,侵删)
准备工作
在你的项目目录下创建一个文件夹来存放视频文件,videos/。
my-project/
├── index.php
└── videos/
└── sample.mp4 <-- 你的视频文件
重要提示: 视频文件(如 .mp4, .webm, .ogg)需要放在你的网站根目录或一个可公开访问的目录下,PHP 代码本身不能“播放”视频,它只是告诉浏览器去哪里找这个视频文件。
PHP 代码 (index.php)
这个 PHP 文件会生成一个包含 HTML5 视频播放器的网页。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">PHP 视频播放器示例</title>
<style>
/* 简单的样式,让播放器居中 */
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f0f0f0;
}
video {
max-width: 800px;
width: 100%;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0,0,0,0.2);
}
</style>
</head>
<body>
<video controls>
<!--
src 属性指向你的视频文件。
使用 PHP 的 echo 可以动态地生成路径,这对于从数据库获取文件名很有用。
-->
<source src="videos/sample.mp4" type="video/mp4">
<!--
提供备选格式,以提高浏览器兼容性。
如果浏览器不支持 MP4,它可以尝试播放 WebM 或 OGG。
-->
<source src="videos/sample.webm" type="video/webm">
<source src="videos/sample.ogg" type="video/ogg">
<!--
如果浏览器不支持 HTML5 视频,将显示这段文本。
你也可以在这里放置一个 Flash 播放器的 fallback 代码(但现在已不推荐)。
-->
您的浏览器不支持 HTML5 视频,请升级您的浏览器。
</video>
</body>
</html>
代码解释:

(图片来源网络,侵删)
<video>: 这是 HTML5 的视频标签。controls: 这是一个重要属性,它告诉浏览器显示播放控件(播放/暂停、进度条、音量、全屏等)。<source>: 标签用于为视频提供多个备选源,浏览器会使用它支持的第一个格式。type属性帮助浏览器快速判断是否能播放该格式,无需下载尝试。src="videos/sample.mp4": 这是视频文件的路径。这个路径是相对于当前 PHP 文件的位置的。
动态加载视频(从数据库或目录读取)
在实际应用中,视频的文件名和路径通常存储在数据库中,或者你想动态列出某个目录下的所有视频,PHP 在这里就派上大用场了。
示例:从目录动态列出视频并播放
假设你的 videos/ 目录里有多个视频文件。
<?php
// 定义视频文件夹的路径
$videoDir = 'videos/';
$videoFiles = [];
// 检查目录是否存在
if (is_dir($videoDir)) {
// 扫描目录,获取所有文件
$files = scandir($videoDir);
// 遍历文件,筛选出视频文件
foreach ($files as $file) {
// 跳过 '.' 和 '..' 目录
if ($file === '.' || $file === '..') {
continue;
}
// 获取文件扩展名
$extension = strtolower(pathinfo($file, PATHINFO_EXTENSION));
// 定义常见的视频扩展名
$allowedExtensions = ['mp4', 'webm', 'ogg', 'mov'];
// 如果是允许的视频格式,则添加到数组中
if (in_array($extension, $allowedExtensions)) {
$videoFiles[] = $file;
}
}
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">动态视频播放列表</title>
<style>
body { font-family: Arial, sans-serif; background-color: #222; color: #fff; padding: 20px; }
.video-list { list-style: none; padding: 0; }
.video-list li { margin-bottom: 10px; }
.video-list a { display: block; padding: 10px; background-color: #444; color: #fff; text-decoration: none; border-radius: 5px; }
.video-list a:hover { background-color: #555; }
video { width: 100%; max-width: 800px; margin-top: 20px; border-radius: 8px; }
</style>
</head>
<body>
<h1>视频列表</h1>
<ul class="video-list">
<?php if (empty($videoFiles)): ?>
<li>没有找到任何视频文件。</li>
<?php else: ?>
<?php foreach ($videoFiles as $video): ?>
<li>
<!--
创建一个链接,点击后播放对应的视频。
使用 URL 的查询字符串 (?video=...) 来传递视频文件名。
-->
<a href="?video=<?php echo urlencode($video); ?>">
<?php echo htmlspecialchars($video); ?>
</a>
</li>
<?php endforeach; ?>
<?php endif; ?>
</ul>
<?php
// 检查 URL 中是否有 'video' 参数,如果有则显示播放器
if (isset($_GET['video']) && !empty($_GET['video'])) {
$videoToPlay = $_GET['video'];
$videoPath = $videoDir . $videoToPlay;
// 安全检查:确保请求的文件确实在视频目录下,防止路径遍历攻击
if (file_exists($videoPath) && is_file($videoPath)) {
echo '<h2>正在播放: ' . htmlspecialchars($videoToPlay) . '</h2>';
echo '<video controls autoplay>';
echo '<source src="' . htmlspecialchars($videoPath) . '" type="video/mp4">'; // 假设主要是 mp4
echo '您的浏览器不支持 HTML5 视频。';
echo '</video>';
} else {
echo '<p style="color: red;">错误:请求的视频文件不存在或无效。</p>';
}
}
?>
</body>
</html>
代码解释:
scandir(): 扫描指定目录,返回一个包含文件和目录名称的数组。pathinfo(): 获取文件路径的信息,如扩展名、文件名等。in_array(): 检查一个值是否在数组中,我们用它来过滤出视频文件。isset($_GET['video']): 检查 URL 中是否存在video这个查询参数。urlencode()和htmlspecialchars(): 这两个函数是至关重要的。urlencode()对 URL 中的特殊字符进行编码,确保链接的正确性。htmlspecialchars()将 HTML 特殊字符(如<,>,&)转换为实体,防止 XSS (跨站脚本攻击),在输出到 HTML 时,这是必须的安全措施。
- 安全检查:
file_exists($videoPath) && is_file($videoPath)这行代码非常重要,它可以防止恶意用户通过类似?video=../wp-config.php这样的请求来访问你服务器上的敏感文件。
进阶 - 自定义播放器与 API
如果你需要更高级的功能,比如自定义播放器皮肤、添加广告、或者通过 JavaScript 控制播放,你可以使用像 Video.js 或 Plyr 这样的 JavaScript 视频库,PHP 的角色依然是提供视频源和后端逻辑。

(图片来源网络,侵删)
使用 Video.js 示例
-
引入 Video.js 库 你可以从 Video.js 官网 下载库文件,或使用 CDN。
-
PHP 代码 (
index.php)
<?php
// 视频文件路径,同样可以动态生成
$videoPath = 'videos/sample.mp4';
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">Video.js 自定义播放器</title>
<!-- 引入 Video.js CSS -->
<link href="https://vjs.zencdn.net/8.6.1/video-js.css" rel="stylesheet">
<!-- 自定义样式 -->
<style>
body { background-color: #2c2c2c; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; }
.video-js { width: 800px; height: 450px; }
</style>
</head>
<body>
<video
id="my-video"
class="video-js vjs-default-skin"
controls
preload="auto"
data-setup="{}"
>
<source src="<?php echo htmlspecialchars($videoPath); ?>" type="video/mp4">
<p class="vjs-no-js">
要播放此视频,你需要启用 JavaScript,并安装支持 HTML5 video 的浏览器。
<a href="https://videojs.com/html5-video-support/" target="_blank">
查看哪些浏览器支持
</a>
</p>
</video>
<!-- 引入 Video.js JavaScript -->
<script src="https://vjs.zencdn.net/8.6.1/video.min.js"></script>
</body>
</html>
优点:
- 高度可定制: 可以轻松更改播放器的外观和皮肤。
- 丰富的插件: 有大量的官方和社区插件,如广告、弹幕、直播等。
- 跨浏览器兼容性: 处理了旧版浏览器的兼容性问题。
- API 丰富: 提供了强大的 JavaScript API,让你可以通过代码精确控制播放器的行为。
总结与建议
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 方案一 (原生 HTML5) | 简单、快速、性能好,无需额外库。 | 自定义程度低,功能有限。 | 个人博客、简单的视频展示页面。 |
| 方案二 (PHP 动态) | 灵活、安全,能根据后端数据动态生成内容。 | 需要编写 PHP 逻辑来处理文件和 URL。 | 视频网站、内容管理系统、需要播放列表的应用。 |
| 方案三 (JS 库) | 功能强大、高度可定制,社区支持好。 | 需要引入外部库,增加了一定的复杂度。 | 专业视频平台、需要复杂交互和自定义 UI 的项目。 |
对于大多数 PHP 项目,方案二 是最常用和最平衡的选择,它结合了 PHP 的后端处理能力和 HTML5 视频的跨平台优势。
