下面是阿里云视频点播的视频上传教程,以及记录我遇到的问题是如何解决的。
阿里云视频点播的时候,我遇到了很难的一个bug,我上传的视频本地代码瞬间执行完成,没有明显报错信息,只有代码里面,可以通过response 打印出了 ErrorCode=null ErrorMessage=sun/misc/BASE64Ecoder 这是第一个表面的现象。
然后是第二个表面现象:阿里云官网的视频状态也一直是上传中。
我查了很多资料,说是必须是1.8的jdk,或者是设置IDE的jre,但是都不能解决根本,唯一的方法就是换版本,大致原因是因为目前的依赖版本中使用到了那个BASE64的转码类,但是这个类不能用。
解决办法,首先在工程pom文件中导入如下依赖:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-vod</artifactId>
<version>2.15.11</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.28</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20170516</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
版本一定要和我一样。
然后还有一个问题,就是最重要的一个jar包,阿里目前并没有开源,要自己想办法弄到工程里面去。你可以直接导入到现有的工程中,如lib包中,但是我下面展示如何装到本地的maven仓库中,这样你所有的工程都可以使用。
首先你要确定你的maven是否可以通过命令行执行相关命令,使用【mvn --version】命令进行测试,可以打印出版本信息就行,不能的话,自己百度一下如何把maven的命令设置到环境变量中。
然后就是正题,在 【aliyun-java-vod-upload-1.4.13.jar】这个文件所在的文件夹打开DOS命令窗口,执行 【mvn install:install-file -DgroupId=com.aliyun -DartifactId=aliyun-sdk-vod-upload -Dversion=1.4.13 -Dpackaging=jar -Dfile=aliyun-java-vod-upload-1.4.13.jar】即可完成安装。
至于这个文件,我下面教你怎么弄到手,进入 阿里云登录上,然后进入【https://help.aliyun.com/document_detail/51992.html?spm=a2c4g.11186623.2.6.10c95186fbfSe3】这个页面。点击下方图片红框处即可下载一个压缩包,目前应该是1.4.13版本,也最好是这个版本。然后压缩包的lib文件夹下有一个名字一样的jar包,只要它自己一个,拿出来就行了。
附上上传视频的Java代码:
第一种:本地上传方式:
package com.dkf.test;
import com.aliyun.vod.upload.impl.UploadVideoImpl;
import com.aliyun.vod.upload.req.UploadVideoRequest;
import com.aliyun.vod.upload.resp.UploadVideoResponse;
import org.junit.Test;
import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder;
public class TestUploadVideo {
//这是做阿里云OSS时的两个密钥数据
private String keyid="";
private String keysecret="";
@Test
public void test() {
//3.音视频上传-本地文件上传
//视频标题(必选)
String title = "Video";
//本地文件上传和文件流上传时,文件名称为上传文件绝对路径,如:/User/sample/文件名称.mp4 (必选)
//文件名必须包含扩展名
String fileName = "G:/test.mp4";
//本地文件上传
UploadVideoRequest request = new UploadVideoRequest(keyid, keysecret, title, fileName);
/* 可指定分片上传时每个分片的大小,默认为1M字节 */
request.setPartSize(2 * 1024 * 1024L);
/* 可指定分片上传时的并发线程数,默认为1,(注:该配置会占用服务器CPU资源,需根据服务器情况指定)*/
request.setTaskNum(1);
UploadVideoImpl uploader = new UploadVideoImpl();
UploadVideoResponse response = uploader.uploadVideo(request);
System.out.print("RequestId=" + response.getRequestId() + "\n"); //请求视频点播服务的请求ID
if (response.isSuccess()) {
System.out.print("VideoId=" + response.getVideoId() + "\n");
} else {
/* 如果设置回调URL无效,不影响视频上传,可以返回VideoId同时会返回错误码。其他情况上传失败时,VideoId为空,此时需要根据返回错误码分析具体错误原因 */
System.out.print("VideoId=" + response.getVideoId() + "\n");
System.out.print("ErrorCode=" + response.getCode() + "\n");
System.out.print("ErrorMessage=" + response.getMessage() + "\n");
}
}
}
关于这个密钥怎么弄我就不说了,很简单,没什么悬疑。Ok有什么问题,下载不下来等,可以加qq1919213538联系我,可以下载的东西一定免费分享。
第二种:流式上传方式,即页面上传视频文件到阿里云:
//使用流式上传接口
public String uploadVideo(MultipartFile file) {
UploadStreamRequest request = null;
try{
/**
* title : 上传之后显示的名称
* fileName: 上传文件原始名称
* inputStream : 上传文件输入流
*/
String fileName = file.getOriginalFilename();
//title不让它带后缀名,个人建议
String title = fileName.substring(0, fileName.lastIndexOf("."));
InputStream inputStream = file.getInputStream();
request = new UploadStreamRequest(ConstantVodUtils.KEY_ID, ConstantVodUtils.KEY_SECRET, title, fileName, inputStream);
}catch (Exception e){
e.printStackTrace();
}
//一般我们都需要保存上传视频的ID
String videoId = null;
//创建实现上传的对象
UploadVideo uploader = new UploadVideoImpl();
//上传动作,到这一步,已经上传成功
UploadStreamResponse response = uploader.uploadStream(request);
//下面是打印信息,用于测试,并且保存下videoId,
//以便后面通过videoId获取到视频的播放地址或播放凭证
System.out.println("RequestId=" + response.getRequestId());
if(response.isSuccess()){
videoId = response.getVideoId();
System.out.println("VideoId=" + response.getVideoId());
}else{
System.out.println("videoId=" + response.getVideoId());
System.out.println("ErrorCode=" + response.getCode());
System.out.println("ErrorMessage=" + response.getMessage());
}
return videoId;
}