其他分享
首页 > 其他分享> > 代码二次开发edusoho网校系统中CDN阿里云视频加速播放的解决方案

代码二次开发edusoho网校系统中CDN阿里云视频加速播放的解决方案

作者:互联网

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)是集音视频上传、自动化转码处理、媒体资源管理、分发加速于一体的全链路音视频点播服务。借助灵活、可伸缩的存储、处理及内容分发服务,帮助企业和开发者快速搭建安全、弹性、高可定制的点播平台和应用,提供端到端的完整解决方案。
配置阿里云的accesskeyidaccess_key_id和accessk​eyi​d和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)没有正确安装,或配置有问题。

???? ??? Frank 发布了4 篇原创文章 · 获赞 0 · 访问量 117 私信 关注

标签:vod,视频,edusoho,request,accessKeyId,网校,二次开发,上传,accessKeySecret
来源: https://blog.csdn.net/withapp/article/details/104412147