伙伴云客服论坛»论坛 S区 S零代码 查看内容

0 评论

0 收藏

分享

阿里云视频上传实战

背景说明

    最近在做项目优化,关于阿里云视频上传方面不时存在视频上传过慢问题.由于之前采用的是效劳端停止视频上传,主要的逻辑是客户端上传视频到效劳端停止视频文件暂存,然后效劳端上传视频到阿里云.上传过慢猜测是上传视频到效劳端要受到带宽的影响,决定直接采用客户端(项目是web项目)直接上传到阿里云,不经过效劳端这个环节,猜测上传速度会快一些.两种上传方案流程图如下:

阿里云视频上传实战-1.png

下面对客户端上传视频流程简要梳理,其中罗列效劳端需要支持的api

阿里云视频上传实战-2.png


    web客户端上传视频链接:https://help.aliyun.com/document_detail/52204.html,这里选择上传地址和凭证方式,也是官方推荐方式.简单对效劳端涉及接口停止简单说明:
     CreateUplOAdVideo-获取音视频上传地址和凭证:
主要作用是客户端上传api中需要效劳端传送指定的上传凭证、videoId等信息。官方文档地址:https://help.aliyun.com/document_detail/436543.html
注意返回的参数中官方文档中需要停止base解密,这里踩过坑,实际上不需要停止解密.

阿里云视频上传实战-3.png

另外上传的音视频源文件不需要绝对途径,直接用文件名.mp4即可,这里前端的小伙伴也踩过坑,不清楚怎么获取客户端盘符途径,文档的示例确实有误导.

阿里云视频上传实战-4.png


    RefreshUploadVideo - 刷新视频上传凭证:
主要作用视频文件上传超时后重新获取视频上传凭证。官方文档地址:https://help.aliyun.com/document_detail/436550.html
     GetUploadDetails - 获取媒体上传详情:
主要作用:获取媒体上传详情(如上传时间、已上传比例、上传来源等信息),用于决定前端调用获取视频播放地址接口的触发时机.就是说客户端调用阿里云上传接口响应胜利之后不代表视频上传胜利,其中可能会在转码,所以需要调用此接口查询一下上传完成的状态、上传完成的百分比或是转码是否完成。
官方地址:https://help.aliyun.com/document_detail/436548.html?spm=5176.8465980.help.dexternal.35f21450u0vJif&scm=20140722.S_help%40%40%E6%96%87%E6%A1%A3%40%40436548.S_os%2Bhot.ID_436548-RL_GetUploadDetails-LOC_consoleUNDhelp-OR_ser-V_2-P0_0
接口判断逻辑如下:

阿里云视频上传实战-5.png

关于视频转码问题,假设代码中没有关于转码的设置,一般是音视频点播控制台中停止了设置,详细查看途径如下:

阿里云视频上传实战-6.png

对播放格式无特殊要求,可以不停止转码或是仅支持部分播放格式,原因是视频上传完成之后假设有预览的需求,停止转码的时间会很长。所以调用获取视频详情接口会有问题,并非视频上传失败,而是处于转码中。
     GetPlayInfo - 获取音视频播放地址:
主要作用是用于视频播放,假设上传视频支持转码操作,会返回标清、流畅、高清等格式的视频信息。调用顺序是在GetUploadDetails - 获取媒体上传详情之后。
效劳端相关代码

客户端配置类:
  1. @Component@DatapublicclassTrainConfig{// 视频相关参数@Value("${aliyun.videoAccessKeyId}")privateString videoAccessKeyId;@Value("${aliyun.videoAccessKeySecret}")privateString videoAccessKeySecret;@Value("${aliyun.videoEndpoint}")privateString videoEndpoint;@BeanpublicClientinitUploadVideoClient()throwsException{Config config =newConfig().setAccessKeyId(videoAccessKeyId).setAccessKeySecret(videoAccessKeySecret);
  2.         config.endpoint = videoEndpoint;Client client =newClient(config);return client;}}
复制代码
配置文件:application-dev.yml
  1. aliyun:#视频上传相关参数videoAccessKeyId: xxxxxxxxxxxxxxxxxx
  2.   videoAccessKeySecret: xxxxxxxxxxxxxxxxxx
  3.   videoEndpoint: vod.cn-xxx.aliyuncs.com
复制代码
视频上传逻辑:
  1. @RequestMapping("/upload")@RestController@ValidatedpublicclassUploadFile{@AutowiredprivateClient client;@ApiOperation("根据videoId获取视频信息(视频上传胜利之后调用,响应参数说明:duration--视频时长,单位秒;playInfoList中playURL视频播放地址,支持根据不同明晰度获取)")@ApiImplicitParams({@ApiImplicitParam(name ="videoId", value ="视频videoId", required =true, dataType ="String", paramType ="query",example ="1"),})@GetMapping("/findVideoInfo")publicResultVo<com.aliyun.vod20170321.models.GetPlayInfoResponseBody>findVideoInfo(@NotBlank(message ="视频id不允许为空!")String videoId)throwsException{com.aliyun.vod20170321.models.GetPlayInfoRequest getPlayInfoRequest =newGetPlayInfoRequest().setVideoId(videoId);RuntimeOptions runtime =newRuntimeOptions();GetPlayInfoResponseBody getPlayInfoResponseBody=null;com.aliyun.vod20170321.models.GetPlayInfoResponse getPlayInfoResponse = client.getPlayInfoWithOptions(getPlayInfoRequest, runtime);if(ObjectUtil.isNotNull(getPlayInfoResponse)){
  2.             getPlayInfoResponseBody  = getPlayInfoResponse.getBody();}returnResultVoUtil.success(getPlayInfoResponseBody);}@ApiOperation("获取上传凭证(web客户端上传)")@ApiImplicitParams({@ApiImplicitParam(name ="fileName", value ="文件所在途径,示例:test2.mp4", required =true, dataType ="String", paramType ="query",example ="1"),@ApiImplicitParam(name ="title", value ="视频标题", required =true, dataType ="String", paramType ="query",example ="1"),})@GetMapping("/getUploadAuth")publicResultVogetUploadAuth(@NotBlank(message ="文件名不允许为空!")String fileName,@NotBlank(message ="视频标题不允许为空!")String title)throwsException{CreateUploadVideoRequest createUploadVideoRequest =newCreateUploadVideoRequest().setFileName(fileName).setTitle(title);RuntimeOptions runtime =newRuntimeOptions();CreateUploadVideoResponse uploadVideoWithOptions=null;try{
  3.             uploadVideoWithOptions = client.createUploadVideoWithOptions(createUploadVideoRequest, runtime);}catch(Exception _error){TeaException error =newTeaException(_error.getMessage(), _error);thrownewBussinessExcption(error.message);}CreateUploadVideoResponseBody createUploadVideoResponseBody = uploadVideoWithOptions.getBody();returnResultVoUtil.success(createUploadVideoResponseBody);}@ApiOperation("刷新上传凭证(web客户端上传)")@ApiImplicitParams({@ApiImplicitParam(name ="videoId", value ="视频id", required =true, dataType ="String", paramType ="query",example ="1"),})@GetMapping("/refreshUploadVideo")publicResultVoRefreshUploadVideo(@NotBlank(message ="videoId不允许为空!")String videoId)throwsException{RefreshUploadVideoRequest refreshUploadVideoRequest =newRefreshUploadVideoRequest().setVideoId(videoId);RuntimeOptions runtime =newRuntimeOptions();RefreshUploadVideoResponse refreshUploadVideoResponse=null;RefreshUploadVideoResponseBody refreshUploadVideoResponseBody=null;try{
  4.            refreshUploadVideoResponse = client.refreshUploadVideoWithOptions(refreshUploadVideoRequest, runtime);}catch(Exception _error){TeaException error =newTeaException(_error.getMessage(), _error);thrownewBussinessExcption(error.message);}if(ObjectUtil.isNotNull(refreshUploadVideoResponse)){
  5.            refreshUploadVideoResponseBody = refreshUploadVideoResponse.getBody();}returnResultVoUtil.success(refreshUploadVideoResponseBody);}@ApiOperation("获取视频上传详情信息(web客户端上传)Status为normal即为上传胜利")@ApiImplicitParams({@ApiImplicitParam(name ="videoId", value ="视频id", required =true, dataType ="String", paramType ="query",example ="1"),})@GetMapping("/getUploadDetails")publicResultVogetUploadDetails(@NotBlank(message ="videoId不允许为空!")String videoId)throwsException{com.aliyun.vod20170321.models.GetUploadDetailsRequest getUploadDetailsRequest =newcom.aliyun.vod20170321.models.GetUploadDetailsRequest().setMediaIds(videoId);com.aliyun.teautil.models.RuntimeOptions runtime =newcom.aliyun.teautil.models.RuntimeOptions();GetUploadDetailsResponse uploadDetailsWithOptions=null;try{
  6.             uploadDetailsWithOptions = client.getUploadDetailsWithOptions(getUploadDetailsRequest, runtime);}catch(Exception _error){TeaException error =newTeaException(_error.getMessage(), _error);thrownewBussinessExcption(error.message);}returnResultVoUtil.success(uploadDetailsWithOptions);}}
复制代码
相关依赖没有停止展示,可以直接从api调试控制台中停止复制,里面的依赖一定是最新的,官方文档更新很不及时,已经发现屡次了,也算是踩过的坑!!!官方api调试地址:https://next.api.aliyun.com/api,可以直接下载项目复制最新的依赖信息.

阿里云视频上传实战-7.png


    以上是阿里云上传视频客户端上传流程,希望对有相同需求的小伙伴有所协助!欢送评论区留言交流!

回复

举报 使用道具

全部回复
暂无回帖,快来参与回复吧
本版积分规则 高级模式
B Color Image Link Quote Code Smilies

清风未醉
注册会员
主题 14
回复 15
粉丝 0
|网站地图
快速回复 返回顶部 返回列表