使用 FFmpeg + PHP (最推荐、最强大)
这是目前最专业、最稳定、功能最强大的方法,FFmpeg 是一个强大的多媒体处理工具,可以处理几乎所有格式的视频。

原理:
通过服务器上安装的 FFmpeg 程序,在PHP中调用它的命令行接口,从视频文件中截取指定时间点的一帧,并保存为图片(JPG/PNG)。
准备工作:
-
安装 FFmpeg:
-
Linux (CentOS/Debian): 这是最常见的服务器环境,你可以通过包管理器轻松安装。
# CentOS/RHEL yum install -y ffmpeg # Debian/Ubuntu apt-get update apt-get install -y ffmpeg
-
Windows: 下载 FFmpeg 的可执行文件(
.exe),并将其所在的目录添加到系统的PATH环境变量中,这样PHP就能在任何位置调用它。
(图片来源网络,侵删) -
宝塔面板: 在“软件商店” -> “工具箱”中搜索并安装“FFmpeg”即可,非常方便。
-
-
确保PHP有执行命令的权限:
- PHP需要能调用
shell_exec()或exec()等函数来执行FFmpeg命令。 - 在
php.ini文件中,确保disable_functions没有禁用这些函数。 - 注意: 这可能带来安全风险,请确保你的网站是安全的,或者只在需要时开启,完成后关闭。
- PHP需要能调用
操作步骤:
-
创建视频处理脚本 (
video_to_thumb.php) 在你的网站根目录(或include目录下)创建一个名为video_to_thumb.php的文件,并粘贴以下代码:<?php /** * 视频转缩略图 * @param string $video_path 视频文件的完整路径 * @param string $thumb_path 缩略图保存的完整路径 * @param int $second 截取视频第几秒的帧 * @param int $width 缩略图宽度 * @param int $height 缩略图高度 * @return bool 成功返回true,失败返回false */ function videoToThumbnail($video_path, $thumb_path, $second = 1, $width = 320, $height = 240) { // 检查FFmpeg是否可用 if (!function_exists('shell_exec')) { die('Error: shell_exec function is disabled.'); } // 构建FFmpeg命令 // -i: 输入文件 // -ss: 设置截取时间点 (HH:MM:SS.ms) // -vframes: 1 只截取一帧 // -f image2: 指定输出格式为图片 // -s: 设置输出图片的尺寸 (宽x高) // 命令示例: ffmpeg -i /path/to/video.mp4 -ss 00:00:01 -vframes 1 -f image2 -s 320x240 /path/to/thumb.jpg $command = sprintf( 'ffmpeg -i "%s" -ss 00:00:%02d -vframes 1 -f image2 -s %dx%d "%s"', $video_path, $second, $width, $height, $thumb_path ); // 执行命令并捕获输出 shell_exec($command); // 检查缩略图是否生成成功 if (file_exists($thumb_path)) { return true; } else { // 如果失败,可以尝试不带尺寸参数的命令,有些编码可能不支持 $command_simple = sprintf( 'ffmpeg -i "%s" -ss 00:00:%02d -vframes 1 -f image2 "%s"', $video_path, $second, $thumb_path ); shell_exec($command_simple); return file_exists($thumb_path); } } // --- 调用示例 --- // $video_file = '/www/wwwroot/your_site/uploads/video/sample.mp4'; // $thumb_file = '/www/wwwroot/your_site/uploads/thumb/sample.jpg'; // if (videoToThumbnail($video_file, $thumb_file)) { // echo "缩略图生成成功!"; // } else { // echo "缩略图生成失败!"; // } ?> -
修改织梦发布或编辑文档的代码 找到织梦处理文档的PHP文件,通常在
/dede/目录下,article_add.php(发布文章)、article_edit.php(编辑文章) 等。在这些文件中,找到处理附件上传和保存数据的部分,假设你已经在上传视频后,得到了视频的路径
$video_url。在保存数据库记录之前,加入调用我们脚本的代码:
// ... 假设这是在上传视频后,$video_url 是你上传的视频在服务器上的绝对路径 // $video_url = $cfg_basedir.$activepath.'/'.$filename; // 定义缩略图保存路径 $thumb_dir = dirname($video_url); // 和视频在同一个目录 $thumb_filename = preg_replace('/\.[^.]+$/', '.jpg', basename($video_url)); // 将视频后缀改为.jpg $thumb_path = $thumb_dir . '/' . $thumb_filename; // 检查缩略图是否已存在,避免重复生成 if (!file_exists($thumb_path)) { // 引入我们的视频处理脚本 require_once(DEDEINC . '/video_to_thumb.php'); // 根据你的实际路径调整 // 调用函数生成缩略图 // 参数: 视频路径, 缩略图路径, 截取时间(秒), 缩略图宽, 缩略图高 $success = videoToThumbnail($video_url, $thumb_path, 1, 400, 300); if ($success) { // 生成成功,将缩略图路径存入变量,准备写入数据库 $litpic = $thumb_path; // $litpic 是织梦文章缩略图的默认字段名 // 或者你也可以存相对路径 // $litpic = str_replace($cfg_basedir, '', $thumb_path); } else { // 如果生成失败,可以设置一个默认缩略图或者留空 $litpic = ''; // 你也可以在这里记录错误日志 // file_put_contents('video_thumb_error.log', "Failed to generate thumbnail for: " . $video_url); } } else { // 如果缩略图已存在,直接使用 $litpic = $thumb_path; } // ... 将 $litpic 和其他数据一起写入数据库 // $query = "INSERT INTO dede_archives (title, litpic, ...)"; // $dsql->ExecuteNoneQuery($query);
使用 MPlayer + PHP (备选方案)
如果你的服务器上安装了 MPlayer 而不是 FFmpeg,或者你对 FFmpeg 的某些格式支持不满意,可以使用 MPlayer。
准备工作:
-
安装 MPlayer:
# CentOS yum install -y mplayer # Debian apt-get install -y mplayer
-
确保PHP有执行命令的权限 (同上)。
操作步骤:
-
创建视频处理脚本 (
video_to_thumb_mplayer.php) 这个脚本使用 MPlayer 的-vo png(输出PNG) 和-frames(帧数) 参数。<?php function videoToThumbnailWithMplayer($video_path, $thumb_path, $second = 1) { if (!function_exists('shell_exec')) { die('Error: shell_exec function is disabled.'); } // MPlayer命令 // -vo png: 使用PNG输出驱动 // -frames 1: 只播放一帧 // -ss 00:00:01: 从第1秒开始 // -nosound: 不处理音频,加快速度 // -vf scale=320:240: 可选,缩放尺寸 $command = sprintf( 'mplayer -vo png -frames 1 -ss 00:00:%02d -nosound "%s" > /dev/null 2>&1', $second, $video_path ); shell_exec($command); // MPlayer默认会在当前目录生成00000001.png $temp_thumb = dirname($video_path) . '/00000001.png'; if (file_exists($temp_thumb)) { // 重命名并移动到目标位置 rename($temp_thumb, $thumb_path); return true; } return false; } ?> -
修改织梦代码 调用方式和 FFmpeg 方法完全一样,只是引入的脚本和函数名不同。
使用云存储服务 (最简单、最省心)
如果你不想在服务器上安装任何软件,或者服务器环境受限,可以使用云存储的媒体处理功能。
原理:
你将视频上传到云服务商(如腾讯云COS、阿里云OSS、七牛云)后,利用它们提供的“媒体处理”或“图片处理”服务,在云端自动生成缩略图,然后你只需要在织梦中获取这个缩略图的URL即可。
优点:
- 无需服务器配置:不依赖FFmpeg/MPlayer。
- 高性能:由云服务商的专业集群处理,速度快。
- 功能丰富:除了截图,还能进行视频转码、加水印等。
缺点:
- 可能产生费用:云服务通常有免费额度,超出后会按量计费。
- API调用:需要集成云服务商的SDK,对新手有一定门槛。
基本流程:
- 在云服务商控制台开通“媒体处理”服务。
- 配置一个“截图模板”(截取第1秒,生成320x240的JPG)。
- 在织梦中上传视频时,先将视频上传到云存储。
- 调用云服务的媒体处理API,传入视频URL和处理模板,请求生成缩略图。
- 获取处理完成后缩略图的URL,并保存到织梦的数据库中。
总结与建议
| 方法 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| FFmpeg + PHP | 功能强大、稳定、免费、可控性高 | 需要服务器安装FFmpeg,PHP需开启shell_exec |
⭐⭐⭐⭐⭐ (强烈推荐) |
| MPlayer + PHP | FFmpeg的备选方案 | 功能相对FFmpeg较少,同样需要服务器环境 | ⭐⭐⭐ (备选方案) |
| 云存储服务 | 无需服务器配置、高性能、功能扩展性强 | 可能产生费用,API集成有门槛 | ⭐⭐⭐⭐ (适合有预算和团队的项目) |
对于绝大多数站长和开发者来说,方法一(FFmpeg + PHP) 是最佳选择,它免费、强大且完全掌控在自己的服务器上,是处理这类问题的标准解决方案。
请根据你的服务器环境和技术能力选择最适合你的方法。
