您现在的位置是:首页 >  编程分享 > PHP丨JAVA丨OTHERPHP丨JAVA丨OTHER

阿里云web直传oss和视频点播

袅袅牧童 推荐 原创 编程分享 2020-01-15

简介 这几天项目需要做了阿里云oss和视频点播,主要解析OSS模块的基本情况,WEB js直传方式,后台php类的整合,凑活着看吧。。。


准备工作:

废话少说,冲啊。 。。。 。


阿里云的oss和视频点播,我个人理解是视频点播是oss存储额外分开的业务。。。

我们到阿里云开通oss,建好bucket,在bucket开通视频点播 。 。。 ,如图:


图1

看图1,这里我们标记出来的,都是需要我们开通的。

我们主要看安全令牌,这是我们前端js 直传文件需要用到的,临时获取账号和密码,以及token令牌。

bucket配置:

正常我们bucket 设置推荐公共读,然后可以在防盗链设置白名单,这里博主主要是想说下,js直传,目前网上说大图无法传的问题,官方给的答案是做一个跨域配置,另外博主发现开通原图保护图片可能无法访问。。。不知道什么情况,反正后端服务器上传,没发生这情况。

如图2,图3


图2


图3

配置子账号信息和ram账号信息:

推荐大家在配置这层功能时使用子账号创建accesKey和acceKesecret 安全第一嘛。

然后在用户组,配置对应的权限信息,oss和sts对应的权限是需要分配下的,ram账户是开启安全令牌时阿里云创建的,不用手动。。。。,如图4,图5


图4


图5

图5里,就是我们查看ram账户的信息,我们需要的是权限和ARN信息,这是我们前端直传接口需要传递的信息。。。

需要的SDK:

不用多说,这玩意指定的都是套阿里云的SDK,去文档那里找到sts对应的sdk,我们需要保留的有三个文件夹,如图6


图6

剩下的准备工作就完成了,接下来,看需求是后台传还是web直传,下载对应的demo和sdk仿这demo做就好 。。 。

这里介绍web直传。

WEB js直传文件:

oss上传图片:

看代码吧

$("IdfileUpload").change(function(){ 
var createUrl = '/testb/stsInfo'; //后台获取sts令牌的接口,这里后台是php的。后边有代码
var file = this.files[0];
var filename = this.files[0].name;
$.get(createUrl, function (data) {
if(data.code==200){
var client = new OSS.Wrapper({
region: 'oss-cn-beijing', //默认基点
accessKeyId: data.data.AccessKeyId, //令牌返回的key和secert
accessKeySecret: data.data.AccessKeySecret,
stsToken:data.data.SecurityToken, //加密token
Expiration:data.data.Expiration,
bucket: 'bucket_name',
});
client.multipartUpload(filename, file).then(function (result) { //成功验证,上传图片 。 。。
console.log(result);
}).catch(function (err) {
console.log(err);
});
} else {
console.log(data.msg);
return false;
}
}, 'json')
});

上传视频点播:

这里截取demo种auth上传方式的一部分代码解析,看代码:

$(document).ready(function () {
/**
* 创建一个上传对象
* 使用 UploadAuth 上传方式
*/
function createUploader () {
var uploader = new AliyunUpload.Vod({
timeout:60000,
partSize:1048576,
parallel: 5,
retryCount: 3,
retryDuration: 2,
region:"cn-shanghai",
userId: 账号id,
// 添加文件成功
addFileSuccess: function (uploadInfo) {
$('IdauthUpload').attr('disabled', false)
// $('IdresumeUpload').attr('disabled', false)
$('Idstatus').text('添加文件成功, 等待上传...')
console.log("addFileSuccess: " + uploadInfo.file.name)
},
// 开始上传
onUploadstarted: function (uploadInfo) {
// 如果是 UploadAuth 上传方式, 需要调用 uploader.setUploadAuthAndAddress 方法
// 如果是 UploadAuth 上传方式, 需要根据 uploadInfo.videoId是否有值,调用点播的不同接口获取uploadauth和uploadAddress
// 如果 uploadInfo.videoId 有值,调用刷新视频上传凭证接口,否则调用创建视频上传凭证接口
// 注意: 这里是测试 demo 所以直接调用了获取 UploadAuth 的测试接口, 用户在使用时需要判断 uploadInfo.videoId 存在与否从而调用 openApi
// 如果 uploadInfo.videoId 存在, 调用 刷新视频上传凭证接口(https://help.aliyun.com/document_detail/55408.html)
// 如果 uploadInfo.videoId 不存在,调用 获取视频上传地址和凭证接口(https://help.aliyun.com/document_detail/55407.html)
if (!uploadInfo.videoId) {
var createUrl = '/testb/CreateUploadVideo?filename='+uploadInfo.file.name; //这是php后台创建获取路径的接口
$.get(createUrl, function (data) {
var uploadAuth = data.UploadAuth
var uploadAddress = data.UploadAddress
var videoId = data.VideoId
uploader.setUploadAuthAndAddress(uploadInfo, uploadAuth, uploadAddress,videoId)
}, 'json')
$('Idstatus').text('文件开始上传...')
console.log("onUploadStarted:" + uploadInfo.file.name + ", endpoint:" + uploadInfo.endpoint + ", bucket:" + uploadInfo.bucket + ", object:" + uploadInfo.object)
} else {
// 如果videoId有值,根据videoId刷新上传凭证
// https://help.aliyun.com/document_detail/55408.html?spm=a2c4g.11186623.6.630.BoYYcY
var refreshUrl = '/testb/RefreshUploadVideo?videoId=' + uploadInfo.videoId //后台刷新接口。
$.get(refreshUrl, function (data) {
var uploadAuth = data.UploadAuth
var uploadAddress = data.UploadAddress
var videoId = data.VideoId
uploader.setUploadAuthAndAddress(uploadInfo, uploadAuth, uploadAddress,videoId)
}, 'json')
}
},
// 文件上传成功
onUploadSucceed: function (uploadInfo) {
var myInterval = setInterval(function(){
var videoUrl = '/testb/info?videoId='+ uploadInfo.videoId; //上传成功,这里是获取视频信息接口,这里要说的是后台有开启标清转码,2M的avi转成mp4,大概等待6秒左右才能演示 。。。 。
$.get(videoUrl, function (data) {
if(data.code==200 && data.status=="Normal"){ //视频的状态,Normal表示可以正常点播。。。
$('IdvideoCheck').html("<video src='"+data.src+"' controls>浏览器不支持video标签</video>");
clearInterval(myInterval);
}
}, 'json') }, 3000);
return false;
},

基本上上传前端代码就是这些,要注意的,具体要引入的js依赖,在demo里都有了。

后台类整合:

这里是后台整合的类代码,这玩意必须整合一下,不然你下次用能气疯。。。

看类整合代码,这里面是常用到的调用SDK的方法:

<?php
require_once __DIR__.'/aliyun-php-sdk-core/Config.php'; // 假定您的源码文件和aliyun-php-sdk处于同一目录
use vod\Request\V20170321 as vod;
use Sts\Request\V20150401 as Sts;

class AliyunVideo {
private $accessKeyId = '你的keyId';
private $accessKeySecret = '你的keysecret';
private $regionId = 'cn-shanghai'; // 点播服务所在的Region,国内请填cn-shanghai,国内指定不要填写别的区域
private $endpoint = 'sts.cn-shanghai.aliyuncs.com'; //点播地址,默认不必修改
private $client = null ;
private $sts = null ;

public function __construct(){
try {
$this -> init_vod_client($this -> accessKeyId,$this -> accessKeySecret);
} catch (Exception $e) {
print $e->getMessage();
}
}




/**
* @desc 初始化客户端
* @param [type] $accessKeyId [description]
* @param [type] $accessKeySecret [description]
* @return [type] [description]
*/
public function init_vod_client($accessKeyId, $accessKeySecret) {
//初始化视频客户端
$profile = DefaultProfile::getProfile($this -> regionId, $accessKeyId, $accessKeySecret);
$this -> client = new DefaultAcsClient($profile);
//初始化sts授权策略客户端
DefaultProfile::addEndpoint($this -> regionId, $this -> regionId, "Sts", $this -> endpoint);
$iClientProfile = DefaultProfile::getProfile($this -> regionId, $accessKeyId, $accessKeySecret);
$this -> sts = new DefaultAcsClient($iClientProfile);

}


/**
* @desc 刷新视频上传凭证
* @param [type] $client [description]
* @param [type] $videoId [description]
* @return [type] [description]
*/
function refresh_upload_video( $videoId) {
$request = new vod\RefreshUploadVideoRequest();
$request->setVideoId($videoId);
$request->setAcceptFormat('JSON');
return $this -> client ->getAcsResponse($request);
}



/**
* @desc [获取上传地址和凭证]
* @param [type] $client [description]
* @param array $fileInfo = array();
* @return [type] [description] * 这里的参数你可以整合上传 */
public function create_upload_video($fileInfo) {
$request = new vod\CreateUploadVideoRequest();
$request->setTitle($fileInfo['title']); // 视频标题(必填参数)
$request->setFileName($fileInfo['filename']); // 视频源文件名称,必须包含扩展名(必填参数)
$request->setDescription($fileInfo['desc']); // 视频源文件描述(可选)
//$request->setCoverURL("http://img.alicdn.com/tps/TB1qnJ1PVXXXXXCXXXXXXXXXXXX-700-700.png"); // 自定义视频封面(可选)
if($fileInfo['thumb']){ $request -> setCoverURL($fileInfo['thumb']) ; }
if($fileInfo['catid']){ $request -> setCateId($fileInfo['catid']) ; }
if($fileInfo['tags']){ $request -> setTags($fileInfo['tags']);}
$request->setAcceptFormat('JSON');

return $this -> client -> getAcsResponse($request);
}


/**
* @desc 获取播放地址接口
* @param [type] $client [为上面init_vod_client接口返回的客户端对象]
* @param [type] $videoId [为视频ID]
* @return [type] [description]
*/
public function get_play_info( $videoId) {
$request = new vod\GetPlayInfoRequest();
$request->setVideoId($videoId);
$request->setAcceptFormat('JSON');
return $this -> client ->getAcsResponse($request);
}

/**
* @desc 获取sts授权策略信息
* @version 1.0
*/
public function getStsInfo(){
$roleArn = "acs:ram::*****:role/aliyunosstokengeneratorrole"; //角色资源描述符,在RAM的控制台的资源详情页上可以获取
// 此授权策略表示读取所有OSS的权限,无删除权限;
$policy=<<<POLICY
{
"Statement": [
{
"Action": [
"oss:Get*",
"oss:List*",
"oss:Put*"
],
"Effect": "Allow",
"Resource": "*"
}
],
"Version": "1"
}
POLICY;

$request = new Sts\AssumeRoleRequest();
// RoleSessionName即临时身份的会话名称,用于区分不同的临时身份
$request->setRoleSessionName("client_name_".time());
$request->setRoleArn($roleArn);
$request->setPolicy($policy);
$request->setDurationSeconds(3600);

try {
$response = $this -> sts ->getAcsResponse($request);
return array('code'=>200,'data'=>$response->Credentials);
} catch(ServerException $e) {
return array('code'=>400,'msg'=>$e->getMessage());
// print "Error: " . $e->getErrorCode() . " Message: " . $e->getMessage() . "\n";
} catch(ClientException $e) {
return array('code'=>400,'msg'=>$e->getMessage());
// print "Error: " . $e->getErrorCode() . " Message: " . $e->getMessage() . "\n";
}
}

/**
* @desc 删除媒体流
* 可删除视频流或音频流信息及存储文件,并支持批量删除;删除后当CDN缓存过期,该路流会无法播放,请谨慎操作
* @param [type] $client [description]
* @param [type] $videoId [description]
* @param [type] $jobIds [description]
* @return [type] [description]
*/
function delete_stream( $videoId, $jobIds) {
$request = new vod\DeleteStreamRequest();
$request->setVideoId($videoId);
$request->setJobIds($jobIds); // 媒体流转码的作业ID列表,多个用逗号分隔;JobId可通过获取播放地址接口(GetPlayInfo)获取到。
$request->setAcceptFormat('JSON');
return $this -> client ->getAcsResponse($request);
}


/**
* @desc 获取视频列表
* @param [type] $client [description]
* @return [type] [description]
*/
function get_video_list() {
$request = new vod\GetVideoListRequest();
// 示例:分别取一个月前、当前时间的UTC时间作为筛选视频列表的起止时间
$localTimeZone = date_default_timezone_get();
date_default_timezone_set('UTC');
$utcNow = gmdate('Y-m-d\TH:i:s\Z');
$utcMonthAgo = gmdate('Y-m-d\TH:i:s\Z', time() - 30*86400);
date_default_timezone_set($localTimeZone);
$request->setStartTime($utcMonthAgo); // 视频创建的起始时间,为UTC格式
$request->setEndTime($utcNow); // 视频创建的结束时间,为UTC格式
Id$request->setStatus('Uploading,Normal,Transcoding'); // 视频状态,默认获取所有状态的视频,多个用逗号分隔
Id$request->setCateId(0); // 按分类进行筛选
$request->setPageNo(1);
$request->setPageSize(20);
$request->setAcceptFormat('JSON');
return $this -> client ->getAcsResponse($request);
}


/**
* @desc 获取源文件信息(含原片下载地址)
* @param [type] $client [description]
* @param [type] $videoId [description]
* @return [type] [description]
*/
function get_mezzanine_info( $videoId) {
$request = new vod\GetMezzanineInfoRequest();
$request->setVideoId($videoId);
$request->setAuthTimeout(3600*5); // 原片下载地址过期时间,单位:秒,默认为3600秒
$request->setAcceptFormat('JSON');
return $this -> client ->getAcsResponse($request);
}
/**
* @desc 删除视频
* @param [type] $client [description]
* @param [type] $videoIds [description]
* @return [type] [description]
*/
function delete_videos( $videoIds) {
$request = new vod\DeleteVideoRequest();
$request->setVideoIds($videoIds); // 支持批量删除视频;videoIds为传入的视频ID列表,多个用逗号分隔
$request->setAcceptFormat('JSON');
return $this -> client ->getAcsResponse($request);
}
/**
* @desc 修改视频信息
* @param [type] $client [description]
* @param [type] $videoId [description]
* @return [type] [description]
*/
function update_video_info( $videoId) {
$request = new vod\UpdateVideoInfoRequest();
$request->setVideoId($videoId);
$request->setTitle('New Title'); // 更改视频标题
$request->setDescription('New Description'); // 更改视频描述
$request->setCoverURL('http://img.alicdn.com/tps/TB1qnJ1PVXXXXXCXXXXXXXXXXXX-700-700.png'); // 更改视频封面
$request->setTags('tag1,tag2'); // 更改视频标签,多个用逗号分隔
$request->setCateId(0); // 更改视频分类(可在点播控制台·全局设置·分类管理里查看分类ID:https://vod.console.aliyun.com/Id/vod/settings/category)
$request->setAcceptFormat('JSON');
return $this -> client ->getAcsResponse($request);
}
/**
* @desc 获取视频信息
* @param [type] $client [description]
* @param [type] $videoId [description]
* @return [type] [description]
*/
function get_video_info( $videoId) {
$request = new vod\GetVideoInfoRequest();
$request->setVideoId($videoId);
$request->setAcceptFormat('JSON');
return $this -> client ->getAcsResponse($request);
}
/**
* @desc 获取指定的分类信息,及其子分类(即下一级分类)的列表
* @param [type] $client [description]
* @param integer $cateId [description]
* @param integer $pageNo [description]
* @param integer $pageSize [description]
* @return [type] [description]
*/
function get_categories( $cateId=-1, $pageNo=1, $pageSize=10) {
$request = new vod\GetCategoriesRequest();
$request->setCateId($cateId); // 分类ID,默认为根节点分类ID即-1
$request->setPageNo($pageNo);
$request->setPageSize($pageSize);
$request->setAcceptFormat('JSON');
return $this -> client ->getAcsResponse($request);
}


/**
* @desc 删除分类
* 删除视频分类,同时会删除其下级分类(包括二级分类和三级分类),请慎重操作
* @param [type] $client [description]
* @param [type] $cateId [description]
* @return [type] [description]
*/
function delete_category( $cateId) {
$request = new vod\DeleteCategoryRequest();
$request->setCateId($cateId);
$request->setAcceptFormat('JSON');
return $this -> client ->getAcsResponse($request);
}
/**
* @desc 修改分类
* @param [type] $client [description]
* @param [type] $cateId [description]
* @param [type] $cateName [description]
* @return [type] [description]
*/
function update_category( $cateId, $cateName) {
$request = new vod\UpdateCategoryRequest();
$request->setCateId($cateId);
$request->setCateName($cateName); // 分类名称,不能超过64个字节,UTF8编码
$request->setAcceptFormat('JSON');
return $this -> client ->getAcsResponse($request);
}
/**
* @desc 创建分类
* 1.创建视频分类,最大支持三级分类,每个分类最多支持创建100个子分类
* 2.一级分类最大也是支持100个,若有更大需求请提工单联系我们
* @param [type] $client [description]
* @param [type] $cateName [description]
* @param integer $parentId [description]
*/
function add_category( $cateName, $parentId=-1) {
$request = new vod\AddCategoryRequest();
$request->setCateName($cateName); // 分类名称,不能超过64个字节,UTF8编码
$request->setParentId($parentId); // 父分类ID,若不填,则默认生成一级分类,根节点分类ID为-1
$request->setAcceptFormat('JSON');
return $this -> client ->getAcsResponse($request);
}

/**
* @desc 获取图片上传地址和凭证
* @param [type] $client [description]
* @param [type] $imageType [description]
* @param [type] $imageExt [description]
* @return [type] [description]
*/
function create_upload_image( $imageType, $imageExt) {
$request = new vod\CreateUploadImageRequest();
$request->setImageType($imageType);
$request->setImageExt($imageExt);
$request->setAcceptFormat('JSON');
return $this -> client ->getAcsResponse($request);
}
}

有了这个类,你放心引用就OK了,注意类中Keyid、KeySecret 和 ARN地址,改成自己的就好;

看调用类:

没啥说的,看代码参考下吧:

<?php

/**
* Class js直传阿里云视频点播;
* @author mutong
* @date 2019/01/13
*/
yii::import('application.extensions.aliVideo.aliyunVideo', true);

class TestbController extends Controller
{
public function init()
{
parent::init(); }

/**
* 获取视频
* @params videoId
*/
public function actionInfo()
{

$videoId = $_GET['videoId'] ? $_GET['videoId']: '';
// 获取视频src
$videoObj = new AliyunVideo(); //实例化阿里云对象
if($videoId){
$ret = $videoObj -> get_play_info($videoId);
echo json_encode(array('code'=>200,'status'=>$ret->PlayInfoList->PlayInfo[0]->Status ,'src'=>$ret->PlayInfoList->PlayInfo[0]->PlayURL));
exit;
} else {
echo json_encode(array('code'=>400,'msg'=>'视频不存在'));
exit;
}
}


/**
* 获取上传凭证上传视频
* @param filename title
*/
public function actionCreateUploadVideo() {
$fileInfo['title']='addNewVideo'; // 视频标题(必填参数)
$fileInfo['filename']=$_GET['filename']; // 视频源文件名称,必须包含扩展名(必填参数)
// $fileInfo['desc'] = 'sdfsdfsdfsd'; // 视频源文件描述(可选)
//$request->setCoverURL("http://img.alicdn.com/tps/TB1qnJ1PVXXXXXCXXXXXXXXXXXX-700-700.png"); // 自定义视频封面(可选)
// $fileInfo['thumb'];//封面图
// if($fileInfo['tags']){$request -> setTags($fileInfo['tags']);
$videoObj = new AliyunVideo(); //实例化阿里云对象
$ret= $videoObj -> create_upload_video($fileInfo);
echo json_encode($ret);
exit;
}

/**
* 刷新上传凭证
* @param videoId
*/
public function actionRefreshUploadVideo()
{
$videoId = $_GET['videoId'];
$videoObj = new AliyunVideo(); //实例化阿里云对象
$ret= $videoObj -> refresh_upload_video($videoId);
echo json_encode($ret);
exit;
}

/**
* 上传图片到oss
* js web直传配置 ,以下
*
*/

public function actionStsInfo()
{
$videoObj = new AliyunVideo(); //实例化阿里云对象
$ret = $videoObj->getStsInfo(); //获取临时令牌
echo json_encode($ret);
exit;
}
}

完毕!!!


Tags:


本篇评论 —— 揽流光,涤眉霜,清露烈酒一口话苍茫。


    声明:参照站内规则,不文明言论将会删除,谢谢合作。


      最新评论



ABOUT ME

Name:袅袅牧童 | Arkin

Job:Web全栈技术工程师

WeChat:nnmutong

Email:nnmutong@icloud.com

标签云