当前位置: 首页 > news >正文

Java:将视频上传到腾讯云并通过腾讯云点播播放

功能需求:

传入一个videoFile也就是视频字节流,返回腾讯云点播的视频保存url

需要在腾讯云中寻找的配置信息:

导入的依赖:

<!--腾讯云点播--><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId><version>4.0.11</version></dependency><!--腾讯云cos--><dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId><version>5.6.54</version></dependency>

大体分为两步:


1.将视频上传到腾讯云

我们借助腾讯云依赖提供的cos客户端,将腾讯云的id,秘钥等配置信息传入,再将文件信息配置到cos客户端,发送请求,生成这个视频的访问路径

2.腾讯云点播保存腾讯云中我们刚刚上传的视频并返回一个播放改视频的url

同理,借助VOD客户端上传对应视频

全部源代码

package net.mingsoft.cms.biz.impl;import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.ObjectMetadata;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.region.Region;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.vod.v20180717.VodClient;
import com.tencentcloudapi.vod.v20180717.models.*;
import net.mingsoft.base.biz.impl.BaseBizImpl;
import net.mingsoft.base.dao.IBaseDao;
import net.mingsoft.cms.biz.IVideoBiz;
import net.mingsoft.cms.dao.IVideoDao;
import net.mingsoft.cms.entity.VideoEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;/*** 视频管理服务实现类(集成COS上传与云点播同步)* 提供视频上传到腾讯云COS并同步到云点播服务功能*/
@Service("cmsVideoBizImpl")
public class VideoBizImpl extends BaseBizImpl<IVideoDao, VideoEntity> implements IVideoBiz {private static final Logger log = LoggerFactory.getLogger(VideoBizImpl.class);// 腾讯云配置信息 - 需要从配置文件或环境变量中获取private static final String SECRET_ID = "YOUR_TENCENT_CLOUD_SECRET_ID";private static final String SECRET_KEY = "YOUR_TENCENT_CLOUD_SECRET_KEY";private static final String BUCKET_NAME = "your-bucket-name";private static final String BUCKET_REGION = "ap-region-1";private static final String COS_DOMAIN = "your-bucket.cos.ap-region-1.myqcloud.com";// 云点播配置private static final String VOD_REGION = "ap-region-1";private static final Long VOD_SUB_APP_ID = 1000000L;/*** 上传视频文件到腾讯云并同步到云点播* @param videoFile 视频文件* @return 云点播播放URL* @throws IOException 文件读取异常*/@Overridepublic String uploadVideo(MultipartFile videoFile) throws IOException {// 1. 初始化COS客户端COSCredentials cosCred = new BasicCOSCredentials(SECRET_ID, SECRET_KEY);ClientConfig clientConfig = new ClientConfig(new Region(BUCKET_REGION));clientConfig.setHttpProtocol(HttpProtocol.https);try (COSClient cosClient = new COSClient(cosCred, clientConfig)) {// 2. 处理文件信息String originalFilename = videoFile.getOriginalFilename();String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));// 添加目录前缀便于管理String newFileName = "videos/" + UUID.randomUUID() + fileExtension;// 3. 上传文件到COStry (InputStream inputStream = videoFile.getInputStream()) {ObjectMetadata metadata = new ObjectMetadata();metadata.setContentLength(videoFile.getSize());metadata.setContentType(videoFile.getContentType());PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME,newFileName,inputStream,metadata);cosClient.putObject(putObjectRequest);}log.info("视频已成功上传到COS,路径:{}", newFileName);// 4. 生成COS访问URLString cosUrl = "https://" + COS_DOMAIN + "/" + newFileName;// 5. 同步到云点播并获取播放链接String playUrl = syncToVod(cosUrl, originalFilename);log.info("视频已成功同步到云点播,播放URL: {}", playUrl);return playUrl;} catch (TencentCloudSDKException e) {log.error("云点播API调用失败", e);throw new RuntimeException("视频处理失败:" + e.getMessage());}}/*** 将COS视频同步到云点播并获取播放链接* @param cosUrl COS视频URL* @param originalFilename 原始文件名* @return 云点播播放URL*/private String syncToVod(String cosUrl, String originalFilename) throws TencentCloudSDKException {// 1. 初始化VOD客户端Credential cred = new Credential(SECRET_ID, SECRET_KEY);HttpProfile httpProfile = new HttpProfile();httpProfile.setEndpoint("vod.tencentcloudapi.com");ClientProfile clientProfile = new ClientProfile();clientProfile.setHttpProfile(httpProfile);try (VodClient vodClient = new VodClient(cred, VOD_REGION, clientProfile)) {// 2. 拉取上传到云点播PullUploadRequest pullRequest = new PullUploadRequest();pullRequest.setMediaUrl(cosUrl);pullRequest.setMediaName(originalFilename);pullRequest.setSubAppId(VOD_SUB_APP_ID);log.info("开始拉取上传视频到云点播,COS URL: {}", cosUrl);// 3. 执行拉取上传PullUploadResponse pullResponse = vodClient.PullUpload(pullRequest);String taskId = pullResponse.getTaskId();log.info("云点播拉取上传任务已创建,任务ID: {}", taskId);// 4. 等待任务完成并获取文件IDString fileId = waitForTaskCompletion(vodClient, taskId);if (fileId == null) {throw new RuntimeException("云点播任务处理超时或失败");}log.info("视频已成功同步到云点播,文件ID: {}", fileId);// 5. 获取播放URLreturn getPlayUrl(vodClient, fileId);}}/*** 等待云点播任务完成*/private String waitForTaskCompletion(VodClient vodClient, String taskId) throws TencentCloudSDKException {int maxRetries = 30; // 最大重试次数int retryInterval = 2000; // 重试间隔2秒for (int i = 0; i < maxRetries; i++) {try {Thread.sleep(retryInterval);DescribeTaskDetailRequest taskRequest = new DescribeTaskDetailRequest();taskRequest.setTaskId(taskId);taskRequest.setSubAppId(VOD_SUB_APP_ID);DescribeTaskDetailResponse taskResponse = vodClient.DescribeTaskDetail(taskRequest);String status = taskResponse.getStatus();if ("FINISH".equals(status)) {PullUploadTask pullUploadTask = taskResponse.getPullUploadTask();if (pullUploadTask != null) {return pullUploadTask.getFileId();} else {throw new RuntimeException("无法获取PullUploadTask信息");}} else if ("FAIL".equals(status)) {throw new RuntimeException("云点播任务处理失败");}} catch (InterruptedException e) {Thread.currentThread().interrupt();throw new RuntimeException("任务等待被中断", e);}}throw new RuntimeException("云点播任务处理超时");}/*** 获取视频播放URL*/private String getPlayUrl(VodClient vodClient, String fileId) throws TencentCloudSDKException {DescribeMediaInfosRequest mediaRequest = new DescribeMediaInfosRequest();mediaRequest.setFileIds(new String[]{fileId});mediaRequest.setSubAppId(VOD_SUB_APP_ID);DescribeMediaInfosResponse mediaResponse = vodClient.DescribeMediaInfos(mediaRequest);if (mediaResponse.getMediaInfoSet() == null || mediaResponse.getMediaInfoSet().length == 0) {throw new RuntimeException("未找到视频信息,文件ID: " + fileId);}MediaInfo mediaInfo = mediaResponse.getMediaInfoSet()[0];return mediaInfo.getBasicInfo().getMediaUrl();}/*** 获取转码后的播放URL(可选)*/private String getTranscodePlayUrl(VodClient vodClient, String fileId) throws TencentCloudSDKException {DescribeMediaInfosRequest mediaRequest = new DescribeMediaInfosRequest();mediaRequest.setFileIds(new String[]{fileId});mediaRequest.setSubAppId(VOD_SUB_APP_ID);DescribeMediaInfosResponse mediaResponse = vodClient.DescribeMediaInfos(mediaRequest);return mediaResponse.getMediaInfoSet()[0].getBasicInfo().getMediaUrl();}@Overrideprotected IBaseDao<VideoEntity> getDao() {return null;}
}

http://www.dtcms.com/a/340503.html

相关文章:

  • 【Task02】:四步构建简单rag(第一章3节)
  • 第三阶段数据-4:SqlHelper类,数据库删除,DataTable创建
  • 【考研408数据结构-08】 图论基础:存储结构与遍历算法
  • Opencv模板匹配
  • 27.语言模型
  • Java + 工业物联网 / 智慧楼宇 面试问答模板
  • C#APP.Config配置文件解析
  • 案例分享:BRAV-7123助力家用型人形机器人,智能生活未来已来
  • 项目各功能介绍
  • 今天我们学习计算机网络技术的虚拟局域网VLAN以及了解三层交换机的概念
  • 应用在运行时,向用户索取(相机、存储)等权限,未同步告知权限申请的使用目的,不符合相关法律法规要求--教你如何解决华为市场上架难题
  • leetcode 1277. 统计全为 1 的正方形子矩阵 中等
  • (nice!!!)(LeetCode 每日一题) 1277. 统计全为 1 的正方形子矩阵 (动态规划)
  • Tumblr长文运营:亚矩阵云手机助力多账号轮询与关键词布局系统
  • 亚矩阵:跨境卖家 YouTube 私域矩阵搭建的高效解决方案
  • JavaScript 性能优化实战:从原理到落地的完整指南
  • AI硬件 - 华为显卡的演进
  • 深入理解MySQL Ⅳ -- SQL性能分析工具
  • 力扣48:旋转矩阵
  • [TryHackMe]Mr Robot CTF(hydra爆破+Wordpress更改主题)
  • IPSec安全概述
  • 医疗AI与医院数据仓库的智能化升级:异构采集、精准评估与高效交互的融合方向(上)
  • 信创产品TongLinkQ安装及springboot2整合使用
  • AI 视频翻译工具的调研笔记
  • Spring Boot 实战:从项目搭建到部署优化
  • Causal-Copilot: An Autonomous Causal Analysis Agent 论文解读
  • 基于离散点集的三次样条插值与符号表达式构建:从 Scipy 到 Sympy 的完整实现
  • 记一次前端Vue3+Vite+TS项目中使用Mock.js + vite-plugin-mock插件发布到生产(线上)环境填坑汇总
  • 矩阵的特征分解
  • C语言---分隔符、常量、注释、标识符、关键字、空格