二、视频点播
1、入门代码
基于OSS原生SDK上传 ,参考文档:https://help.aliyun.com/zh/vod/user-guide/upload-media-files-by-using-oss-sdks?spm=a2c4g.11186623.0.0.1f02273fj4lxNJ
视频点播面向开发者提供了丰富的上传方式,其中上传SDK(分服务端和客户端)封装了上传相关的基础逻辑,仅需简单配置即可实现上传功能,推荐使用
基于OSS原生SDK上传需要开发者自行实现所有上传逻辑,包括在点播服务获取上传地址和凭证、Base64解码上传地址和凭证以及调用OSS能力完成上传。
以集成点播服务端SDK获取上传地址和凭证为例,完整的上传流程如下图所示:
流程详解
- 上传应用服务器使用RAM用户AK方式(AccessKey ID和AccessKey Secret)或STS临时AK初始化点播客户端。
- 上传应用服务器使用点播服务端SDK调用上传地址和凭证相关接口获取上传地址、上传凭证及媒资信息。
- 点播服务在请求结果中返回Base64加密的上传地址(UploadAddress)、上传凭证(UploadAuth)、和媒体ID等信息。上传应用服务器可根据返回结果解析参数作为初始化OSS原生SDK的入参。
- 上传应用服务器使用解析后的上传地址(UploadAddress)和授权信息(UploadAuth),通过STS方式初始化OSS客户端。
- 上传应用服务器使用OSS SDK调用OSS上传相关接口将媒体文件上传至指定的存储地址。
- OSS服务返回上传结果。
需要的依赖包
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-vod</artifactId>
<version>2.16.10</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-kms</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
上传代码案例:
import com.alibaba.fastjson.JSONObject;
import com.aliyun.oss.OSSClient;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.vod.model.v20170321.CreateUploadVideoRequest;
import com.aliyuncs.vod.model.v20170321.CreateUploadVideoResponse;
import org.apache.commons.codec.binary.Base64;
import java.io.File;
/**
* 上传代码案例
*/
public class UploadDemo {
//初始化VOD客户端、需要注意接入服务地址
public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
// 根据点播接入服务所在的Region填写,例如:接入服务在上海,则填cn-shanghai;其他区域请参见存储说明。
String regionId = "cn-shanghai";
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
return client;
}
//创建视频上传结果对象
public static CreateUploadVideoResponse createUploadVideo(DefaultAcsClient vodClient) throws ClientException {
CreateUploadVideoRequest request = new CreateUploadVideoRequest();
request.setFileName("vod_test.mp4");
request.setTitle("this is title");
//设置请求超时时间
request.setSysReadTimeout(1000);
request.setSysConnectTimeout(1000);
return vodClient.getAcsResponse(request);
}
//初始OSS客户端
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);
}
/**
* accessKeyId、accessKeySecret和localFile这三个变量需要设置
* @param args
*/
public static void main(String[] args) {
//您的AccessKeyId
String accessKeyId = "xxxxx";
//您的AccessKeySecret
String accessKeySecret = "xxxxx";
//需要上传到VOD的本地视频文件的完整路径,需要包含文件扩展名
String localFile = "D:\\临时资料\\xxx.mp4";
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());
}
}
private static String decodeBase64(String data) {
return new String(Base64.decodeBase64(data));
}
}
上传成功,可以看到视频ID。播放的时候是需要用到视频ID
2、播放视频
去到VOD控制台 -> 媒体库 -> 找到上传成功的视频
点击管理 -> 在基础信息中可以看到视频的基本情况,包括视频ID,存储地址,点击web播放器代码,官方提供了视频播放的Html和JS脚本。
创建一个html文件将代码复制进去。vid : 视频的id;payauth : 播放凭证
3.获取payauth
官方说明:请复制代码并补充playauth值后再使用,playauth获取方式请参考文档获取播放凭证,我们根据文档去获取播放凭证,文档地址:https://help.aliyun.com/zh/vod/developer-reference/api-vod-2017-03-21-getvideoplayauth
这里可以先试用调试 - 拿到播放凭证
进入调试页面,选择服务器地址,制定VideoId视频ID,然后点击发起调用,就可以获得播放凭证。
将右侧的凭证复制到html中,刷新页面尝试播放,而且通过network可以看得出,采用的是视频点播,边下边播的方式。
获取播放凭证代码可以在调试 -> SDK实例里面直接下载官方代码
运行需要导入依赖
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>vod20170321</artifactId>
<version>2.16.16</version>
</dependency>
打开后代码:
package com.buba.util;
/**
* @title Sample
*/
import com.aliyun.tea.*;
public class Sample {
/**
* 使用AK&SK初始化账号Client,需要设置AccessKeyId、AccessKeySecret
* @return Client
* @throws Exception
*/
public static com.aliyun.vod20170321.Client createClient() throws Exception {
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
// 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 访问ID:必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID与其对应的值。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// 访问密保:必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET与其对应的值。
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Endpoint 请参考 https://api.aliyun.com/product/vod
config.endpoint = "vod.cn-shanghai.aliyuncs.com";
return new com.aliyun.vod20170321.Client(config);
}
public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_);
com.aliyun.vod20170321.Client client = Sample.createClient();
com.aliyun.vod20170321.models.GetVideoPlayAuthRequest getVideoPlayAuthRequest = new com.aliyun.vod20170321.models.GetVideoPlayAuthRequest()
.setVideoId("d079e82b0d0871efbfb85017e1f80102");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
com.aliyun.vod20170321.models.GetVideoPlayAuthResponse resp = client.getVideoPlayAuthWithOptions(getVideoPlayAuthRequest, runtime);
System.out.println(com.aliyun.teautil.Common.toJSONString(resp));
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}