场景
视频点播提供了丰富的 上传方式包括客户端上传、服务端上传等,但可能缺乏需要的语言版本(如 Go 等),此时可以直接基于 OSS 原生 SDK 进行上传。
前提
在阅读本文前,请先确定确实没有您所需要语言版本的上传 SDK,点播服务已提供:
- 客户端上传 SDK:
- 服务端上传 SDK:
说明 也可以直接访问 SDK 下载页面 下载 SDK 和 Demo,如确实没有您需要的版本,可以继续阅读本文再行开发。
准备工作
- 确认已开通点播服务并完成了相关配置。
- 确认已准备了 阿里云账号 AccessKey,并授予了上传权限。
上传步骤
- 访问点播服务获取请参见上传地址和上传凭证。
说明 这一步还会创建视频媒资记录,返回视频 ID,请妥善保存,后续可根据视频 ID 进行视频播放、管理和 AI 处理等。 - 解析上传地址(UploadAddress) 和 上传凭证(UploadAuth),得到 OSS 的上传地址和授权信息。解析方式请参见上传地址和凭证的解析。
- 调用 OSS SDK 将视频文件上传至指定的 bucket 中,注意使用 STS Auth 方式,且使用解析后的上传地址和授权信息进行初始化,不要使用自己的 AccessKey 等信息。
代码实现
- 核心代码实现共分 4 步:
- 使用 AK 初始化 VOD 客户端。
- 获取视频上传地址和凭证。
- 使用上传凭证和地址初始化 OSS 客户端。
- 上传本地文件。
- 可以使用点播服务的接口 SDK,获取上传地址和凭证
- 使用 OSS SDK 在服务端上传,可参考如下版本:
- OSS-.NET-SDK。
- OSS-C-SDK。
- OSS-Go-SDK。
- OSS-Ruby-SDK。
- OSS-Java-SDK。
PHP 上传示例
环境准备
- PHP 5.3+,可通过 php -v 命令查看当前的 PHP 版本。
- cURL 扩展,可通过 php -m 命令查看 curl 扩展是否已经安装好。
安装
- 在您的 PHP 项目中添加空文件夹 aliyun-php-sdk 。
- 从 aliyun-openapi-php-sdk 下载整个源码,解压后拷贝 aliyun-php-sdk-core 和 aliyun-php-sdk-vod 两个文件夹到 aliyun-php-sdk 目录下。
- 从 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。
- 打开 aliyun-php-sdk/aliyun-php-sdk-core/Config.php 文件,找到 "//config sdk auto load path." 在这行下面添加:
Autoloader::addAutoloadPath("aliyun-php-sdk-vod");
- 在代码中引用 VOD 和 OSS 的文件。示例如下:
require_once './aliyun-php-sdk/aliyun-php-sdk-core/Config.php'; // 假定您的源码文件和aliyun-php-sdk处于同一目录。 require_once './aliyun-php-sdk/aliyun-oss-php-sdk-2.2.4/autoload.php'; use vod\Request\V20170321 as vod; use OSS\OssClient; use OSS\Core\OssException;
说明 更多信息可参考 VOD PHP SDK 安装 和 OSS PHP SDK 安装。
参考代码
- 定义核心步骤的函数:
- 使用 AK 初始化 VOD 客户端。示例如下:
function init_vod_client($accessKeyId, $accessKeySecret) { $regionId = 'cn-shanghai'; // 根据点播接入服务所在的Region填写,例如:接入服务在上海,则填cn-shanghai $profile = DefaultProfile::getProfile($regionId, $accessKeyId, $accessKeySecret); return new DefaultAcsClient($profile); }
- 获取视频上传地址和凭证。示例如下:
function create_upload_video($vodClient) { $request = new vod\CreateUploadVideoRequest(); $request->setTitle("视频标题"); // 视频标题(必填参数) $request->setFileName("文件名称.mov"); // 视频源文件名称,必须包含扩展名(必填参数) $request->setDescription("视频描述"); // 视频源文件描述(可选) $request->setCoverURL("http://img.alicdn.com/tps/TB1qnJ1PVXXXXXCXXXXXXXXXXXX-700-700.png"); // 自定义视频封面(可选) $request->setTags("标签1,标签2"); // 视频标签,多个用逗号分隔(可选) return $vodClient->getAcsResponse($request); }
- 使用上传凭证和地址初始化 OSS 客户端(注意需要先 Base64 解码并 Json Decode 再传入)。示例如下:
function init_oss_client($uploadAuth, $uploadAddress) { $ossClient = new OssClient($uploadAuth['AccessKeyId'], $uploadAuth['AccessKeySecret'], $uploadAddress['Endpoint'], false, $uploadAuth['SecurityToken']); $ossClient->setTimeout(86400*7); // 设置请求超时时间,单位秒,默认是5184000秒, 建议不要设置太小,如果上传文件很大,消耗的时间会比较长 $ossClient->setConnectTimeout(10); // 设置连接超时时间,单位秒,默认是10秒 return $ossClient; }
说明 如果由于 SSL 配置异常导致错误 (如出现 cURL error: SSL certificate problem), 可将 https 替换为 http 后再初始化 OssClient。
$uploadAddress['Endpoint'] = str_replace("https:", "http:", $uploadAddress['Endpoint']);
- 上传本地文件。示例如下:
function upload_local_file($ossClient, $uploadAddress, $localFile) { return $ossClient->uploadFile($uploadAddress['Bucket'], $uploadAddress['FileName'], $localFile); }
- 刷新上传凭证。示例如下:
function refresh_upload_video($vodClient, $videoId) { $request = new vod\RefreshUploadVideoRequest(); $request->setVideoId($videoId); return $vodClient->getAcsResponse($request); }
- 执行完整流程(注意捕获异常)。示例如下:
$accessKeyId = '<AccessKeyId>'; // 您的AccessKeyId $accessKeySecret = '<AccessKeySecret>'; // 您的AccessKeySecret $localFile = '/Users/yours/Video/testVideo.flv'; // 需要上传到VOD的本地视频文件的完整路径 try { // 初始化VOD客户端并获取上传地址和凭证 $vodClient = init_vod_client($accessKeyId, $accessKeySecret); $createRes = create_upload_video($vodClient); // 执行成功会返回VideoId、UploadAddress和UploadAuth $videoId = $createRes->VideoId; $uploadAddress = json_decode(base64_decode($createRes->UploadAddress), true); $uploadAuth = json_decode(base64_decode($createRes->UploadAuth), true); // 使用UploadAuth和UploadAddress初始化OSS客户端 $ossClient = init_oss_client($uploadAuth, $uploadAddress); // 上传文件,注意是同步上传会阻塞等待,耗时与文件大小和网络上行带宽有关 //$result = upload_local_file($ossClient, $uploadAddress, $localFile); $result = multipart_upload_file($ossClient, $uploadAddress, $localFile); printf("Succeed, VideoId: %s", $videoId); } catch (Exception $e) { // var_dump($e); printf("Failed, ErrorMessage: %s", $e->getMessage()); }
GO 上传示例
环境准备
支持 Go 1.7 及以上版本,可到 Go 官网 下载合适的版本安装。
安装
- 使用 go get 安装 SDK
go get -u github.com/aliyun/alibaba-cloud-sdk-go/sdk
- 说明
- 安装过程中,界面不会打印提示,请耐心等待。如发生超时,请再次执行命令。
- 当 GOPATH 对应的目录下出现了子目录 src/github.com/aliyun/alibaba-cloud-sdk-go/services/vod 即表示 SDK 安装成功。
- 使用 glide 安装 SDK
glide get github.com/aliyun/alibaba-cloud-sdk-go
- 定义核心步骤的函数:
- 使用 AK 初始化 VOD 客户端。示例如下:
func InitVodClient(accessKeyId string, accessKeySecret string) (client *vod.Client, err error) { // 点播服务接入区域 regionId := "cn-shanghai" // 创建授权对象 credential := &credentials.AccessKeyCredential{ accessKeyId, accessKeySecret, } // 自定义config config := sdk.NewConfig() config.AutoRetry = true // 失败是否自动重试 config.MaxRetryTime = 3 // 最大重试次数 config.Timeout = 3000000000 // 连接超时,单位:纳秒;默认为3秒 // 创建vodClient实例 return vod.NewClientWithOptions(regionId, config, credential) }
- 获取视频上传地址和凭证。示例如下:
func MyCreateUploadVideo(client *vod.Client) (response *vod.CreateUploadVideoResponse, err error) { request := vod.CreateCreateUploadVideoRequest() request.Title = "Sample Video Title" request.Description = "Sample Description" request.FileName = "/opt/video/sample/video_file.mp4" //request.CateId = "-1" request.CoverURL = "http://img.alicdn.com/tps/TB1qnJ1PVXXXXXCXXXXXXXXXXXX-700-700.png" request.Tags = "tag1,tag2" request.AcceptFormat = "JSON" return client.CreateUploadVideo(request) }
- 使用上传凭证和地址初始化 OSS 客户端(注意需要先 Base64 解码并 Json Decode 再传入)。示例如下:
func InitOssClient(uploadAuthDTO UploadAuthDTO, uploadAddressDTO UploadAddressDTO) (*oss.Client, error) { client, err := oss.New(uploadAddressDTO.Endpoint, uploadAuthDTO.AccessKeyId, uploadAuthDTO.AccessKeySecret, oss.SecurityToken(uploadAuthDTO.SecurityToken), oss.Timeout(86400*7, 86400*7)) return client, err }
- 上传本地文件。示例如下:
func UploadLocalFile(client *oss.Client, uploadAddressDTO UploadAddressDTO, localFile string) { // 获取存储空间。 bucket, err := client.Bucket(uploadAddressDTO.Bucket) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 上传本地文件。 err = bucket.PutObjectFromFile(uploadAddressDTO.FileName, localFile) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } }
- 刷新上传凭证。示例如下:
func MyRefreshUploadVideo(client *vod.Client) (response *vod.RefreshUploadVideoResponse, err error) { request := vod.CreateRefreshUploadVideoRequest() request.VideoId = "" request.AcceptFormat = "JSON" return client.RefreshUploadVideo(request) }
- 执行完整流程(注意捕获异常)。示例如下:
type UploadAuthDTO struct { AccessKeyId string AccessKeySecret string SecurityToken string } type UploadAddressDTO struct { Endpoint string Bucket string FileName string } func main() { var accessKeyId string = "<AccessKeyId>"; // 您的AccessKeyId var accessKeySecret string = "<AccessKeySecret>"; // 您的AccessKeySecret var localFile string = "/Users/yours/Video/testVideo.flv"; // 需要上传到VOD的本地视频文件的完整路径 // 初始化VOD客户端并获取上传地址和凭证 var vodClient, initVodClientErr = InitVodClient(accessKeyId, accessKeySecret) if initVodClientErr != nil { fmt.Println("Error:", initVodClientErr) return } // 获取上传地址和凭证 var response, createUploadVideoErr = MyCreateUploadVideo(vodClient) if createUploadVideoErr != nil { fmt.Println("Error:", createUploadVideoErr) return } // 执行成功会返回VideoId、UploadAddress和UploadAuth var videoId = response.VideoId var uploadAuthDTO UploadAuthDTO var uploadAddressDTO UploadAddressDTO var uploadAuthDecode, _ = base64.StdEncoding.DecodeString(response.UploadAuth) var uploadAddressDecode, _ = base64.StdEncoding.DecodeString(response.UploadAddress) json.Unmarshal(uploadAuthDecode, &uploadAuthDTO) json.Unmarshal(uploadAddressDecode, &uploadAddressDTO) // 使用UploadAuth和UploadAddress初始化OSS客户端 var ossClient, _ = InitOssClient(uploadAuthDTO, uploadAddressDTO) // 上传文件,注意是同步上传会阻塞等待,耗时与文件大小和网络上行带宽有关 UploadLocalFile(ossClient, uploadAddressDTO, localFile) //MultipartUploadFile(ossClient, uploadAddressDTO, localFile) fmt.Println("Succeed, VideoId:", videoId) }
.NET 上传示例
环境准备
- .NET Framework 4.6.1 及其以上版本。
- .NET Standard 2.0 及其以上版本。
说明 更多信息可参考 环境要求。
安装
- NuGet 方式安装在 解决方案资源管理器面板 中右击您的项目选择 管理 NuGet 程序包 菜单,在打开的 NuGet 管理面板 中点击 浏览 选项卡分别输入 aliyun-net-sdk-core 和 aliyun-net-sdk-vod,选择对应模块最新版本点击 安装 即可。
- .NET CLI 工具安装。示例如下:
dotnet add package aliyun-net-sdk-core dotnet add package aliyun-net-sdk-vod
说明 说明 更多信息可参考 VOD .NET SDK 安装 和 OSS .NET SDK 安装。
参考代码
- 定义核心步骤的函数:
- 使用 AK 初始化 VOD 客户端。示例如下:
public static DefaultAcsClient InitVodClient(string accessKeyId, string accessKeySecret) { // 根据点播接入服务所在的Region填写,例如:接入服务在上海,则填cn-shanghai string regionId = "cn-shanghai"; IClientProfile profile = DefaultProfile.GetProfile(regionId, accessKeyId, accessKeySecret); return new DefaultAcsClient(profile); }
- 获取视频上传地址和凭证。示例如下:
public static CreateUploadVideoResponse CreateUploadVideo(DefaultAcsClient vodClient) { CreateUploadVideoRequest request = new CreateUploadVideoRequest(); request.AcceptFormat = Aliyun.Acs.Core.Http.FormatType.JSON; request.FileName = "vod_test.mp4"; request.Title = "this is title"; //request.Description = "this is desc"; //request.Tags = "tag1,tag2"; //request.CoverURL = "http://vod.aliyun.com/test_cover_url.jpg"; //request.CateId = -1; //request.TemplateGroupId = ""; //request.WorkflowId = ""; //request.StorageLocation = ""; //request.AppId = "app-1000000"; //设置请求超时时间 request.SetReadTimeoutInMilliSeconds(1000); request.SetConnectTimeoutInMilliSeconds(1000); return vodClient.GetAcsResponse(request); }
- 使用上传凭证和地址初始化 OSS 客户端(注意需要先 Base64 解码并 Json Decode 再传入)。示例如下:
public static OssClient InitOssClient(JObject uploadAuth, JObject uploadAddress) { string endpoint = uploadAddress.GetValue("Endpoint").ToString(); string accessKeyId = uploadAuth.GetValue("AccessKeyId").ToString(); string accessKeySecret = uploadAuth.GetValue("AccessKeySecret").ToString(); string securityToken = uploadAuth.GetValue("SecurityToken").ToString(); return new OssClient(endpoint, accessKeyId, accessKeySecret, securityToken); }
- 上传本地文件。示例如下:
public static void UploadLocalFile(OssClient ossClient, JObject uploadAddress, string localFile) { string bucketName = uploadAddress.GetValue("Bucket").ToString(); string objectName = uploadAddress.GetValue("FileName").ToString(); ossClient.PutObject(bucketName, objectName, localFile); }
- 刷新上传凭证。示例如下:
public static RefreshUploadVideoResponse RefreshUploadVideo(DefaultAcsClient vodClient) { RefreshUploadVideoRequest request = new RefreshUploadVideoRequest(); request.AcceptFormat = Aliyun.Acs.Core.Http.FormatType.JSON; request.VideoId = "VideoId"; //设置请求超时时间 request.SetReadTimeoutInMilliSeconds(1000); request.SetConnectTimeoutInMilliSeconds(1000); return vodClient.GetAcsResponse(request); }
- 执行完整流程(注意捕获异常)。示例如下:
//您的AccessKeyId string accessKeyId = "<Your AccessKeyId>"; //您的AccessKeySecret string accessKeySecret = "<Your AccessKeySecret>"; //需要上传到VOD的本地视频文件的完整路径,需要包含文件扩展名 string localFile = "/Users/yours/Video/testVideo.flv"; try { // 初始化VOD客户端并获取上传地址和凭证 DefaultAcsClient vodClient = InitVodClient(accessKeyId, accessKeySecret); CreateUploadVideoResponse createUploadVideoResponse = CreateUploadVideo(vodClient); // 执行成功会返回VideoId、UploadAddress和UploadAuth String videoId = createUploadVideoResponse.VideoId; JObject uploadAuth = JObject.Parse(Base64Decode(createUploadVideoResponse.UploadAuth)); JObject uploadAddress = JObject.Parse(Base64Decode(createUploadVideoResponse.UploadAddress)); // 使用UploadAuth和UploadAddress初始化OSS客户端 OssClient ossClient = InitOssClient(uploadAuth, uploadAddress); // 上传文件,注意是同步上传会阻塞等待,耗时与文件大小和网络上行带宽有关 UploadLocalFile(ossClient, uploadAddress, localFile); Console.WriteLine("Put local file succeed, VideoId : " + videoId); } catch (Exception e) { Console.WriteLine("Put local file fail, ErrorMessage : " + e.Message); }
Java 上传示例
环境准备
- 环境要求使用 Java 1.8 及以上版本。
- 执行命令 java -version 可以查看 Java 版本。
安装
在 Maven 项目中加入依赖项在 Maven 工程中使用 OSS Java SDK,只需在 pom.xml 中加入相应依赖即可。以 2.8.3 版本为例,在内加入如下内容:
<dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>2.8.3</version> </dependency>
说明 更多信息可参考 VOD Java SDK 和 OSS Java SDK。
参考代码
- 定义核心步骤的函数:
- 使用 AK 初始化 VOD 客户端。示例如下:
public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException { // 根据点播接入服务所在的Region填写,例如:接入服务在上海,则填cn-shanghai;其他区域请参见文档[点播中心](~~98194~~) String regionId = "cn-shanghai"; DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret); DefaultAcsClient client = new DefaultAcsClient(profile); return client; }
- 获取视频上传地址和凭证。示例如下:
public static CreateUploadVideoResponse createUploadVideo(DefaultAcsClient vodClient) { CreateUploadVideoRequest request = new CreateUploadVideoRequest(); request.setFileName("vod_test.mp4"); request.setTitle("this is title"); //request.setDescription("this is desc"); //request.setTags("tag1,tag2"); //request.setCoverURL("http://vod.aliyun.com/test_cover_url.jpg"); //request.setCateId(-1L); //request.setTemplateGroupId(""); //request.setWorkflowId(""); //request.setStorageLocation(""); //request.setAppId("app-1000000"); //设置请求超时时间 request.setSysReadTimeout(1000); request.setSysConnectTimeout(1000); return vodClient.getAcsResponse(request); }
- 使用上传凭证和地址初始化 OSS 客户端(注意需要先 Base64 解码并 Json Decode 再传入)。示例如下:
public static OSSClient initOssClient(JSONObject uploadAuth, JSONObject uploadAddress) { String endpoint = uploadAddress.getString("Endpoint"); String accessKeyId = uploadAuth.getString("AccessKeyId"); String accessKeySecret = uploadAuth.getString("AccessKeySecret"); String securityToken = uploadAuth.getString("SecurityToken"); return new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken); }
- 上传本地文件。示例如下:
public static void uploadLocalFile(OSSClient ossClient, JSONObject uploadAddress, String localFile){ String bucketName = uploadAddress.getString("Bucket"); String objectName = uploadAddress.getString("FileName"); File file = new File(localFile); ossClient.putObject(bucketName, objectName, file); }
- 刷新上传凭证。示例如下:
public static RefreshUploadVideoResponse refreshUploadVideo(DefaultAcsClient vodClient) throws ClientException { RefreshUploadVideoRequest request = new RefreshUploadVideoRequest(); request.setAcceptFormat(FormatType.JSON); request.setVideoId("VideoId"); //设置请求超时时间 request.setSysReadTimeout(1000); request.setSysConnectTimeout(1000); return vodClient.getAcsResponse(request); }
- 执行完整流程(注意捕获异常)。示例如下:
import com.alibaba.fastjson.JSONObject; import com.aliyun.oss.OSSClient; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.http.FormatType; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.vod.model.v20170321.CreateUploadVideoRequest; import com.aliyuncs.vod.model.v20170321.CreateUploadVideoResponse; import com.aliyuncs.vod.model.v20170321.RefreshUploadVideoRequest; import com.aliyuncs.vod.model.v20170321.RefreshUploadVideoResponse; import org.apache.commons.codec.binary.Base64; import java.io.File; public class UploadDemo { public static void main(String[] argv) { //您的AccessKeyId String accessKeyId = "<Your AccessKeyId>"; //您的AccessKeySecret String accessKeySecret = "<Your AccessKeySecret>"; //需要上传到VOD的本地视频文件的完整路径,需要包含文件扩展名 String localFile = "/Users/yours/Video/testVideo.flv"; try { // 初始化VOD客户端并获取上传地址和凭证 DefaultAcsClient vodClient = initVodClient(accessKeyId, accessKeySecret); CreateUploadVideoResponse createUploadVideoResponse = createUploadVideo(vodClient); // 执行成功会返回VideoId、UploadAddress和UploadAuth String videoId = createUploadVideoResponse.getVideoId(); JSONObject uploadAuth = JSONObject.parseObject(decodeBase64(createUploadVideoResponse.getUploadAuth())); JSONObject uploadAddress = JSONObject.parseObject(decodeBase64(createUploadVideoResponse.getUploadAddress())); // 使用UploadAuth和UploadAddress初始化OSS客户端 OSSClient ossClient = initOssClient(uploadAuth, uploadAddress); // 上传文件,注意是同步上传会阻塞等待,耗时与文件大小和网络上行带宽有关 uploadLocalFile(ossClient, uploadAddress, localFile); System.out.println("Put local file succeed, VideoId : " + videoId); } catch (Exception e) { System.out.println("Put local file fail, ErrorMessage : " + e.getLocalizedMessage()); } } }
Demo 下载
形式 | 源码 | 更多参考信息 |
PHP 上传 Demo | PHP 版上传 Demo 源码 | OSS-PHP-SDK 上传文件 |
GO 上传 Demo | GO 版上传 Demo 源码 | OSS-GO-SDK 上传文件 |
.NET 上传 Demo | .NET 版上传 Demo 源码 | OSS-.NET-SDK 上传文件 |
Java 上传 Demo | Java 版上传 Demo 源码 | OSS-Java-SDK 上传文件 |
说明 其它语言上传 SDK 及 Demo 下载请参见 上传 SDK 下载。
「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。