Edusoho网校对接阿里云视频vod实现CDN云视频加速播放
很多人通过edusoho网校上传视频后点击打开该视频课程查看视频一直是这个界面,一直在加载,无法播放,已经严格按照教程所述的方法转格式,甚至在网上找了很多相关edusoho帖子都没有找到解决办法。其实这归根到底就是,一般情况下我们上传的视频文件是保存在edusoho程序的\app\data\udisk文件下的,我们在前台播放的视频是访问自己本台服务器的,例如你买的服务器带宽是4M,片源是存放到自己服务器的话,那就需要很大的带宽了,因为客户端在播放的时候,需要从服务器上缓存影片到本地如果同时有多个人在线观看,那带宽一定要足够大,才能保证不卡。带宽至少在10M以上。带宽和下载速度的关系是1M带宽=128K/S的现在速度。但是10M带宽的服务器成本太高了,很少人会选购。
演示地址http://vod.shop1a.cn/
为了解决edusoho视频播放慢的问题又要控制成本的有效方案就是,自己二次开发视频接口,对接到阿里云、七牛、腾讯云等国内大型服务商的视频加速服务器上。
使用 账号AccessKey 初始化
/**
* 技术支持QQ2446503032
* 演示地址http://vod.shop1a.cn/
*/
require_once './aliyun-php-sdk/aliyun-php-sdk-core/Config.php'; // 假定您的源码文件和aliyun-php-sdk处于同一目录
use vod\Request\V20170321 as vod;
function initVodClient($accessKeyId, $accessKeySecret) {
$regionId = 'cn-shanghai'; // 点播服务接入区域
$profile = DefaultProfile::getProfile($regionId, $accessKeyId, $accessKeySecret);
return new DefaultAcsClient($profile);
}
获取视频上传地址和凭证
/**
* 获取视频上传地址和凭证
* 技术支持QQ2446503032
* 演示地址http://vod.shop1a.cn/
* @param client 发送请求客户端
* @return CreateUploadVideoResponse 获取视频上传地址和凭证响应数据
*/
function createUploadVideo($client) {
$request = new vod\CreateUploadVideoRequest();
$request->setTitle("Sample Title");
$request->setFileName("videoFile.mov");
$request->setDescription("Video Description");
$request->setCoverURL("http://img.alicdn.com/tps/TB1qnJ1PVXXXXXCXXXXXXXXXXXX-700-700.png");
$request->setTags("tag1,tag2");
$request->setAcceptFormat('JSON');
return $client->getAcsResponse($request);
}
try {
$client = initVodClient('<AccessKeyId>', '<AccessKeySecret>');
$uploadInfo = createUploadVideo($client);
var_dump($uploadInfo);
} catch (Exception $e) {
print $e->getMessage()."\n";
}
刷新视频上传凭证
/**
*技术支持QQ2446503032
*演示地址http://vod.shop1a.cn/
* 刷新视频上传凭证
* @param client 发送请求客户端
* @return RefreshUploadVideoResponse 刷新视频上传凭证响应数据
*/
function refreshUploadVideo($client, $videoId) {
$request = new vod\RefreshUploadVideoRequest();
$request->setVideoId($videoId);
$request->setAcceptFormat('JSON');
return $client->getAcsResponse($request);
}
try {
$client = initVodClient('<AccessKeyId>', '<AccessKeySecret>');
$refreshInfo = refreshUploadVideo($client, 'videoId');
var_dump($refreshInfo);
} catch (Exception $e) {
print $e->getMessage()."\n";
}
修改import-video.html.twig文件
阿里云视频点播(VoD)是集音视频上传、自动化转码处理、媒体资源管理、分发加速于一体的全链路音视频点播服务。借助灵活、可伸缩的存储、处理及内容分发服务,帮助企业和开发者快速搭建安全、弹性、高可定制的点播平台和应用,提供端到端的完整解决方案。
配置阿里云的accesskeyid和access_key_secret
通过二次开发,后台上传视频课程的接口变成了 “导入阿里云视频”,
通过自己的阿里云账号可以清晰看到我们刚才在edusoho后台上传的视频的保存记录
可以看到电脑端的视频打开自动加载的速度超快,完全实习了流畅播放的效果
我们再来看看手机端的播放效果如何,一打开就直接加载播放,几乎没有等待的时间
<?php
/**技术支持QQ2446503032
*演示地址http://vod.shop1a.cn/
*/
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'voduploadsdk' . DIRECTORY_SEPARATOR . 'Autoloader.php';
date_default_timezone_set('PRC');
// 测试上传本地视频
function testUploadLocalVideo($accessKeyId, $accessKeySecret, $filePath)
{
try {
$uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
$uploadVideoRequest = new UploadVideoRequest($filePath, 'testUploadLocalVideo via PHP-SDK');
//$uploadVideoRequest->setCateId(1);
//$uploadVideoRequest->setCoverURL("http://xxxx.jpg");
//$uploadVideoRequest->setTags('test1,test2');
//$uploadVideoRequest->setStorageLocation('outin-xx.oss-cn-beijing.aliyuncs.com');
//$uploadVideoRequest->setTemplateGroupId('6ae347b0140181ad371d197ebe289326');
$userData = array(
"MessageCallback"=>array("CallbackURL"=>"https://demo.sample.com/ProcessMessageCallback"),
"Extend"=>array("localId"=>"xxx", "test"=>"www")
);
$uploadVideoRequest->setUserData(json_encode($userData));
$res = $uploader->uploadLocalVideo($uploadVideoRequest);
print_r($res);
} catch (Exception $e) {
printf("testUploadLocalVideo Failed, ErrorMessage: %s\n Location: %s %s\n Trace: %s\n",
$e->getMessage(), $e->getFile(), $e->getLine(), $e->getTraceAsString());
}
}
// 测试上传网络视频
function testUploadWebVideo($accessKeyId, $accessKeySecret, $fileURL)
{
try {
$uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
$uploadVideoRequest = new UploadVideoRequest($fileURL, 'testUploadWebVideo via PHP-SDK');
$res = $uploader->uploadWebVideo($uploadVideoRequest);
print_r($res);
} catch (Exception $e) {
printf("testUploadWebVideo Failed, ErrorMessage: %s\n Location: %s %s\n Trace: %s\n",
$e->getMessage(), $e->getFile(), $e->getLine(), $e->getTraceAsString());
}
}
// 测试上传本地m3u8视频
function testUploadLocalM3u8($accessKeyId, $accessKeySecret, $m3u8FilePath)
{
try {
$uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
$uploadVideoRequest = new UploadVideoRequest($m3u8FilePath, 'testUploadLocalM3u8 via PHP-SDK');
// 调用接口解析m3u8的分片地址列表,如果解析结果不准确,请自行拼接地址列表(默认分片文件和m3u8文件位于同一目录)
$sliceFiles = $uploader->parseM3u8File($m3u8FilePath);
//print_r($sliceFiles);
$res = $uploader->uploadLocalM3u8($uploadVideoRequest, $sliceFiles);
print_r($res);
} catch (Exception $e) {
printf("testUploadLocalM3u8 Failed, ErrorMessage: %s\n Location: %s %s\n Trace: %s\n",
$e->getMessage(), $e->getFile(), $e->getLine(), $e->getTraceAsString());
}
}
// 测试上传网络m3u8视频
function testUploadWebM3u8($accessKeyId, $accessKeySecret, $m3u8FileUrl)
{
try {
$uploader = new AliyunVodUploader($accessKeyId, $accessKeySecret);
$uploadVideoRequest = new UploadVideoRequest($m3u8FileUrl, 'testUploadWebM3u8 via PHP-SDK');
// 调用接口解析m3u8的分片地址列表,如果解析结果不准确,请自行拼接地址列表(默认分片文件和m3u8文件位于同一目录)
$sliceFileUrls = $uploader->parseM3u8File($m3u8FileUrl);
//print_r($sliceFileUrls);
$res = $uploader->uploadWebM3u8($uploadVideoRequest, $sliceFileUrls);
print_r($res);
} catch (Exception $e) {
printf("testUploadWebM3u8 Failed, ErrorMessage: %s\n Location: %s %s\n Trace: %s\n",
$e->getMessage(), $e->getFile(), $e->getLine(), $e->getTraceAsString());
}
}
#### 执行测试代码 ####
$accessKeyId = '<AccessKeyId>';
$accessKeySecret = '<AccessKeySecret>';
//$localFilePath = 'C:\test\sample.mp4';
$localFilePath = '/opt/video/sample.mp4';
//testUploadLocalVideo($accessKeyId, $accessKeySecret, $localFilePath);
$webFileURL = 'http://vod-test1.cn-shanghai.aliyuncs.com/b55b904bc612463b812990b7c8cc95c8/daa30814c0c340cf8199926f78aa5c0e-a0bc05ba62c3e95cc672e88b828148c9-ld.mp4?auth_key=1608774986-0-0-c56acd302bea0c331370d8ed686502fe';
testUploadWebVideo($accessKeyId, $accessKeySecret, $webFileURL);
$localM3u8FilePath = '/opt/video/m3u8/sample.m3u8';
//testUploadLocalM3u8($accessKeyId, $accessKeySecret, $localM3u8FilePath);
$webM3u8FileURL = 'http://vod-test1.cn-shanghai.aliyuncs.com/b55b904bc612463b812990b7c8cc95c8/daa30814c0c340cf8199926f78aa5c0e-195a25af366b5edae324c47e99a03f04-ld.m3u8?auth_key=1608775606-0-0-9fb038deaecd009dadd86721c5855629';
//testUploadWebM3u8($accessKeyId, $accessKeySecret, $webM3u8FileURL);
常见问题
如何实现内网上传?
在点播控制台 存储管理 查看 媒资存储区域,将上传脚本部署在对应区域的ECS上,然后在初始化AliyunVodUploader类实例后,调用setEcsRegionId接口设置对应区域,如:cn-shanghai等。
如何获知上传进度?
AliyunVodUploader类的uploadProgressCallback接口接收上传进度回调,可获取上传的媒体ID(视频ID)、已上传大小、总大小等信息,可重写此函数实现自己的上传进度回调。
如何关闭日志打印?
AliyunVodUtils.php文件的AliyunVodLog类,$logSwitch为日志打印开关,更改为false即可关闭日志打印。
上传是同步还是异步?
本SDK上传时都为同步,会阻塞相应进程或线程,如要实现异步,建议使用单独线程上传。
支持断点续传吗?
暂时不支持断点续传,重新上传时会创建新的视频(或图片等);后续版本会支持,时间待定。
支持Windows下执行吗?
本SDK支持Linux/Unix/Mac/Windows等多种平台,但都需要安装PHP及相应扩展(如php-mbstring等)。
遇到连接不上怎么处理?
请先确认连接外网是否有问题,可 ping vod.cn-shanghai.aliyuncs.com 看看是否能连接阿里云点播服务器,如连接有问题可确认您的网络配置,如是否允许连接外网。其次,确认是否开启了SSL,如果使用了HTTPS请求,可能相应扩展(如php_openssl)没有正确安装,或配置有问题。