全部产品
云市场

Java上传SDK

更新时间:2019-07-01 10:30:02

1. SDK简介

概述

点播服务(VoD)基于对象存储(OSS)构建,开通VoD时会自动分配独立的系统Bucket,以存储各种媒体文件,包括上传的视频、音频、图片等源文件,以及转码后的输出文件、截图和封面等等,并作为点播加速域名的源站。使用VoD上传SDK能方便、快速实现媒体文件的上传。支持的文件格式参考 媒体上传文件支持

功能介绍

使用此上传SDK可实现以下功能:

主要功能

  1. 上传本地音视频到点播,默认使用分片上传,最大支持48.8TB的单个文件;支持断点续传。
  2. 上传网络音视频到点播,指定URL地址,即可自动下载并上传到点播,最大支持48.8TB的单个文件。
  3. 上传本地图片到点播,指定本地文件路径,即可自动上传到点播。
  4. 上传网络图片到点播,指定URL地址,即可自动下载并上传到点播。
  5. 上传本地m3u8音视频(包括所有分片文件)到点播,需指定本地m3u8索引文件和分片文件目录。
  6. 上传网络m3u8音视频(包括所有分片文件)到点播,需指定网络m3u8索引文件和分片文件的URL地址。
  7. 上传本地辅助媒资文件到点播,指定本地文件路径,即可自动上传到点播。
  8. 上传网络辅助媒资文件到点播,指定URL地址,即可自动下载并上传到点播。

其他功能

  1. 上传进度条功能,支持SDK默认进度回调和自定义进度回调,m3u8文件上传暂不支持。
  2. 可指定上传脚本部署的ECS区域,如果与点播存储(OSS)区域相同,则自动使用内网上传文件至存储,上传更快且更省公网流量(由于点播API只提供外网域名访问,因此部署上传脚本的ECS服务器必须具有访问外网的权限)。
  3. 可指定点播中心(默认为上海)和存储区域,便于海外上传。
  4. 支持上传时设置元数据(标题等),以及StorageLocation、UserData、转码模板、点播工作流等。
  5. 支持STS方式接入,需实现传递和刷新STS的接口,当文件上传时间超过STS过期时间时,SDK内部定期获取新的STS信息,进行后续上传操作。

2. SDK安装

环境要求

Java版本1.8.0

安装SDK

以 1.4.9 版本为例,步骤如下:

1.下载Java示例代码VODUploadDemo-java-1.4.9.zip开发包(包含示例代码和所需jar包), 见 视频上传SDK下载 ;

2.将解压后lib目录下的所有jar文件拷贝至您的项目中;

3.SDK依赖的jar包版本说明

注意:以下列举出部分依赖jar包的版本,您可直接在您的项目中添加maven依赖,也可以将VODUploadDemo-java-1.4.9.zip包中的所有jar包引入您的项目中使用。其中,aliyun-java-vod-upload-1.4.9.jar 还未正式开源,请您直接引入jar包至您的项目中使用。

  1. <dependency>
  2. <groupId>com.aliyun</groupId>
  3. <artifactId>aliyun-java-sdk-core</artifactId>
  4. <version>4.3.3</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.aliyun.oss</groupId>
  8. <artifactId>aliyun-sdk-oss</artifactId>
  9. <version>3.1.0</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.aliyun</groupId>
  13. <artifactId>aliyun-java-sdk-vod</artifactId>
  14. <version>2.15.2</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>com.alibaba</groupId>
  18. <artifactId>fastjson</artifactId>
  19. <version>1.2.28</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.json</groupId>
  23. <artifactId>json</artifactId>
  24. <version>20170516</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>com.google.code.gson</groupId>
  28. <artifactId>gson</artifactId>
  29. <version>2.8.2</version>
  30. </dependency>

4.使用IDE开发时引用jar包的方法,以Eclipse和IntelliJ IDEA为例说明如下:

4.1 在Eclipse中选择您的工程,右击 -> Properties -> Java Build Path -> Add JARs;

4.2 在IntelliJ IDEA中打开您的工程,File -> Project Structure -> Modules -> 右侧Dependencies -> + -> JARs or directories

5.选中您在第一步拷贝的所有jar文件;

经过以上几步,您就可以在Eclipse或IntelliJ IDEA项目中使用VODUpload Java SDK。

3. 示例代码

上传SDK示例

将VODUploadDemo-java-1.4.9.zip开发包解压后, 在sample目录下的UploadVideoDemo.java为文件上传示例程序, 如下:

  1. public class UploadVideoDemo {
  2. //账号AK信息请填写(必选)
  3. private static final String accessKeyId = "";
  4. //账号AK信息请填写(必选)
  5. private static final String accessKeySecret = "";
  6. public static void main(String[] args) {
  7. //1.音视频上传-本地文件上传
  8. //视频标题(必选)
  9. String title = "测试标题";
  10. //本地文件上传和文件流上传时,文件名称为上传文件绝对路径,如:/User/sample/文件名称.mp4 (必选)
  11. //文件名必须包含扩展名
  12. String fileName = "测试文件名称.mp4";
  13. //本地文件上传
  14. testUploadVideo(accessKeyId, accessKeySecret, title, fileName);
  15. //2.图片上传-本地文件上传
  16. testUploadImageLocalFile(accessKeyId, accessKeySecret);
  17. }
  18. /**
  19. * 本地文件上传接口
  20. *
  21. * @param accessKeyId
  22. * @param accessKeySecret
  23. * @param title
  24. * @param fileName
  25. */
  26. private static void testUploadVideo(String accessKeyId, String accessKeySecret, String title, String fileName) {
  27. UploadVideoRequest request = new UploadVideoRequest(accessKeyId, accessKeySecret, title, fileName);
  28. /* 可指定分片上传时每个分片的大小,默认为1M字节 */
  29. request.setPartSize(1 * 1024 * 1024L);
  30. /* 可指定分片上传时的并发线程数,默认为1,(注:该配置会占用服务器CPU资源,需根据服务器情况指定)*/
  31. request.setTaskNum(1);
  32. /* 是否开启断点续传, 默认断点续传功能关闭。当网络不稳定或者程序崩溃时,再次发起相同上传请求,可以继续未完成的上传任务,适用于超时3000秒仍不能上传完成的大文件。
  33. 注意: 断点续传开启后,会在上传过程中将上传位置写入本地磁盘文件,影响文件上传速度,请您根据实际情况选择是否开启*/
  34. request.setEnableCheckpoint(false);
  35. /* OSS慢请求日志打印超时时间,是指每个分片上传时间超过该阈值时会打印debug日志,如果想屏蔽此日志,请调整该阈值。单位: 毫秒,默认为300000毫秒*/
  36. //request.setSlowRequestsThreshold(300000L);
  37. /* 可指定每个分片慢请求时打印日志的时间阈值,默认为300s*/
  38. //request.setSlowRequestsThreshold(300000L);
  39. /* 是否使用默认水印(可选),指定模板组ID时,根据模板组配置确定是否使用默认水印*/
  40. //request.setIsShowWaterMark(true);
  41. /* 设置上传完成后的回调URL(可选),建议您通过点播控制台配置事件通知,参见文档 https://help.aliyun.com/document_detail/55627.html */
  42. //request.setCallback("http://callback.sample.com");
  43. /* 自定义消息回调设置(可选),参数说明参考文档 https://help.aliyun.com/document_detail/86952.html#UserData */
  44. // request.setUserData("{\"Extend\":{\"test\":\"www\",\"localId\":\"xxxx\"},\"MessageCallback\":{\"CallbackURL\":\"http://test.test.com\"}}");
  45. /* 视频分类ID(可选) */
  46. //request.setCateId(0);
  47. /* 视频标签,多个用逗号分隔(可选) */
  48. //request.setTags("标签1,标签2");
  49. /* 视频描述(可选) */
  50. //request.setDescription("视频描述");
  51. /* 封面图片(可选) */
  52. //request.setCoverURL("http://cover.sample.com/sample.jpg");
  53. /* 模板组ID(可选) */
  54. //request.setTemplateGroupId("8c4792cbc8694e7084fd5330e56a33d");
  55. /* 存储区域(可选) */
  56. //request.setStorageLocation("in-201703232118266-5sejdln9o.oss-cn-shanghai.aliyuncs.com");
  57. /* 开启默认上传进度回调 */
  58. // request.setPrintProgress(true);
  59. /* 设置自定义上传进度回调 (必须继承 ProgressListener) */
  60. // request.setProgressListener(new PutObjectProgressListener());
  61. UploadVideoImpl uploader = new UploadVideoImpl();
  62. UploadVideoResponse response = uploader.uploadVideo(request);
  63. System.out.print("RequestId=" + response.getRequestId() + "\n"); //请求视频点播服务的请求ID
  64. if (response.isSuccess()) {
  65. System.out.print("VideoId=" + response.getVideoId() + "\n");
  66. } else {
  67. /* 如果设置回调URL无效,不影响视频上传,可以返回VideoId同时会返回错误码。其他情况上传失败时,VideoId为空,此时需要根据返回错误码分析具体错误原因 */
  68. System.out.print("VideoId=" + response.getVideoId() + "\n");
  69. System.out.print("ErrorCode=" + response.getCode() + "\n");
  70. System.out.print("ErrorMessage=" + response.getMessage() + "\n");
  71. }
  72. }
  73. /**
  74. * 图片上传接口,本地文件上传示例
  75. * 参数参考文档 https://help.aliyun.com/document_detail/55619.html
  76. *
  77. * @param accessKeyId
  78. * @param accessKeySecret
  79. */
  80. private static void testUploadImageLocalFile(String accessKeyId, String accessKeySecret) {
  81. // 图片类型(必选)取值范围:default(默认),cover(封面),watermark(水印)
  82. String imageType = "cover";
  83. UploadImageRequest request = new UploadImageRequest(accessKeyId, accessKeySecret, imageType);
  84. /* 图片文件扩展名(可选)取值范围:png,jpg,jpeg */
  85. //request.setImageExt("png");
  86. /* 图片标题(可选)长度不超过128个字节,UTF8编码 */
  87. //request.setTitle("图片标题");
  88. /* 图片标签(可选)单个标签不超过32字节,最多不超过16个标签,多个用逗号分隔,UTF8编码 */
  89. //request.setTags("标签1,标签2");
  90. /* 存储区域(可选)*/
  91. //request.setStorageLocation("out-4f3952f78c0211e8b3020013e7.oss-cn-shanghai.aliyuncs.com");
  92. /* 流式上传时,InputStream为必选,fileName为源文件名称,如:文件名称.png(可选)*/
  93. //request.setFileName("测试文件名称.png");
  94. /* 开启默认上传进度回调 */
  95. // request.setPrintProgress(true);
  96. /* 设置自定义上传进度回调 (必须继承 ProgressListener) */
  97. // request.setProgressListener(new PutObjectProgressListener());
  98. UploadImageImpl uploadImage = new UploadImageImpl();
  99. UploadImageResponse response = uploadImage.upload(request);
  100. System.out.print("RequestId=" + response.getRequestId() + "\n");
  101. if (response.isSuccess()) {
  102. System.out.print("ImageId=" + response.getImageId() + "\n");
  103. System.out.print("ImageURL=" + response.getImageURL() + "\n");
  104. } else {
  105. System.out.print("ErrorCode=" + response.getCode() + "\n");
  106. System.out.print("ErrorMessage=" + response.getMessage() + "\n");
  107. }
  108. }
  109. }

上传进度条示例

将VODUploadDemo-java-1.4.9.zip开发包解压后, 在sample目录下的PutObjectProgressListener.java为上传进度回调函数示例程序,该类必须继承VoDProgressListener类。其中,ProgressEvent是通过OSS上传文件时产生的进度回调通知,您可自定义各个事件通知的业务处理逻辑,示例代码如下:

  1. import com.aliyun.oss.event.ProgressEvent;
  2. import com.aliyun.oss.event.ProgressEventType;
  3. /**
  4. * 上传进度回调方法类
  5. * 当您开启上传进度回调时该事件回调才会生效。
  6. * OSS分片上传成功或失败均触发相应的回调事件,您可根据业务逻辑处理相应的事件回调。
  7. * 当创建音视频信息成功后,此上传进度回调中的videoId为本次上传生成的视频ID,您可以根据视频ID进行音视频管理。
  8. * 当创建图片信息成功后,此上传进度回调中的ImageId为本次上传生成的图片ID,您可以根据视频ID进行图片管理。
  9. */
  10. public class PutObjectProgressListener implements VoDProgressListener {
  11. /**
  12. * 已成功上传至OSS的字节数
  13. */
  14. private long bytesWritten = 0;
  15. /**
  16. * 原始文件的总字节数
  17. */
  18. private long totalBytes = -1;
  19. /**
  20. * 本次上传成功标记
  21. */
  22. private boolean succeed = false;
  23. /**
  24. * 视频ID
  25. */
  26. private String videoId;
  27. /**
  28. * 图片ID
  29. */
  30. private String imageId;
  31. public void progressChanged(ProgressEvent progressEvent) {
  32. long bytes = progressEvent.getBytes();
  33. ProgressEventType eventType = progressEvent.getEventType();
  34. switch (eventType) {
  35. // 开始上传事件
  36. case TRANSFER_STARTED_EVENT:
  37. if (videoId != null) {
  38. System.out.println("Start to upload videoId " + videoId + "......");
  39. }
  40. if (imageId != null) {
  41. System.out.println("Start to upload imageId " + imageId + "......");
  42. }
  43. break;
  44. // 计算待上传文件总大小事件通知,只有调用本地文件方式上传时支持该事件
  45. case REQUEST_CONTENT_LENGTH_EVENT:
  46. this.totalBytes = bytes;
  47. System.out.println(this.totalBytes + "bytes in total will be uploaded to OSS.");
  48. break;
  49. // 已经上传成功文件大小事件通知
  50. case REQUEST_BYTE_TRANSFER_EVENT:
  51. this.bytesWritten += bytes;
  52. if (this.totalBytes != -1) {
  53. int percent = (int) (this.bytesWritten * 100.0 / this.totalBytes);
  54. System.out.println(bytes + " bytes have been written at this time, upload progress: " +
  55. percent + "%(" + this.bytesWritten + "/" + this.totalBytes + ")");
  56. } else {
  57. System.out.println(bytes + " bytes have been written at this time, upload sub total : " +
  58. "(" + this.bytesWritten + ")");
  59. }
  60. break;
  61. // 文件全部上传成功事件通知
  62. case TRANSFER_COMPLETED_EVENT:
  63. this.succeed = true;
  64. if (videoId != null) {
  65. System.out.println("Succeed to upload videoId " + videoId + " , " + this.bytesWritten + " bytes have been transferred in total.");
  66. }
  67. if (imageId != null) {
  68. System.out.println("Succeed to upload imageId " + imageId + " , " + this.bytesWritten + " bytes have been transferred in total.");
  69. }
  70. break;
  71. // 文件上传失败事件通知
  72. case TRANSFER_FAILED_EVENT:
  73. if (videoId != null) {
  74. System.out.println("Failed to upload videoId " + videoId + " , " + this.bytesWritten + " bytes have been transferred.");
  75. }
  76. if (imageId != null) {
  77. System.out.println("Failed to upload imageId " + imageId + " , " + this.bytesWritten + " bytes have been transferred.");
  78. }
  79. break;
  80. default:
  81. break;
  82. }
  83. }
  84. public boolean isSucceed() {
  85. return succeed;
  86. }
  87. public void onVidReady(String videoId) {
  88. setVideoId(videoId);
  89. }
  90. public void onImageIdReady(String imageId) {
  91. setImageId(imageId);
  92. }
  93. public String getVideoId() {
  94. return videoId;
  95. }
  96. public void setVideoId(String videoId) {
  97. this.videoId = videoId;
  98. }
  99. public String getImageId() {
  100. return imageId;
  101. }
  102. public void setImageId(String imageId) {
  103. this.imageId = imageId;
  104. }
  105. }