阿里雲獲取視頻資源時長


阿里雲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”) 頭,不然會驗證簽名失敗


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM