新版edusoho25.4.11对接腾讯云视频点播插件(TxVideoPlugin)

PHP 项目EduSoho,技术栈是 Symfony 2/3 + Twig + jQuery

EduSoho 25.4.11 对接腾讯云视频点播插件(TxVideoPlugin)实战指南

1. 引言

EduSoho 作为国内主流的开源网校系统,其视频存储与播放一直是教学体验的核心。随着版本迭代至 25.4.11,官方对云视频服务的对接方式也做了优化。本文将详细介绍如何在 EduSoho 25.4.11 上安装并配置腾讯云视频点播插件(TxVideoPlugin),实现视频上传、转码、播放的一站式云服务。

2. 环境准备与技术栈

php 复制代码
<?php

namespace TxVideoPlugin\Controller\AdminV2;

use AppBundle\Common\Paginator;
use AppBundle\Controller\AdminV2\BaseController;
use Symfony\Component\HttpFoundation\Request;
use TxVideoPlugin\Biz\TxVideo\Service\CategoryService;
use TxVideoPlugin\Biz\TxVideo\Service\TxVideoService;

class VideoController extends BaseController
{
    protected $limit = 20;

    public function videoAction(Request $request)
    {
        $conditions = $request->query->all();
        $page       = $request->query->get('page', 1);
        $start      = ($page - 1) * $this->limit;
        // 移除分页和框架相关的无关参数,避免传入腾讯云API
        unset($conditions['page'], $conditions['perpage'], $conditions['_target_path']);
        $videos     = $this->getTxVideoService()->search($conditions, $start, $this->limit);
        $paginator  = new Paginator(
            $request,
            $videos['TotalCount'],
            $this->limit
        );

        $categorys = $this->getCategoryService()->buildChoices('txvideo');

        return $this->render(
            'TxVideoPlugin:admin-v2/video:index.html.twig',
            array(
                'paginator' => $paginator,
                'videos'    => $videos['MediaInfoSet'],
                'categorys' => $categorys,
            )
        );
    }

    public function editAction(Request $request, $id)
    {
        if ('POST' == $request->getMethod()) {
            $fields = $request->request->all();
            $this->getTxVideoService()->update($id, $fields);

            return $this->createJsonResponse(true);
        }

        $categorys = $this->getCategoryService()->buildChoices('txvideo');
        $video     = $this->getTxVideoService()->get($id);
        $video     = reset($video['MediaInfoSet']);
        $category  = $this->getCategoryService()->getByClassId($video['BasicInfo']['ClassId']);

        return $this->render(
            'TxVideoPlugin:admin-v2/video:modal.html.twig',
            array(
                'video'     => $video,
                'categorys' => $categorys,
                'category'  => $category,
            )
        );
    }

    public function deleteAction(Request $request, $id)
    {
        $this->getTxVideoService()->delete($id);

        return $this->createJsonResponse(true);
    }

    /**
     * @return TxVideoService
     */
    protected function getTxVideoService()
    {
        return $this->createService('TxVideoPlugin:TxVideo:TxVideoService');
    }

    /**
     * @return CategoryService
     */
    protected function getCategoryService()
    {
        return $this->createService('TxVideoPlugin:TxVideo:CategoryService');
    }
}

电脑端界面效果图

手机端界面效果图

后台填写你自己开通好的腾讯云点播账号信息

新建视频课程的时候可以看到早就上传好的腾讯云的视频,这时候直接点击导入到edusoho系统里面去就行了

后台也可以直接对云端的腾讯视频进行管理:上传、删除、新建分类等等

php 复制代码
<?php

namespace TxVideoPlugin;

use Codeages\PluginBundle\System\PluginBase;
use TxVideoPlugin\Biz\TxVideoServiceProvider;

class TxVideoPlugin extends PluginBase
{
    public function boot()
    {
        parent::boot();
        
        $biz = $this->container->get('biz');
        $biz->register(new TxVideoServiceProvider());
         require_once __DIR__.'/vendor/tencentcloud/TCloudAutoLoader.php';
    }

    public function getEnabledExtensions()
    {
        return array('DataTag', 'StatusTemplate', 'DataDict', 'NotificationTemplate');
    }
}

3. 配置与使用步骤

3.1 腾讯云密钥配置

在 EduSoho 后台配置腾讯云密钥是使用视频点播功能的前提。请按以下步骤操作:

  1. 登录腾讯云控制台,进入 访问管理 页面。
  2. 在「API 密钥管理」中新建密钥,获取 SecretIdSecretKey
  3. 登录 EduSoho 管理后台 → 系统云视频腾讯云设置
  4. 将获取的 SecretIdSecretKey 填入对应输入框,点击「保存」。

注意 :建议使用子账号密钥,并仅授予 QcloudVODFullAccess 策略,避免主账号密钥泄露风险。

配置界面参考如下:

3.2 视频上传流程

配置好密钥后,管理员即可在后台进行视频上传操作:

  1. 进入 教育云云视频视频管理
  2. 点击「上传视频」按钮,选择本地视频文件(支持 MP4、FLV、MOV 等常见格式)。
  3. 系统自动调用腾讯云 VOD 上传 SDK,将视频文件分片上传至腾讯云对象存储。
  4. 上传完成后,腾讯云自动触发转码(转码模板可在腾讯云控制台 VOD 服务中预设)。
  5. 转码完成后,视频状态变为「已发布」,即可在课程中使用。

关键上传代码示例(TxVideoPlugin 内部调用腾讯云 SDK):

php 复制代码
// 腾讯云 VOD 上传示例(TxVideoPlugin 封装)
use TencentCloud\Vod\V20180717\Models\CommitUploadRequest;
use TencentCloud\Vod\V20180717\Models\ApplyUploadRequest;

// 1. 申请上传
$applyReq = new ApplyUploadRequest();
$applyReq->setMediaType("video");
$applyReq->setMediaName($fileName);
$applyResp = $vodClient->ApplyUpload($applyReq);

// 2. 获取上传地址和临时密钥
$uploadAddress = $applyResp->getUploadAddress();
$tempKeys      = $applyResp->getTempCertificate();

// 3. 使用临时密钥进行分片上传(SDK 内部处理)
// 此处省略具体分片逻辑,由腾讯云 SDK 自动完成

// 4. 上传完成后提交确认
$commitReq = new CommitUploadRequest();
$commitReq->setVodSessionKey($uploadAddress->getVodSessionKey());
$commitResp = $vodClient->CommitUpload($commitReq);

3.3 播放器集成方法

视频上传并转码完成后,需要在 EduSoho 课程页面中集成播放器。TxVideoPlugin 提供了两种集成方式:

方式一:Twig 模板直接渲染

在课程内容页的 Twig 模板中,使用插件提供的播放器宏:

twig 复制代码
{% raw %}
{% set video = get_txvideo(videoId) %}
<div class="tx-video-player" data-video-id="{{ video.id }}" data-file-id="{{ video.fileId }}">
  <video id="tx-player-{{ video.id }}" class="video-js vjs-big-play-centered" controls preload="auto">
    <source src="{{ video.url }}" type="video/mp4">
  </video>
</div>

<script>
  // 初始化腾讯云播放器
  var player = TCPlayer('tx-player-{{ video.id }}', {
    fileID: '{{ video.fileId }}',
    appID: '{{ tx_app_id }}',
    plugins: {
      ContinuePlay: {},  // 续播插件
      MemoryPlay: {},    // 记忆播放
    }
  });
</script>
{% endraw %}
方式二:JavaScript API 动态加载

在自定义页面或单页应用中,通过 JS 动态创建播放器:

javascript 复制代码
// 动态加载腾讯云播放器 SDK
function loadTxPlayer(videoId, fileId, appId) {
  // 确保已加载 TCPlayer SDK
  if (typeof TCPlayer === 'undefined') {
    var script = document.createElement('script');
    script.src = '//player.qcloudimg.com/js/tcplayer.min.js';
    document.head.appendChild(script);
    script.onload = function() {
      initPlayer(videoId, fileId, appId);
    };
  } else {
    initPlayer(videoId, fileId, appId);
  }
}

function initPlayer(videoId, fileId, appId) {
  var player = TCPlayer('player-container-' + videoId, {
    fileID: fileId,
    appID: appId,
    autoplay: false,
    width: '100%',
    height: '100%',
    controls: true,
    // 清晰度切换
    definition: {
      '流畅': 0,
      '高清': 1,
      '超清': 2
    }
  });
}

3.4 关键配置项说明

配置项 说明 获取位置
SecretId 腾讯云 API 访问密钥 ID 腾讯云控制台 → 访问管理
SecretKey 腾讯云 API 访问密钥 Key 腾讯云控制台 → 访问管理
appId 腾讯云账号 APPID 腾讯云控制台 → 账号信息
fileID 视频文件在 VOD 中的唯一标识 上传完成后由腾讯云返回
转码模板 ID 预设的视频转码参数 腾讯云 VOD 控制台 → 转码设置

提示appIdfileID 是播放器初始化的必需参数,务必确保与腾讯云 VOD 中的资源对应。

4. 常见问题与排查

4.1 视频上传失败

现象:点击上传后进度条卡住或提示「上传失败」。

排查步骤

  1. 检查密钥配置 :确认 SecretIdSecretKey 已正确填入 EduSoho 后台,且密钥状态为「启用」。
  2. 检查网络环境 :确保服务器能够正常访问腾讯云 VOD 域名(vod.tencentcloudapi.com),可在服务器执行 ping vod.tencentcloudapi.com 测试连通性。
  3. 检查文件大小与格式:腾讯云 VOD 单文件上传上限为 5GB,支持 MP4、FLV、MOV、AVI 等常见格式。超大文件建议使用分片上传或通过腾讯云控制台上传。
  4. 查看日志 :检查 EduSoho 运行时日志(var/logs/ 目录),搜索 TxVideoPluginVodUpload 相关错误信息。

4.2 播放器无法加载(黑屏/白屏)

现象:视频页面打开后播放器区域空白,或提示「播放器加载失败」。

排查步骤

  1. 检查 appIdfileID :播放器初始化时必须传入正确的 appId(腾讯云账号 APPID)和 fileID(视频文件 ID)。可在腾讯云 VOD 控制台 → 视频管理 → 详情页中核对这两个参数。
  2. 检查播放器 SDK 加载 :确认页面已正确加载 TCPlayer SDK(//player.qcloudimg.com/js/tcplayer.min.js)。打开浏览器开发者工具 → Network 面板,查看该 JS 文件是否成功加载(状态码 200)。
  3. 检查跨域问题:如果播放器部署在 HTTPS 页面,确保引用的 SDK 也是 HTTPS 协议,避免混合内容被浏览器拦截。
  4. 检查浏览器兼容性:TCPlayer 支持 Chrome、Firefox、Safari、Edge 等主流浏览器。IE 11 以下版本可能不支持,建议升级浏览器。

4.3 视频转码失败

现象:视频上传成功后,状态长时间停留在「转码中」或显示「转码失败」。

排查步骤

  1. 检查转码模板配置:登录腾讯云 VOD 控制台 → 转码设置,确认已配置至少一个转码模板(建议预设「通用转码模板」)。如果模板被删除或禁用,转码将无法执行。
  2. 检查源文件格式:部分特殊编码格式(如 H.265 编码的 MP4)可能不被转码模板支持,建议使用 H.264 编码的 MP4 文件测试。
  3. 查看转码任务详情:在腾讯云 VOD 控制台 → 视频管理 → 该视频详情页 → 转码任务中查看具体失败原因,常见错误包括「源文件损坏」「分辨率超出限制」等。
  4. 联系腾讯云技术支持 :如果以上步骤均无法解决,可在腾讯云控制台提交工单,提供 FileID 和转码任务 ID 以便排查。

4.4 播放器续播/记忆播放不生效

现象:用户重新打开视频后,没有从上次播放位置继续播放。

排查步骤

  1. 检查插件配置 :确认播放器初始化代码中已启用 ContinuePlayMemoryPlay 插件(参见 3.3 节 Twig 模板示例)。
  2. 检查用户登录状态:续播功能依赖用户身份标识,确保用户已登录 EduSoho 系统,且浏览器未禁用 Cookie 或 LocalStorage。
  3. 检查跨域存储限制:如果播放器嵌入在第三方域名下,浏览器的同源策略可能阻止续播数据的读写。建议将播放器部署在同域名下,或通过后端 API 同步播放进度。