全部产品
阿里云办公

基于OSS原生SDK上传视频到点播

更新时间:2018-12-11 11:41:03

场景

视频点播提供了丰富的 上传方式,包括 客户端上传服务端上传 等,但可能缺乏需要的语言版本(如C/C++、Go等),此时,可以直接基于OSS原生SDK进行上传。

前提

在阅读本文前,请先确定确实没有您所需要语言版本的上传SDK,点播服务已提供:

也可以直接访问 SDK下载页面 下载SDK和Demo;如确实没有您需要的版本,可以继续阅读本文再行开发。

准备工作

  • 确认已开通点播服务并完成了相关配置。
  • 确认已准备了阿里云账号AK,并授予了上传权限。

上传步骤

上传流程.png

1. 访问点播服务获取上传地址和上传凭证

这一步还会创建视频媒资记录,返回视频ID,请妥善保存,后续可根据视频ID进行视频播放、管理和AI处理等。

2. 解析上传地址(UploadAddress) 和 上传凭证(UploadAuth),得到OSS的上传地址和授权信息。解析方式参考 上传地址和凭证的解析

3. 调用OSS SDK将视频文件上传至指定的bucket中,注意使用STS Auth方式,且使用解析后的上传地址和授权信息进行初始化,不要使用自己的AccessKey等信息。

代码实现

PHP上传示例

环境准备

  • PHP 5.3+,可通过php -v命令查看当前的PHP版本。
  • cURL 扩展,可通过php -m命令查看curl扩展是否已经安装好。

安装

  1. 在您的PHP项目中添加空文件夹 aliyun-php-sdk

  2. aliyun-openapi-php-sdk 下载整个源码,解压后拷贝 aliyun-php-sdk-corealiyun-php-sdk-vod 两个文件夹到 aliyun-php-sdk 目录下。

  3. aliyun-oss-php-sdk 下载最新的OSS PHP SDK的源码,解压ZIP文件后添加文件夹到 aliyun-php-sdk 目录下。以下载 v.2.2.4 Source code (zip) 为例,解压后文件夹为 aliyun-oss-php-sdk-2.2.4

  4. 打开 aliyun-php-sdk/aliyun-php-sdk-core/Config.php 文件,找到“//config sdk auto load path.”,在这行下面添加:

    1. Autoloader::addAutoloadPath("aliyun-php-sdk-vod");
  5. 在代码中引用VOD和OSS的文件:

  1. require_once './aliyun-php-sdk/aliyun-php-sdk-core/Config.php'; // 假定您的源码文件和aliyun-php-sdk处于同一目录。
  2. require_once './aliyun-php-sdk/aliyun-oss-php-sdk-2.2.4/autoload.php';
  3. use vod\Request\V20170321 as vod;
  4. use OSS\OssClient;
  5. use OSS\Core\OssException;

更多信息可参考VOD PHP SDK安装OSS PHP SDK安装

参考代码

  • 定义核心步骤的函数:

1. 使用AK初始化VOD客户端

  1. function init_vod_client($accessKeyId, $accessKeySecret) {
  2. $regionId = 'cn-shanghai'; // 点播服务所在的Region,国内请填cn-shanghai,不要填写别的区域
  3. $profile = DefaultProfile::getProfile($regionId, $accessKeyId, $accessKeySecret);
  4. return new DefaultAcsClient($profile);
  5. }

2. 获取视频上传地址和凭证

  1. function create_upload_video($vodClient) {
  2. $request = new vod\CreateUploadVideoRequest();
  3. $request->setTitle("视频标题"); // 视频标题(必填参数)
  4. $request->setFileName("文件名称.mov"); // 视频源文件名称,必须包含扩展名(必填参数)
  5. $request->setDescription("视频描述"); // 视频源文件描述(可选)
  6. $request->setCoverURL("http://img.alicdn.com/tps/TB1qnJ1PVXXXXXCXXXXXXXXXXXX-700-700.png"); // 自定义视频封面(可选)
  7. $request->setTags("标签1,标签2"); // 视频标签,多个用逗号分隔(可选)
  8. return $vodClient->getAcsResponse($request);
  9. }

3. 使用上传凭证和地址初始化OSS客户端(注意需要先Base64解码并Json Decode再传入)

  1. function init_oss_client($uploadAuth, $uploadAddress) {
  2. $ossClient = new OssClient($uploadAuth['AccessKeyId'], $uploadAuth['AccessKeySecret'], $uploadAddress['Endpoint'],
  3. false, $uploadAuth['SecurityToken']);
  4. $ossClient->setTimeout(86400*7); // 设置请求超时时间,单位秒,默认是5184000秒, 建议不要设置太小,如果上传文件很大,消耗的时间会比较长
  5. $ossClient->setConnectTimeout(10); // 设置连接超时时间,单位秒,默认是10秒
  6. return $ossClient;
  7. }

4. 上传本地文件

  1. function upload_local_file($ossClient, $uploadAddress, $localFile) {
  2. return $ossClient->uploadFile($uploadAddress['Bucket'], $uploadAddress['FileName'], $localFile);
  3. }

5. 刷新上传凭证

  1. function refresh_upload_video($vodClient, $videoId) {
  2. $request = new vod\RefreshUploadVideoRequest();
  3. $request->setVideoId($videoId);
  4. return $vodClient->getAcsResponse($request);
  5. }
  • 执行完整流程(注意捕获异常):
  1. $accessKeyId = '<AccessKeyId>'; // 您的AccessKeyId
  2. $accessKeySecret = '<AccessKeySecret>'; // 您的AccessKeySecret
  3. $localFile = '/Users/yours/Video/testVideo.flv'; // 需要上传到VOD的本地视频文件的完整路径
  4. try {
  5. // 初始化VOD客户端并获取上传地址和凭证
  6. $vodClient = init_vod_client($accessKeyId, $accessKeySecret);
  7. $createRes = create_upload_video($vodClient);
  8. // 执行成功会返回VideoId、UploadAddress和UploadAuth
  9. $videoId = $createRes->VideoId;
  10. $uploadAddress = json_decode(base64_decode($createRes->UploadAddress), true);
  11. $uploadAuth = json_decode(base64_decode($createRes->UploadAuth), true);
  12. // 使用UploadAuth和UploadAddress初始化OSS客户端
  13. $ossClient = init_oss_client($uploadAuth, $uploadAddress);
  14. // 上传文件,注意是同步上传会阻塞等待,耗时与文件大小和网络上行带宽有关
  15. //$result = upload_local_file($ossClient, $uploadAddress, $localFile);
  16. $result = multipart_upload_file($ossClient, $uploadAddress, $localFile);
  17. printf("Succeed, VideoId: %s", $videoId);
  18. } catch (Exception $e) {
  19. // var_dump($e);
  20. printf("Failed, ErrorMessage: %s", $e->getMessage());
  21. }

Demo下载

PHP上传Demo

可下载完整的 PHP版上传Demo源码,更多使用信息请参考 OSS-PHP-SDK上传文件

其它语言上传Demo

  • 客户端版、Java版、Python版等上传SDK及Demo下载,参考 上传SDK下载