使用Android SDK上传短视频

短视频上传是指将文件从客户端上传至点播存储。通过短视频上传完成的视频,上传SDK会返回videoId。在集成阿里云播放器的情况下,此ID可用作vid+playauth播放方式的参数设置,不用再单独获取播放地址和凭证。本文介绍如何使用Android端上传SDK完成短视频上传。

背景信息

在Android端上,短视频上传通过上传实例(VODSVideoUploadClient)完成,支持同时上传视频和封面图片。短视频上传只支持STS方式上传。要想通过上传地址和凭证方式进行视频文件上传请使用Android SDK上传文件(上传实例VODUploadClient)分别上传封面图片和视频。

上传流程

STS方式上传流程详解

如需使用STS临时授权方式(阿里云Security Token Service)访问点播服务,请为RAM用户创建角色并授予角色VOD相关权限。操作指引请参见使用STS临时授权方案上传视频

使用STS方式上传的完整的流程如下图所示:客户端STS方式上传流程

  1. 用户在上传应用服务器上部署授权服务(如集成阿里云STS SDK)用于获取STS临时Token。

  2. 客户端向上传应用服务器发起请求获取STS临时Token。

  3. 上传应用服务器向阿里云STS服务发起请求获取STS临时Token。

  4. 阿里云STS服务返回上传地址和凭证。

  5. 上传应用服务器向客户端下发STS临时Token。

  6. 客户端使用STS临时Token初始化上传实例。

  7. 客户端构造请求发起上传请求。

  8. OSS服务返回上传结果。

    说明

    上传结果也可以通过提前配置回调接收上传相关事件来监听。

上传文件

  1. 获取STS临时Token。操作指引请参见获取STS临时Token

  2. 声明VODSVideoUploadClient属性,不能是局部变量。

    //初始化短视频上传对象
    VODSVideoUploadClient vodsVideoUploadClient = new VODSVideoUploadClientImpl(this.getApplicationContext());
    vodsVideoUploadClient.init();
  3. 构建上传参数。

    展开查看代码

    //构建上传参数
    //参数请确保存在,如不存在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();
  4. 开始上传并设置回调。

    启动上传前需要实现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回调。回调包含上传结果的videoIdimageUrl属性。

    说明
    • 视频上传成功后会返回videoId作为视频ID,拿到videoId之后可集成阿里云播放器,使用vid+playauth的方式播放。更多信息,请参见播放器SDK

    • 图片上传完成后会返回imageUrl,开启URL鉴权后imageUrl会有过期时间。更多信息,请参见配置URL鉴权

  • 上传失败

    上传失败时,会触发onUploadFailed回调。在该回调方法中,可以通过codemessage查看具体原因,并在页面上提示。更多错误码信息,请参见错误码表OSS错误码

  • 凭证过期处理

    STS过期,会触发onSTSTokenExpired回调。在该回调方法中,可以向AppServer重新请求新的STS凭证,并调用以下方法继续上传。

    refreshSTSToken(accessKeyId,accessKeySecret,securityToken,expriedTime);
  • 超时处理

    上传超时,会触发uploadRetry回调并自动重试。在该回调方法中,可以在页面上给予提示或者调用cancel方法停止上传。此外,可以设置maxRetryCount属性,指定最大重试次数。超时重试可以继续上传时,会触发uploadRetryResume回调并恢复上传。