zoukankan      html  css  js  c++  java
  • 阿里云获取视频资源时长

    阿里云oss授权访问文档示例地址
    阿里云没有提供直接的获取是视频时长的API接口,需要曲线处理

    1、引入阿里云oss pom

      <dependency>
                <groupId>com.aliyun.oss</groupId>
                <artifactId>aliyun-sdk-oss</artifactId>
                <version>3.10.2</version>
     </dependency>
    

    阿里云工具类

    /**
     *  @author ful
     */
    @Component
    @Slf4j
    public class AliOSSUtil {
    
        // endpoint 访问OSS的域名
        @Value("${oss.agora.endpoint}")
        public String endpoint;
        // accessKeyId和accessKeySecret OSS的访问密钥
        @Value("${oss.agora.id}")
        public String accessKeyId;
        @Value("${oss.agora.secret}")
        public String accessKeySecret;
        // Bucket 用来管理所存储Object的存储空间
        @Value("${oss.agora.bucket}")
        public String bucketName;
        @Value("${oss.agora.region}")
        public String region;
        @Value("${oss.agora.vendor}")
        public String vendor;
        @Value("${oss.agora.cdn}")
        public String cdn;
    
        /**
         * 文件直传
         *
         * @param objectKey   上传路径
         * @param inputStream 上传流
         * @throws RuntimeException
         */
        public void fileUpload(String objectKey, InputStream inputStream) throws RuntimeException {
            Map map = getCommon(objectKey);
            OSS ossClient = null;
            try {
                ossClient = (OSS) map.get(0);
                AliOssPublicEntity model = (AliOssPublicEntity) map.get(1);
                if (ossClient.doesObjectExist(model.getBucketName(), model.getObjectKey())) {
                    log.error("此文件重名,请更改文件名重试!");
                    throw new RuntimeException("此文件重名,请更改文件名重试!");
                }
                PutObjectRequest putObjectRequest = new PutObjectRequest(model.getBucketName(), model.getObjectKey(), inputStream);
                PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);
                String eTag = putObjectResult.getETag();
                if (StringUtils.isBlank(eTag)) {
                    log.error("文件直传失败!");
                    throw new RuntimeException("文件直传失败");
                }
            } catch (Exception e) {
                log.error("文件直传失败,exp={}", e);
                throw new RuntimeException("文件直传失败:" + e.getMessage());
            } finally {
                ossClient.shutdown();
                try {
                    inputStream.close();
                } catch (IOException e) {
                    log.error("关闭文件流异常={}", e);
                }
            }
        }
    
        /**
         * OSS获取下载签名URL
         *
         * @param objectKey 文件对象key
         * @return 签名URL
         */
        public String getOssObjectDownAuthUrl(String objectKey) throws RuntimeException {
            Map map = getCommon(objectKey);
            OSS ossClient = null;
            try {
                ossClient = (OSS) map.get(0);
                AliOssPublicEntity model = (AliOssPublicEntity) map.get(1);
                GeneratePresignedUrlRequest req =
                        new GeneratePresignedUrlRequest(model.getBucketName(), model.getObjectKey(), HttpMethod.GET);
                //这里设置签名在30小时后过期
                Date expiration = new Date(new Date().getTime() + 30L * 60L * 60L * 1000);// 生成URL
    //            Date expireDate = new Date(System.currentTimeMillis() + 30L * 60L * 60L * 1000L);
                req.setExpiration(expiration);
                URL url = ossClient.generatePresignedUrl(req);
                String urlStr = url.toString();
                return urlStr;
            } catch (Exception e) {
                log.error("getOssObjectDownAuthUrl 获取下载签名URL失败,exp={}", e);
                throw new RuntimeException("获取下载签名URL失败");
            } finally {
                ossClient.shutdown();
            }
        }
    
        /**
         * OSS获取下载签名URL
         *
         * @param objectKey  文件对象key
         * @param expireTime 当前时间加多少毫秒后过期,过期时间(毫秒)
         * @return 签名URL
         */
        public String getOssObjectDownAuthUrl(String objectKey, long expireTime) throws RuntimeException {
            Map map = getCommon(objectKey);
            OSS ossClient = null;
            try {
                ossClient = (OSS) map.get(0);
                AliOssPublicEntity model = (AliOssPublicEntity) map.get(1);
                GeneratePresignedUrlRequest req =
                        new GeneratePresignedUrlRequest(model.getBucketName(), model.getObjectKey(), HttpMethod.GET);
                //这里设置签名在半个小时后过期
                Date expireDate = new Date(System.currentTimeMillis() + expireTime);
                req.setExpiration(expireDate);
                URL url = ossClient.generatePresignedUrl(req);
                String urlStr = url.toString();
                return urlStr;
            } catch (Exception e) {
                log.error("getOssObjectDownAuthUrl long获取下载签名URL失败,exp={}", e);
                throw new RuntimeException("获取下载签名URL失败");
            } finally {
                ossClient.shutdown();
            }
        }
    
        /**
         * OSS获取上传签名URL
         *
         * @param objectKey 文件对象key
         * @return 签名URL
         */
        public String getOssObjectUploadAuthUrl(String objectKey) throws RuntimeException {
            Map map = getCommon(objectKey);
            OSS ossClient = null;
            try {
                ossClient = (OSS) map.get(0);
                AliOssPublicEntity model = (AliOssPublicEntity) map.get(1);
                if (ossClient.doesObjectExist(model.getBucketName(), model.getObjectKey())) {
                    throw new RuntimeException("此文件重名,请更改文件名重试!");
                }
                Date expirationTime = new Date(System.currentTimeMillis() + 30L * 60L * 1000L);
                GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(model.getBucketName(), model.getObjectKey(), HttpMethod.PUT);
                request.setExpiration(expirationTime);
                //必须要!!!!!!,而且前端上传时,也需要在header里面设置,content-type为"application/octet-stream"
                request.setContentType("application/octet-stream");
                URL url = ossClient.generatePresignedUrl(request);
                String urlstr = url.toString();
                return urlstr;
            } catch (Exception e) {
                log.error("getOssObjectDownAuthUrl long获取上传签名URL失败,exp={}", e);
                throw new RuntimeException("获取上传签名URL失败" + e.getMessage());
            } finally {
                ossClient.shutdown();
            }
        }
    
        /**
         * 删除存储对象
         *
         * @param objectKey 文件对象key
         * @return 签名URL
         */
        public void deleteObject(String objectKey) throws RuntimeException {
            Map map = getCommon(objectKey);
            OSS ossClient = null;
            try {
                ossClient = (OSS) map.get(0);
                AliOssPublicEntity model = (AliOssPublicEntity) map.get(1);
                // 指定对象所在的存储桶
                ossClient.deleteObject(model.getBucketName(), model.getObjectKey());
            } catch (RuntimeException clientException) {
                log.error("deleteObject 删除存储对象失败,exp={}", clientException);
                throw new RuntimeException("删除存储对象失败");
            } finally {
                ossClient.shutdown();
            }
        }
    
        /**
         * 绝对路径更换为相对路径
         *
         * @param url 绝对路径
         * @return 相对路径
         */
        public String getRelativePath(String url) {
            url = url.substring(url.indexOf(".com") + 5, url.indexOf("?"));
            return url;
        }
    
        /**
         * client公共参数
         *
         * @param objectKey
         * @return
         */
        private Map getCommon(String objectKey) {
            AliOssPublicEntity entity = AliOssPublicEntity.build(objectKey, endpoint, accessKeyId, accessKeySecret, bucketName);
            OSS ossClient = new OSSClientBuilder().build(entity.getEndpoint(), entity.getAccessKeyId(), entity.getAccessKeySecret());
            Map map = new HashMap();
            map.put(0, ossClient);
            map.put(1, entity);
            return map;
        }
    }
    
    

    阿里云配置类

    @Data
    public class AliOssPublicEntity {
    
        private String endpoint;
    
        private String accessKeyId;
    
        private String accessKeySecret;
    
        private String bucketName;
    
        private String objectKey;
    
        public static AliOssPublicEntity build(String objectKey,String endpoint,String accessKeyId,
                                               String accessKeySecret,String bucketName) {
            AliOssPublicEntity entity = new AliOssPublicEntity();
            entity.setEndpoint(endpoint);
            entity.setAccessKeyId(accessKeyId);
            entity.setAccessKeySecret(accessKeySecret);
            entity.setBucketName(bucketName);
            entity.setObjectKey(objectKey);
            return entity;
        }
    }
    

    阿里云根据资源路径获取资源时长代码

     public int getVideoDuration(String videoUrl) {
            if (StringUtils.isNotEmpty(videoUrl) && "m3u8".equals(videoUrl.substring(videoUrl.length() - 4))) {
                try {
                    videoUrl = aliOSSUtil.getOssObjectDownAuthUrl(videoUrl);
                    log.info("getVideoDuration:aliOSSUtil.videoUrl ={}", videoUrl);
                    HttpRequest httpRequest = HttpRequest.get(videoUrl)
                            .timeout(30000);
                    log.info("getRequest httpRequest:{}", httpRequest);
                    HttpResponse res = httpRequest.execute();
                    String result = res.body();
                    String pattern = "\\d+[.]\\d+";
                    List<String> matchStrs = new ArrayList<>();
                    Pattern r = Pattern.compile(pattern);
                    Matcher m = r.matcher(result);
                    while (m.find()) { //此处find()每次被调用后,会偏移到下一个匹配
                        matchStrs.add(m.group());//获取当前匹配的值
                    }
                    Double durationDouble = 0.0;
                    for (int i = 0; i < matchStrs.size(); i++) {
                        durationDouble += Double.parseDouble(matchStrs.get(i));
                    }
                    log.info("LiveDetailController.getVideoDuration->duration=", durationDouble.intValue());
                    return durationDouble.intValue();
                } catch (Exception e) {
                    log.error("getVideoDuration 异常={}", e);
                }
            }
            return 0;
        }
    

    这里需要注意:
    HttpRequest httpRequest = HttpRequest.get(videoUrl) .timeout(30000);请求是一定不要加 .header(“Content-Type”, “application/json”) 头,不然会验证签名失败

  • 相关阅读:
    Vue.Draggable实现拖拽效果(快速使用)
    1.从面向过程到面向对象的过渡
    微信支付流程
    2.js原型的基本概念
    POST和GET请求的区别
    vue-router2.0
    vue列表渲染,以及鼠标点击改变样式的问题
    复杂数组结构的深拷贝
    高德地图将字符串地址转为经纬度的一个demo
    数组对象排序
  • 原文地址:https://www.cnblogs.com/flgb/p/15775204.html
Copyright © 2011-2022 走看看