• 谷粒学院——Day09【整合阿里云视频点播】


    ❤ 作者主页:Java技术一点通的博客
    ❀ 个人介绍:大家好,我是Java技术一点通!( ̄▽ ̄)~*
    🍊 记得关注、点赞、收藏、评论⭐️⭐️⭐️
    📣 认真学习,共同进步!!!🎉🎉

    视频点播简介

    一、阿里云视频点播技术能力盘点

    视频点播(ApsaraVideo for VoD)是集音视频采集、编辑、上传、自动化转码处理、媒体资源管理、分发加速于一体的一站式音视频点播解决方案。
    在这里插入图片描述

    1. 应用场景

    • 音视频网站: 无论是初创视频服务企业,还是已拥有海量视频资源,可定制化的点播服务帮助客户快速搭建拥有极致观看体验、安全可靠的视频点播应用。

    • 短视频: 集音视频拍摄、特效编辑、本地转码、高速上传、自动化云端转码、媒体资源管理、分发加速、播放于一体的完整短视频解决方案。目前已帮助1000+APP快速实现手机短视频功能。

    • 直播转点播: 将直播流同步录制为点播视频,用于回看。并支持媒资管理、媒体处理(转码及内容审核/智能首图等AI处理)、内容制作(云剪辑)、CDN分发加速等一系列操作。

    • 在线教育: 为在线教育客户提供简单易用、安全可靠的视频点播服务。可通过控制台/API等多种方式上传教学视频,强大的转码能力保证视频可以快速发布,覆盖全网的加速节点保证学生观看的流畅度。防盗链、视频加密等版权保护方案保护教学内容不被窃取。

    • 视频生产制作: 提供在线可视化剪辑平台及丰富的OpenAPI,帮助客户高效处理、制作视频内容。除基础的剪切拼接、混音、遮标、特效、合成等一系列功能外,依托云剪辑及点播一体化服务还可实现标准化、智能化剪辑生产,大大降低视频制作的槛,缩短制作时间,提升内容生产效率。

    • 内容审核: 应用于短视频平台、传媒行业审核等场景,帮助客户从从语音、文字、视觉等多维度精准识别视频、封面、标题或评论的违禁内容进行AI智能审核与人工审核。

    2. 功能介绍

    在这里插入图片描述
     

    二、开通视频点播云平台

    1. 选择视频点播服务

    产品->企业应用->视频云->视频点播

    2. 开通视频点播

    在这里插入图片描述

    3. 选择按使用流量计费

    在这里插入图片描述

    4. 资费说明

    https://www.aliyun.com/price/product?spm=a2c4g.11186623.2.12.7fbd59b9vmXVN6#/vod/detail

    5. 整体流程

    使用视频点播实现音视频上传、存储、处理和播放的整体流程如下:
    在这里插入图片描述

    • 用户获取上传授权。
    • VoD下发 上传地址和凭证 及 VideoId。
    • 用户上传视频保存视频ID(VideoId)。
    • 用户服务端获取播放凭证。
    • VoD下发带时效的播放凭证。
    • 用户服务端将播放凭证下发给客户端完成视频播放。

    三、视频点播服务的基本使用

    完整的参考文档: https://help.aliyun.com/product/29932.htmlspm=a2c4g.11186623.6.540.3c356a58OEmVZJ

    1. 设置转码格式

    选择全局设置 > 转码设置,单击添加转码模板组。
    在视频转码模板组页面,根据业务需求选择封装格式和清晰度。
    或直接将已有的模板设置为默认即可
    在这里插入图片描述

    2. 分类管理

    选择全局设置 > 分类管理

    3. 上传视频文件

    选择媒资库 > 音视频,单击上传音视频
    在这里插入图片描述

    4. 在控制台查看视频

    此时视频可以在阿里云控制台播放

    5. 获取web播放器代码

    在这里插入图片描述
     
    在这里插入图片描述
     


    使用服务端SDK

    一、服务端SDK

    1. 简介

    sdk的方式将api进行了进一步的封装,不用自己创建工具类。
    我们可以基于服务端SDK编写代码来调用点播API,实现对点播产品和服务的快速操作。

    2. 功能介绍

    • SDK封装了对API的调用请求和响应,避免自行计算较为繁琐的 API签名。
    • 支持所有点播服务的API,并提供了相应的示例代码。
    • 支持7种开发语言,包括:Java、Python、PHP、.NET、Node.js、Go、C/C++。
    • 通常在发布新的API后,我们会及时同步更新SDK,所以即便您没有找到对应API的示例代码,也可以参考旧的示例自行实现调用。

    二、使用SDK

    1. 安装

    参考文档:https://help.aliyun.com/document_detail/57756.html
    service_vod 模块的 pom.xml 中引入依赖:

        
            
                com.aliyun
                aliyun-java-sdk-core
            
            
                com.aliyun.oss
                aliyun-sdk-oss
            
            
                com.aliyun
                aliyun-java-sdk-vod
            
            
                com.aliyun
                aliyun-sdk-vod-upload
            
            
                com.alibaba
                fastjson
            
            
                org.json
                json
            
            
                com.google.code.gson
                gson
            
    
            
                joda-time
                joda-time
            
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    在这里插入图片描述
     

    2. 初始化

    参考文档:https://help.aliyun.com/document_detail/61062.html
    创建 InitObject 类:

    public class InitObject {
        public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
            String regionId = "cn-shanghai";  // 点播服务接入区域
            DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
            DefaultAcsClient client = new DefaultAcsClient(profile);
            return client;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

     


    三、创建测试用例

    参考文档:https://help.aliyun.com/document_detail/61064.html

    1. 获取视频播放地址

        public static void main(String[] args) throws ClientException {
            //根据视频id获取视频播放地址
            //创建初始化对象
            DefaultAcsClient client =InitObject.initVodClient("LTAI5tHxdu7qdqnz8kEVAd7fYc", "vlhzalqMhVeQcZVdqaqvHn4hGudffEL7EC");
    
            // 创建获取视频地址request和response
            GetPlayInfoResponse response = new GetPlayInfoResponse();
            GetPlayInfoRequest request=new GetPlayInfoRequest();
    
            //向request对象里面设置视频id
            request.setVideoId("ac503dcba4d3474e90743f110eab3a2b");
    
            //调用初始化对象里面的方法,传递request,获取数据
            response = client.getAcsResponse(request);
            List playInfoList = response.getPlayInfoList();
    
            //播放地址
            for (GetPlayInfoResponse.PlayInfo playInfo : playInfoList) {
                System.out.print("PlayInfo.PlayURL = " + playInfo.getPlayURL() + "\n");
            }
    
            //Base信息
            System.out.print("VideoBase.Title = " + response.getVideoBase().getTitle() + "\n");
    
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

     

    2. 获取视频播放凭证

     public static void main(String[] args) throws ClientException {
            //根据视频id获取视频播放凭证
            //创建初始化对象
            DefaultAcsClient client =InitObject.initVodClient("LTAI5tHxddqu7qnz8kEVAd7fYc", "vlhzalqMhVeQcdqZVvHn4hGudffEL7EC");
    
            // 创建获取视频凭证request和response
            GetVideoPlayAuthRequest request = new GetVideoPlayAuthRequest();
            GetVideoPlayAuthResponse response = new GetVideoPlayAuthResponse();
    
            //向request对象里面设置视频id
            request.setVideoId("ac503dcba4d3474e90743f110eab3a2b");
    
            //调用初始化对象里面的方法,传递request,获取凭证
            response = client.getAcsResponse(request);
    
            //播放凭证
            System.out.print("PlayAuth = " + response.getPlayAuth() + "\n");
    
            //VideoMeta信息
            System.out.print("VideoMeta.Title = " + response.getVideoMeta().getTitle() + "\n");
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

     

    3. 上传视频

    public static void main(String[] args) throws ClientException {
            String accessKeyId = "LTAI5tHxdu7qnz8kEVAd7fYc";
            String accessKeySecret = "vlhzalqMhdqVeQcZVvHn4hGudffEL7EC";
    
            String title = "6 - What If I Want to Move Faster - upload by sdk";   //上传之后文件名称
            String fileName = "D:/6 - What If I Want to Move Faster.mp4";  //本地文件路径和名称
            //上传视频的方法
            UploadVideoRequest request = new UploadVideoRequest(accessKeyId, accessKeySecret, title, fileName);
            /* 可指定分片上传时每个分片的大小,默认为2M字节 */
            request.setPartSize(2 * 1024 * 1024L);
            /* 可指定分片上传时的并发线程数,默认为1,(注:该配置会占用服务器CPU资源,需根据服务器情况指定)*/
            request.setTaskNum(1);
    
            UploadVideoImpl uploader = new UploadVideoImpl();
            UploadVideoResponse response = uploader.uploadVideo(request);
    
            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");
            }
    
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

     


    添加小节上传视频

    一、后端实现

    service 模块中新建子模块 service_vod

    1. 引入依赖

    pom.xml

    
            
                com.aliyun
                aliyun-java-sdk-core
            
            
                com.aliyun.oss
                aliyun-sdk-oss
            
            
                com.aliyun
                aliyun-java-sdk-vod
            
            
                com.aliyun
                aliyun-sdk-vod-upload
            
            
                com.alibaba
                fastjson
            
            
                org.json
                json
            
            
                com.google.code.gson
                gson
            
    
            
                joda-time
                joda-time
            
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    2. 配置文件

    application.properties

    # 服务端口
    server.port=8003
    # 服务名
    spring.application.name=service-vod
    
    # 环境设置:dev、test、prod
    spring.profiles.active=dev
    
    #阿里云 vod
    #不同的服务器,地址不同
    aliyun.vod.file.keyid=.....
    aliyun.vod.file.keysecret=.....
    
    # 最大上传单个文件大小:默认1M
    spring.servlet.multipart.max-file-size=1024MB
    # 最大置总上传的数据大小 :默认10M
    spring.servlet.multipart.max-request-size=1024MB
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    3. 启动类

    @SpringBootApplication(exclude = DataAccessResourceFailureException.class)
    @ComponentScan(basePackages = {"com.atguigu"})
    public class VodApplication {
        public static void main(String[] args) {
            SpringApplication.run(VodApplication.class,args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4. controller层

    @RestController
    @CrossOrigin
    @RequestMapping("/eduvod/video")
    public class VodController {
    
        @Autowired
        private VodService vodService;
    
        // 上传视频到阿里云
        @PostMapping("uploadAliyunVideo")
        public R uploadAliyunVideo(MultipartFile file) {
            // 返回上传视频id
            String videoId = vodService.uploadVideoAly(file);
            return R.ok().data("videoId", videoId);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    5. 工具类

    @Component
    public class ConstantVodUtils implements InitializingBean {
    
        @Value("${aliyun.vod.file.keyid}")
        private String keyId;
    
        @Value("${aliyun.vod.file.keysecret}")
        private String keySecret;
    
        public static String ACCESS_KEY_ID;
    
        public static String ACCESS_KEY_SECRET;
    
        @Override
        public void afterPropertiesSet() throws Exception {
            ACCESS_KEY_ID = keyId;
            ACCESS_KEY_SECRET = keySecret;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    6. service层

    • VodService

      public interface VodService {
          // 上传视频到阿里云
          String uploadVideoAly(MultipartFile file);
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • VodServiceImpl

      @Service
      public class VodServiceImpl implements VodService {
      
          // 上传视频到阿里云
          @Override
          public String uploadVideoAly(MultipartFile file) {
              try {
                  //accessKeyId, accessKeySecret
                  //fileName:上传文件原始名称
                  // 01.03.09.mp4
                  String fileName = file.getOriginalFilename();
      
                  //title:上传之后显示名称
                  String title = fileName.substring(0, fileName.lastIndexOf("."));
      
                  //inputStream:上传文件输入流
                  InputStream inputStream = file.getInputStream();
                  UploadStreamRequest request = new UploadStreamRequest(ConstantVodUtils.ACCESS_KEY_ID,ConstantVodUtils.ACCESS_KEY_SECRET, title, fileName, inputStream);
      
                  UploadVideoImpl uploader = new UploadVideoImpl();
                  UploadStreamResponse response = uploader.uploadStream(request);
      
                  String videoId = null;
                  if (response.isSuccess()) {
                      videoId = response.getVideoId();
                  } else { //如果设置回调URL无效,不影响视频上传,可以返回VideoId同时会返回错误码。其他情况上传失败时,VideoId为空,此时需要根据返回错误码分析具体错误原因
                      videoId = response.getVideoId();
                  }
                  return videoId;
              }catch(Exception e) {
                  e.printStackTrace();
                  return null;
              }
          }
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36

    7. Swagger测试

    启动项目,访问:http://localhost:8003/swagger-ui.html
    在这里插入图片描述
     
    在这里插入图片描述
     
    在这里插入图片描述
     


    二、配置nginx反向代理

    • 将接口地址加入nginx配置:

           location ~ /eduvod/ {
                                proxy_pass http://localhost:8003;
                          }
      
      • 1
      • 2
      • 3
    • 配置nginx上传文件大小,否则上传时会有 413 (Request Entity Too Large) 异常

    • 打开nginx主配置文件nginx.conf,找到http{},添加

      client_max_body_size 1024m;
      
      • 1
    • 重启nginx

      nginx -s reload
      
      • 1

    三、前端实现

    1. 定义数据

     fileList: [], //上传文件列表
    BASE_API: process.env.BASE_API // 接口API地址
    
    • 1
    • 2

    2. 整合上传组件

     
                
                    上传视频
                    
                    
    最大支持1G,
    支持3GP、ASF、AVI、DAT、DV、FLV、F4V、
    GIF、M2T、M4V、MJ2、MJPEG、MKV、MOV、MP4、
    MPE、MPG、MPEG、MTS、OGG、QT、RM、RMVB、
    SWF、TS、VOB、WMV、WEBM 等视频格式上传
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    3. methods方法

    // 上传视频成功调用的方法
        handleVodUploadSuccess(response, file, fileList) {
            // 上传视频id赋值
            this.video.videoSourceId = response.data.videoId
            // 上传视频名称赋值
            this.video.videoOriginalName = file.name
        },
    
        //视频上传多于一个视频
        handleUploadExceed(files, fileList) {
            this.$message.warning('想要重新上传视频,请先删除已上传的视频')
        },
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4. 测试

    在这里插入图片描述
     
    在这里插入图片描述
     
    在这里插入图片描述
     
    在这里插入图片描述
     


    删除视频功能

    文档:服务端SDK->Java SDK->媒资管理
    https://help.aliyun.com/document_detail/61065.htmlspm=a2c4g.11186623.6.831.654b3815cIxvma#h2–div-id-deletevideo-div-7

    一、后端实现

    1. 初始化

    public class InitVodClient {
        public static DefaultAcsClient initVodClient(String accessKeyId, String accessKeySecret) throws ClientException {
            String regionId = "cn-shanghai";  // 点播服务接入区域
            DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
            DefaultAcsClient client = new DefaultAcsClient(profile);
            return client;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2. controller层

    // 根据视频id删除阿里云视频
        @DeleteMapping("removeAlyVideo/{id}")
        public R removeAlyVideo(@PathVariable String id){
            try {
                //初始化对象
                DefaultAcsClient client = InitVodClient.initVodClient(ConstantVodUtils.ACCESS_KEY_ID, ConstantVodUtils.ACCESS_KEY_SECRET);
    
                //创建删除视频的request对象
                DeleteVideoRequest request=new DeleteVideoRequest();
    
                //向request设置删除的视频id
                request.setVideoIds(id);
                client.getAcsResponse(request);
                return R.ok();
            }catch (Exception e){
                e.printStackTrace();
                throw new GuliException(20001,"删除视频失败");
            }
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    二、前端实现

    1. 定义api

    //删除视频
      deleteAliyunvod(id) {
        return request({
          url: '/eduvod/video/removeAlyVideo/' + id,
          method: 'delete'
        })
      }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2. methods方法

    //点击确定调用的方法
        handleVodRemove() {
          //调用接口的删除视频的方法
          video.deleteAliyunvod(this.video.videoSourceId).then((response) => {
            //提示信息
            this.$message({
              type: "success",
              message: "删除视频成功!",
            });
            //把文件列表清空
            this.fileList = [];
            //把video视频id和视频名称值清空
            //上传视频id赋值
            this.video.videoSourceId = "";
            //上传视频名称赋值
            this.video.videoOriginalName = "";
          });
        },
        //点击×调用这个方法
        beforeVodRemove(file, fileList) {
          return this.$confirm(`确定移除 ${file.name}?`);
        },
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    3. 测试

    已有的数据:
    在这里插入图片描述
     
    在这里插入图片描述
     
    在这里插入图片描述
     
    点击删除阿里云视频:

    在这里插入图片描述
     
    在这里插入图片描述
     
    在这里插入图片描述
     
    在这里插入图片描述
     
    在这里插入图片描述

     
     
    创作不易,如果有帮助到你,请给文章点个赞和收藏,让更多的人看到!!!
    关注博主不迷路,内容持续更新中。

  • 相关阅读:
    CISO 需考虑的五项 Kubernetes 安全措施
    1.8-11:图像旋转
    数据分析入门指南:从基础概念到实际应用(一)
    Python 迭代器与生成器
    2019年1+X 证书 Web 前端开发中级理论考试题目原题+答案——第二套
    Java JSP JAVAweb在线考试系统源码网上考试系统源码(ssm考试管理系统)
    RabbitMQ-02(docker安装、RabbitMQ的角色分类、AMQP、消息确认机制ACK)
    【第200篇原创文章】解决低于1%概率出现的芯片VPSS模块跑飞的问题
    Element Plus table formatter函数返回html内容
    MQTT的认识(1)
  • 原文地址:https://blog.csdn.net/m0_52691962/article/details/127840747