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.pswp.cn/pingmian/93812.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity3D物理游戏网络同步指南

前言 Unity3D 物理游戏的网络同步是一个复杂但非常核心的话题。要实现一个流畅、公平且可扩展的多人物理游戏&#xff0c;需要深入的理解和精心的设计。 下面我将为你全面解析 Unity3D 物理游戏的网络同步&#xff0c;包括核心概念、主流方案、实现细节以及最佳实践。 对惹&…

Amazon Redshift 访问配置完整指南

概述 Amazon Redshift 是 AWS 提供的云端数据仓库服务,支持多种访问方式。本文将详细介绍如何配置 IAM 权限、使用 AWS 控制台 Query Editor v2,以及通过 SQL Workbench/J 等第三方工具连接 Redshift 集群。 目录 环境准备 IAM 权限配置 Redshift 用户管理 AWS 控制台访问 …

electron-vite_19配置环境变量

前端配罟环境变量主要通过项目根目录下的.env系列文件实现&#xff0c;不同框架(如Vue、React)或构建工具(如Vite、Webpack)的具体操作略有差异&#xff0c;但核心逻辑均为通过环境变量文件区分开发、测试、生产等环境。方案1: 直接在根目录新建.env文件 1.在根目录新建 .env.d…

【python】arange用法

1. NumPy 里的 np.arangeimport numpy as np# 语法 np.arange([start, ]stop, [step, ], dtypeNone)参数说明&#xff1a;start&#xff1a;起始值&#xff08;默认 0&#xff09;stop&#xff1a;终止值&#xff08;不包含这个值&#xff09;step&#xff1a;步长&#xff08;…

力扣1005:k次取反后最大化的数组和

力扣1005:k次取反后最大化的数组和题目思路代码题目 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&…

国产数据库管理工具 CloudDM 2.7.1.0 发布,OceanBase 等数据源支持复杂 SQL 脱敏数据

CloudDM 是 ClouGence 公司推出的面向团队使用的数据库管理工具&#xff0c;支持云上、云下、多云等多种环境&#xff0c;并且提供多达 23 种数据源的支持。CloudDM 还支持数据库 DevOps CI/CD 功能&#xff0c;将用户产品发布流程中数据库发布和程序发布无缝串联起来。 更新亮…

AI大模型实战:用自然语言处理技术高效处理日常琐事

引言在数字化时代&#xff0c;我们每天都会面对大量的琐碎事务&#xff1a;整理会议记录、处理名单数据、撰写学习笔记等等。这些工作不仅耗时&#xff0c;而且容易出错。幸运的是&#xff0c;随着人工智能技术的发展&#xff0c;特别是大语言模型&#xff08;LLM&#xff09;的…

【spring security】为什么要使用userdetailservice

Spring Security UserDetailsService 深度解析&#xff1a;从401到认证成功的完整实现 &#x1f4cb; 目录 问题背景Spring Security认证架构UserDetailsService的作用完整实现过程常见问题与解决方案最佳实践 &#x1f3af; 问题背景 在开发B2B采购平台时&#xff0c;我们…

机器学习中的数据处理技巧

一、Pandas处理丢失数据&#xff08;一&#xff09;判断缺失值​​isnull()函数​​&#xff1a;用于判断数据框&#xff08;DataFrame&#xff09;中各个单元格是否为空&#xff0c;可帮助我们识别出存在缺失数据的单元格位置。&#xff08;二&#xff09;处理缺失值的方法​​…

田野科技“一张皮”,“AI+虚拟仿真”推动考古教学创新发展

文运同国运相牵&#xff0c;文脉同国脉相连。考古不仅关系到我们对古代文化的认知、发掘、保护、利用&#xff0c;关系到考古学学科体系、学术体系、话语体系的建设&#xff0c;更是关系到我国考古学的国际影响力&#xff0c;对增强世界不同地区古代文明的比较研究有着十分重要…

为什么我的UI界面会突然卡顿,失去响应

有操作都应是“非阻塞”的&#xff0c;以确保能随时响应用户的输入。导致主线程阻塞的常见“元凶”主要涵盖五个方面&#xff1a;主线程被“长时间”的同步计算所“阻塞”、单次渲染的界面节点过多或过于复杂、内存中存在“未释放”的巨大对象或“内存泄漏”、响应了“高频率”…

大规模IP轮换对网站的影响(服务器压力、风控)

在当下的互联网环境中&#xff0c;代理IP轮换已经成为爬虫、SEO、数据采集等行业的常见手段。尤其是大规模数据抓取时&#xff0c;通过代理池实现IP轮换&#xff0c;可以有效避免因单一IP请求过于频繁而被目标网站封禁。 然而&#xff0c;大规模IP轮换虽然对采集方有利&#xf…

4. STM32 vscode 环境, 官方插件

文章目录1. 新建配置2. 安装插件3. 新建工程1. 新建配置 新建vscode 配置&#xff0c; 因为stm32插件比较多&#xff0c; 避免和其他插件冲突。 激活环境&#xff1a; 这里可快速切换&#xff1a; 2. 安装插件 可选择安装最新预览版&#xff1a; 等待依赖安装完成后重启…

【动态规划:路径问题】最小路径和 地下城游戏

最小路径和&#xff08;medium&#xff09; 64. 最小路径和 ​ 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 ​ **说明&#xff1a;**每次只能向下或者向右移动一步。 示例 1&#xff…

SQL详细语法教程(七)核心优化

以下对 SQL 优化 涉及的关键场景&#xff08;含 update 行锁优化&#xff09;进行极致详细的拆解&#xff0c;从底层原理、执行流程到实战代码、避坑指南全维度覆盖&#xff0c;搭配表格对比让逻辑更清晰&#xff1a;一、SQL 优化 - COUNT 优化1. 底层原理&#xff1a;COUNT() …

Tomcat 的核心脚本catalina.sh 和 startup.sh的关系

catalina.sh 和 startup.sh 都是 Tomcat 的核心脚本&#xff0c;但它们的角色和使用场景有所不同。以下是它们的主要区别和适用场景&#xff1a;1. 功能区别脚本主要用途底层调用关系startup.sh一个快捷入口脚本&#xff0c;用于快速启动 Tomcat&#xff08;后台模式&#xff0…

飞算JavaAI:简易贪吃蛇小游戏

目录先确定核心功能技术选型核心功能实现过程1. 数据模型设计2. 游戏界面和绘制逻辑3. 游戏主框架和事件处理飞算JavaAI在开发中的应用体验可以进一步优化的地方作为Java课程的小作业&#xff0c;不想做太复杂的管理系统&#xff0c;就选了贪吃蛇这个经典小游戏。全程用Swing做…

如何保障内部网络安全前提下,实现与外部互联网之间的文件传输?

在数字化时代&#xff0c;企业网络环境日益复杂&#xff0c;普遍采用“内外网隔离”的安全架构&#xff1a;内部办公网承载业务系统与数据&#xff0c;外部互联网则用于对外沟通与信息获取。这种隔离有效抵御了外部攻击&#xff0c;但也带来了“信息孤岛”问题——如何在保障内…

计算机视觉 图片处理 在骨架化过程中,每次迭代都会从图像的边缘移除一层像素,直到只剩下单像素宽度的骨架

你说得对&#xff0c;if cv2.countNonZero(binary) 0: break 这个条件确实表示图像中已经没有非零像素&#xff0c;即图像完全变为空白。这并不是骨架化完成的标志&#xff0c;而是表示图像已经被腐蚀到没有任何内容了。 在骨架化过程中&#xff0c;我们需要一个更合适的停止条…

rt-thread audio框架移植stm32 adc+dac,用wavplayer录音和播放

D1 参考 rt-thread官方sdk中&#xff0c;正点原子stm32f429-atk-appollo的board中有audio文件夹&#xff0c;包括了mic/play的程序&#xff0c;wm8978的库文件因为我们基于stm32h750内置adcdac设计&#xff0c;所以不需要wm8978.c/h。只需要移植drv_sound.c和drv_mic.c D2 工程…