织梦视频提取缩略图

99ANYc3cd6
预计阅读时长 23 分钟
位置: 首页 织梦建站 正文

使用 FFmpeg + PHP (最推荐、最强大)

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

织梦视频提取缩略图
(图片来源网络,侵删)

原理:

通过服务器上安装的 FFmpeg 程序,在PHP中调用它的命令行接口,从视频文件中截取指定时间点的一帧,并保存为图片(JPG/PNG)。

准备工作:

  1. 安装 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”即可,非常方便。

  2. 确保PHP有执行命令的权限:

    • PHP需要能调用 shell_exec()exec() 等函数来执行FFmpeg命令。
    • php.ini 文件中,确保 disable_functions 没有禁用这些函数。
    • 注意: 这可能带来安全风险,请确保你的网站是安全的,或者只在需要时开启,完成后关闭。

操作步骤:

  1. 创建视频处理脚本 (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 "缩略图生成失败!";
    // }
    ?>
  2. 修改织梦发布或编辑文档的代码 找到织梦处理文档的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。

准备工作:

  1. 安装 MPlayer:

    # CentOS
    yum install -y mplayer
    # Debian
    apt-get install -y mplayer
  2. 确保PHP有执行命令的权限 (同上)。

操作步骤:

  1. 创建视频处理脚本 (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;
    }
    ?>
  2. 修改织梦代码 调用方式和 FFmpeg 方法完全一样,只是引入的脚本和函数名不同。


使用云存储服务 (最简单、最省心)

如果你不想在服务器上安装任何软件,或者服务器环境受限,可以使用云存储的媒体处理功能。

原理:

你将视频上传到云服务商(如腾讯云COS、阿里云OSS、七牛云)后,利用它们提供的“媒体处理”或“图片处理”服务,在云端自动生成缩略图,然后你只需要在织梦中获取这个缩略图的URL即可。

优点:

  • 无需服务器配置:不依赖FFmpeg/MPlayer。
  • 高性能:由云服务商的专业集群处理,速度快。
  • 功能丰富:除了截图,还能进行视频转码、加水印等。

缺点:

  • 可能产生费用:云服务通常有免费额度,超出后会按量计费。
  • API调用:需要集成云服务商的SDK,对新手有一定门槛。

基本流程:

  1. 在云服务商控制台开通“媒体处理”服务。
  2. 配置一个“截图模板”(截取第1秒,生成320x240的JPG)。
  3. 在织梦中上传视频时,先将视频上传到云存储。
  4. 调用云服务的媒体处理API,传入视频URL和处理模板,请求生成缩略图。
  5. 获取处理完成后缩略图的URL,并保存到织梦的数据库中。

总结与建议

方法 优点 缺点 推荐度
FFmpeg + PHP 功能强大、稳定、免费、可控性高 需要服务器安装FFmpeg,PHP需开启shell_exec ⭐⭐⭐⭐⭐ (强烈推荐)
MPlayer + PHP FFmpeg的备选方案 功能相对FFmpeg较少,同样需要服务器环境 ⭐⭐⭐ (备选方案)
云存储服务 无需服务器配置、高性能、功能扩展性强 可能产生费用,API集成有门槛 ⭐⭐⭐⭐ (适合有预算和团队的项目)

对于绝大多数站长和开发者来说,方法一(FFmpeg + PHP) 是最佳选择,它免费、强大且完全掌控在自己的服务器上,是处理这类问题的标准解决方案。

请根据你的服务器环境和技术能力选择最适合你的方法。

-- 展开阅读全文 --
头像
计算机C语言考试怎么高效通过?
« 上一篇 04-25
数据表如何高效管理?
下一篇 » 04-25

相关文章

取消
微信二维码
支付宝二维码

目录[+]