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 后台配置腾讯云密钥是使用视频点播功能的前提。请按以下步骤操作:
- 登录腾讯云控制台,进入 访问管理 页面。
- 在「API 密钥管理」中新建密钥,获取
SecretId和SecretKey。 - 登录 EduSoho 管理后台 → 系统 → 云视频 → 腾讯云设置。
- 将获取的
SecretId和SecretKey填入对应输入框,点击「保存」。
注意 :建议使用子账号密钥,并仅授予
QcloudVODFullAccess策略,避免主账号密钥泄露风险。
配置界面参考如下:
3.2 视频上传流程
配置好密钥后,管理员即可在后台进行视频上传操作:
- 进入 教育云 → 云视频 → 视频管理。
- 点击「上传视频」按钮,选择本地视频文件(支持 MP4、FLV、MOV 等常见格式)。
- 系统自动调用腾讯云 VOD 上传 SDK,将视频文件分片上传至腾讯云对象存储。
- 上传完成后,腾讯云自动触发转码(转码模板可在腾讯云控制台 VOD 服务中预设)。
- 转码完成后,视频状态变为「已发布」,即可在课程中使用。
关键上传代码示例(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 控制台 → 转码设置 |
提示 :
appId和fileID是播放器初始化的必需参数,务必确保与腾讯云 VOD 中的资源对应。
4. 常见问题与排查
4.1 视频上传失败
现象:点击上传后进度条卡住或提示「上传失败」。
排查步骤:
- 检查密钥配置 :确认
SecretId和SecretKey已正确填入 EduSoho 后台,且密钥状态为「启用」。 - 检查网络环境 :确保服务器能够正常访问腾讯云 VOD 域名(
vod.tencentcloudapi.com),可在服务器执行ping vod.tencentcloudapi.com测试连通性。 - 检查文件大小与格式:腾讯云 VOD 单文件上传上限为 5GB,支持 MP4、FLV、MOV、AVI 等常见格式。超大文件建议使用分片上传或通过腾讯云控制台上传。
- 查看日志 :检查 EduSoho 运行时日志(
var/logs/目录),搜索TxVideoPlugin或VodUpload相关错误信息。
4.2 播放器无法加载(黑屏/白屏)
现象:视频页面打开后播放器区域空白,或提示「播放器加载失败」。
排查步骤:
- 检查
appId和fileID:播放器初始化时必须传入正确的appId(腾讯云账号 APPID)和fileID(视频文件 ID)。可在腾讯云 VOD 控制台 → 视频管理 → 详情页中核对这两个参数。 - 检查播放器 SDK 加载 :确认页面已正确加载
TCPlayerSDK(//player.qcloudimg.com/js/tcplayer.min.js)。打开浏览器开发者工具 → Network 面板,查看该 JS 文件是否成功加载(状态码 200)。 - 检查跨域问题:如果播放器部署在 HTTPS 页面,确保引用的 SDK 也是 HTTPS 协议,避免混合内容被浏览器拦截。
- 检查浏览器兼容性:TCPlayer 支持 Chrome、Firefox、Safari、Edge 等主流浏览器。IE 11 以下版本可能不支持,建议升级浏览器。
4.3 视频转码失败
现象:视频上传成功后,状态长时间停留在「转码中」或显示「转码失败」。
排查步骤:
- 检查转码模板配置:登录腾讯云 VOD 控制台 → 转码设置,确认已配置至少一个转码模板(建议预设「通用转码模板」)。如果模板被删除或禁用,转码将无法执行。
- 检查源文件格式:部分特殊编码格式(如 H.265 编码的 MP4)可能不被转码模板支持,建议使用 H.264 编码的 MP4 文件测试。
- 查看转码任务详情:在腾讯云 VOD 控制台 → 视频管理 → 该视频详情页 → 转码任务中查看具体失败原因,常见错误包括「源文件损坏」「分辨率超出限制」等。
- 联系腾讯云技术支持 :如果以上步骤均无法解决,可在腾讯云控制台提交工单,提供
FileID和转码任务 ID 以便排查。
4.4 播放器续播/记忆播放不生效
现象:用户重新打开视频后,没有从上次播放位置继续播放。
排查步骤:
- 检查插件配置 :确认播放器初始化代码中已启用
ContinuePlay和MemoryPlay插件(参见 3.3 节 Twig 模板示例)。 - 检查用户登录状态:续播功能依赖用户身份标识,确保用户已登录 EduSoho 系统,且浏览器未禁用 Cookie 或 LocalStorage。
- 检查跨域存储限制:如果播放器嵌入在第三方域名下,浏览器的同源策略可能阻止续播数据的读写。建议将播放器部署在同域名下,或通过后端 API 同步播放进度。