背景信息
在Android端上,短视频上传通过上传实例(VODSVideoUploadClient
)完成,支持同时上传视频和封面图片。短视频上传只支持STS方式上传。要想通过上传地址和凭证方式进行视频文件上传请使用Android SDK上传文件(上传实例VODUploadClient
)分别上传封面图片和视频。
上传流程
STS方式上传流程详解
如需使用STS临时授权方式(阿里云Security Token Service)访问点播服务,请为RAM用户创建角色并授予角色VOD相关权限。操作指引请参见使用STS临时授权方案上传视频。
使用STS方式上传的完整的流程如下图所示:
用户在上传应用服务器上部署授权服务(如集成阿里云STS SDK)用于获取STS临时Token。
客户端向上传应用服务器发起请求获取STS临时Token。
上传应用服务器向阿里云STS服务发起请求获取STS临时Token。
阿里云STS服务返回上传地址和凭证。
上传应用服务器向客户端下发STS临时Token。
客户端使用STS临时Token初始化上传实例。
客户端构造请求发起上传请求。
OSS服务返回上传结果。
说明 上传结果也可以通过提前配置回调接收上传相关事件来监听。
上传文件
获取STS临时Token。操作指引请参见获取STS临时Token。
声明VODSVideoUploadClient
属性,不能是局部变量。
//初始化短视频上传对象
VODSVideoUploadClient vodsVideoUploadClient = new VODSVideoUploadClientImpl(this.getApplicationContext());
vodsVideoUploadClient.init();
构建上传参数。
展开查看代码
//构建上传参数
//参数请确保存在,如不存在SDK内部将会直接将错误throw Exception
//文件路径保证存在之外因为Android 6.0之后需要动态获取权限,请开发者自行实现获取"文件读写权限"
VodHttpClientConfig vodHttpClientConfig = new VodHttpClientConfig.Builder()
.setMaxRetryCount(2)//重试次数
.setConnectionTimeout(15 * 1000)//连接超时
.setSocketTimeout(15 * 1000)//socket超时
.build();
//构建短视频VideoInfo,常见的描述、标题、详情都可以设置
SvideoInfo svideoInfo = new SvideoInfo();
svideoInfo.setTitle(new File(videoPath).getName());//标题
svideoInfo.setDesc("");//文件详情
svideoInfo.setCateId(1);//分类ID
//构建点播上传参数(重要)
VodSessionCreateInfo vodSessionCreateInfo =new VodSessionCreateInfo.Builder()
.setImagePath(imagePath)//图片地址
.setVideoPath(videoPath)//视频地址
.setAccessKeyId(accessKeyId)//临时accessKeyId
.setAccessKeySecret(accessKeySecret)//临时accessKeySecret
.setSecurityToken(securityToken)//STS临时Token
.setExpriedTime(expriedTime)//STStoken过期时间
.setRequestID(requestID)//requestID,开发者可以传将获取STS返回的requestID设置也可以不设
.setIsTranscode(true)//是否转码,如开启转码请AppSever务必监听服务端转码成功的通知
.setSvideoInfo(svideoInfo)//短视频信息
.setVodHttpClientConfig(vodHttpClientConfig)//网络参数
.build();
开始上传并设置回调。
启动上传前需要实现VODSVideoUploadCallback
回调。
展开查看代码
vodsVideoUploadClient.uploadWithVideoAndImg(vodSessionCreateInfo, new VODSVideoUploadCallback() {
@Override
public void onUploadSucceed(String videoId, String imageUrl) {
//上传成功返回视频ID和图片URL
Log.d(TAG,"onUploadSucceed"+ "videoId:"+ videoId + "imageUrl" + imageUrl);
}
@Override
public void onUploadFailed(String code, String message) {
//上传失败返回错误码和message,错误码有详细的错误信息请开发者仔细阅读
Log.d(TAG,"onUploadFailed" + "code" + code + "message" + message);
}
@Override
public void onUploadProgress(long uploadedSize, long totalSize) {
//上传的进度回调,非UI线程
Log.d(TAG,"onUploadProgress" + uploadedSize * 100 / totalSize);
progress = uploadedSize * 100 / totalSize;
handler.sendEmptyMessage(0);
}
@Override
public void onSTSTokenExpried() {
Log.d(TAG,"onSTSTokenExpried");
//STS token过期之后刷新STStoken,如正在上传将会断点续传
vodsVideoUploadClient.refreshSTSToken(accessKeyId,accessKeySecret,securityToken,expriedTime);
}
@Override
public void onUploadRetry(String code, String message) {
//上传重试的提醒
Log.d(TAG,"onUploadRetry" + "code" + code + "message" + message);
}
@Override
public void onUploadRetryResume() {
//上传重试成功的回调,告知用户重试成功
Log.d(TAG,"onUploadRetryResume");
}
});
上传控制
上传实例(VODSVideoUploadClient
)支持的上传控制如下:
暂停上传。
//需要保证跟resume成对出现
vodsVideoUploadClient.pause();
恢复上传。
//需要保证跟pause成对出现
vodsVideoUploadClient.resume();
取消上传。
//取消上传之后,上传流程结束,不能再调用resume恢复
vodsVideoUploadClient.cancel();
回调处理
上传进度
每上传一个分片,会触发onUploadProgress
回调,回调参数包括已上传文件大小uploadedSize
和总文件大小totalSize
。
上传成功
上传成功时,会触发onUploadSucceed
回调。回调包含上传结果的videoId
和imageUrl
属性。
上传失败
上传失败时,会触发onUploadFailed
回调。在该回调方法中,可以通过code
和message
查看具体原因,并在页面上提示。更多错误码信息,请参见错误码表和OSS错误码。
凭证过期处理
STS过期,会触发onSTSTokenExpired
回调。在该回调方法中,可以向AppServer重新请求新的STS凭证,并调用以下方法继续上传。
refreshSTSToken(accessKeyId,accessKeySecret,securityToken,expriedTime);
超时处理
上传超时,会触发uploadRetry
回调并自动重试。在该回调方法中,可以在页面上给予提示或者调用cancel
方法停止上传。此外,可以设置maxRetryCount
属性,指定最大重试次数。超时重试可以继续上传时,会触发uploadRetryResume
回调并恢复上传。