产品百科 | 如何基于 OSS 原生 SDK 上传视频

场景

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

前提

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

  • 客户端上传 SDK:
  • 服务端上传 SDK:

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

准备工作

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

上传步骤

产品百科 | 如何基于 OSS 原生 SDK 上传视频

  1. 访问点播服务获取请参见上传地址和上传凭证
    说明 这一步还会创建视频媒资记录,返回视频 ID,请妥善保存,后续可根据视频 ID 进行视频播放、管理和 AI 处理等。
  2. 解析上传地址(UploadAddress) 和 上传凭证(UploadAuth),得到 OSS 的上传地址和授权信息。解析方式请参见上传地址和凭证的解析
  3. 调用 OSS SDK 将视频文件上传至指定的 bucket 中,注意使用 STS Auth 方式,且使用解析后的上传地址和授权信息进行初始化,不要使用自己的 AccessKey 等信息。

代码实现

  • 核心代码实现共分 4 步:
    1. 使用 AK 初始化 VOD 客户端。
    2. 获取视频上传地址和凭证。
    3. 使用上传凭证和地址初始化 OSS 客户端。
    4. 上传本地文件。
    • 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 扩展是否已经安装好。

安装

  1. 在您的 PHP 项目中添加空文件夹 aliyun-php-sdk 。
  2. aliyun-openapi-php-sdk 下载整个源码,解压后拷贝 aliyun-php-sdk-core 和 aliyun-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." 在这行下面添加:
Autoloader::addAutoloadPath("aliyun-php-sdk-vod");
  1. 在代码中引用 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;

  1. 说明 更多信息可参考 VOD PHP SDK 安装OSS PHP SDK 安装

参考代码

  • 定义核心步骤的函数:
    1. 使用 AK 初始化 VOD 客户端。示例如下:
function init_vod_client($accessKeyId, $accessKeySecret) {
    $regionId = 'cn-shanghai';     // 根据点播接入服务所在的Region填写,例如:接入服务在上海,则填cn-shanghai
    $profile = DefaultProfile::getProfile($regionId, $accessKeyId, $accessKeySecret);
    return new DefaultAcsClient($profile);
}
    1. 获取视频上传地址和凭证。示例如下:
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);
}
    1. 使用上传凭证和地址初始化 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;
}

    1. 说明 如果由于 SSL 配置异常导致错误 (如出现 cURL error: SSL certificate problem), 可将 https 替换为 http 后再初始化 OssClient。
$uploadAddress['Endpoint'] = str_replace("https:", "http:", $uploadAddress['Endpoint']);
    1. 上传本地文件。示例如下:
function upload_local_file($ossClient, $uploadAddress, $localFile) {
    return $ossClient->uploadFile($uploadAddress['Bucket'], $uploadAddress['FileName'], $localFile);
}
    1. 刷新上传凭证。示例如下:
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
  • 定义核心步骤的函数:
    1. 使用 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)
}
    1. 获取视频上传地址和凭证。示例如下:
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)
}
    1. 使用上传凭证和地址初始化 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
}
    1. 上传本地文件。示例如下:
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)
    }
}
    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

参考代码

  • 定义核心步骤的函数:
    1. 使用 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);
}
    1. 获取视频上传地址和凭证。示例如下:
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);
}
    1. 使用上传凭证和地址初始化 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);
}
    1. 上传本地文件。示例如下:
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);
}
    1. 刷新上传凭证。示例如下:
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 SDKOSS Java SDK

参考代码

  • 定义核心步骤的函数:
    1. 使用 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;
}
    1. 获取视频上传地址和凭证。示例如下:
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);
}
    1. 使用上传凭证和地址初始化 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);
}
    1. 上传本地文件。示例如下:
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);
}
    1. 刷新上传凭证。示例如下:
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 下载

说明 其它语言上传 SDK 及 Demo 下载请参见 上传 SDK 下载


「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。

产品百科 | 如何基于 OSS 原生 SDK 上传视频

上一篇:GB/T 36964-2018《软件工程 软件开发成本度量规范》国家标准正式发布


下一篇:软件成本度量进阶系列之增强开发、中间系统评估