阿里云获取视频时长

阿里云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”) 头,不然会验证签名失败

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
阿里云OSS视频直传是一种将视频文件直接上传到阿里云OSS的方法。根据提供的引用内容,有两个主要步骤可以帮助您实现阿里云OSS视频直传。 第一步是创建签名。根据引用中提供的链接,可以找到阿里云官方文档中关于JavaScript客户端签名直传的详细说明。这个方法适用于通过JavaScript直接与阿里云服务器进行交互。您可以按照文档中的指导,使用JavaScript生成签名并将其与视频文件一起发送到阿里云OSS。 第二步是在Vue页面中使用视频直传功能。根据引用中提供的代码片段,您可以在Vue页面中使用el-upload组件来实现视频的上传功能。通过设置合适的属性和事件处理程序,您可以将视频文件直接上传到阿里云OSS,并获取上传后的视频URL。 请注意,以上仅是提供了一种实现阿里云OSS视频直传的方法。根据您的具体需求和情况,可能还需要进行其他设置和逻辑处理。如果您遇到任何问题或需要更多帮助,请参考阿里云官方文档或咨询阿里云技术支持。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vue element-ui的直传视频到阿里云oss(亲测有效)](https://blog.csdn.net/qq_38997036/article/details/107591742)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [阿里云oss视频上传及预览图汇总](https://blog.csdn.net/weixin_43816501/article/details/122264881)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值