IM腾讯Trtc与vod云点播:实现合流录制并上传,根据参数返回视频地址
全文目录,一步到位
- 1.前言简介
- 1.1 专栏传送门
- 1.1.1 文档传送门
- 2. java基础使用
- 2.1 准备工作
- 2.1.1 云控制台获取(密钥和密钥secret)
- 2.1.2 找到trtc控制台
- 2.1.3 vod云点播控制台
- 2.2 使用准备的数据进行操作
- 2.2.0 引入依赖
- 2.2.1 创建TrtcUtils工具类
- 2.2.2 TrtcReqDTO 录制请求dto
- 2.2.3 TrtcCommonReqDto 请求dto
- 2.2.4 OrderTrtcVideo 数据库存储实体类
- 2.2.5 获取用户usersig(旧版)
- 2.3 业务使用方式
- 2.3.0 json传递数据
- 2.3.1 创建service方法
- 2.3.2 TrtcServiceImpl 实现类
- 2.3.4 上传后视频效果
- 3. 文章的总结与预告
- 3.1 本文总结
- 3.2 代码指正
1.前言简介
腾讯trtc
合流模式
使用 如果时单流 可在控制台直接设置
1.1 专栏传送门
1.1.1 文档传送门
===> 传送门: api文档-官网地址
2. java基础使用
2.1 准备工作
2.1.1 云控制台获取(密钥和密钥secret)
===> 腾讯云控制台登录 传送门<===
如图所示
2.1.2 找到trtc控制台
===> im控制台 传送门 <===
创建sdkAppId 开通需要的服务
2.1.3 vod云点播控制台
===> vod云点播控制台地址
- 创建视频生成模板
- 创建任务流绑定视频模板
--------> 如图所示
2.2 使用准备的数据进行操作
2.2.0 引入依赖
trtc包和vod包
源码位置: 源码gitee地址
<!-- # 版本在maven生效需要时间,如获取不到对应的版本,可以调低版本号--><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java-trtc</artifactId><version>3.1.1218</version></dependency><!-- # 版本在maven生效需要时间,如获取不到对应的版本,可以调低版本号--><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java-vod</artifactId><version>3.1.1212</version></dependency>
2.2.1 创建TrtcUtils工具类
缺少的包可以忽略 删除都可以
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import com.google.common.base.Objects;
import com.tencentcloudapi.common.AbstractModel;
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.trtc.v20190722.TrtcClient;
import com.tencentcloudapi.trtc.v20190722.models.*;
import com.tencentcloudapi.vod.v20180717.VodClient;
import com.tencentcloudapi.vod.v20180717.models.*;import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.utils.Lists;
import org.springframework.util.CollectionUtils;import java.util.List;/*** trtc工具类* 这里的常量就不大写了* @author pzy* @version 0.1.1*/
@Slf4j
public class TrtcUtils {/*** 密钥key*/private static final String secretId = "";/*** 密钥secret*/private static final String secretKey = "";/*** 请求节点*/private static final String trtcEndPoint = "trtc.tencentcloudapi.com";/*** sdk 的 appid*/public static final String SDKAppID = "";//vod-------------------------------------------------------->private static final String vodEndPoint = "vod.tencentcloudapi.com";/*** vod任务模板名称*/public static final String vodTaskTemplateName = "";/*** vod的subAppId*/public static final Long vodSubAppId = ;/*** 0. 获取trtc客户端对象(不对外)*/private static TrtcClient getTrtcClient() {// 实例化一个client选项,可选的,没有特殊需求可以跳过ClientProfile clientProfile = new ClientProfile();// 实例化一个http选项,可选的,没有特殊需求可以跳过HttpProfile httpProfile = new HttpProfile();httpProfile.setEndpoint(trtcEndPoint);clientProfile.setHttpProfile(httpProfile);// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密// 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取Credential cred = new Credential(secretId, secretKey);return new TrtcClient(cred, "ap-beijing", clientProfile);}/*** 1. 开启TRTC云录制功能*/@SneakyThrowspublic static CreateCloudRecordingResponse sendTrtcRecord(CreateCloudRecordingRequest req) {//获取trtc客户端对象TrtcClient trtcClient = getTrtcClient();// 返回的resp是一个CreateCloudRecordingResponse的实例,与请求对象对应CreateCloudRecordingResponse resp = trtcClient.CreateCloudRecording(req);// 输出json格式的字符串回包log.info("===> 开启TRTC云录制功能-响应信息: {}" + AbstractModel.toJsonString(resp));return resp;}/*** 2. 停止TRTC云端录制任务*/@SneakyThrowspublic static Object functionCloudRecording(TrtcCommonReqDto trtcCommonReqDto) {String taskId = trtcCommonReqDto.getTaskId();Assert.notNull(taskId, () -> new ServiceException("请传递任务id后重试~"));// 实例化要请求产品的client对象,clientProfile是可选的TrtcClient client = getTrtcClient();/* 功能类型 1 停止录制(默认) 2查询录制状态 */Long sdkAppId = Long.valueOf(SDKAppID);if (Objects.equal(trtcCommonReqDto.getFunctionType(), "1")) {DeleteCloudRecordingRequest req = new DeleteCloudRecordingRequest();req.setSdkAppId(sdkAppId);req.setTaskId(taskId);// 返回的resp是一个DeleteCloudRecordingResponse的实例,与请求对象对应DeleteCloudRecordingResponse resp = client.DeleteCloudRecording(req);// 输出json格式的字符串回包log.info("===> 停止TRTC云端录制任务-响应信息: {}" , AbstractModel.toJsonString(resp));return resp;}/* 功能类型 1 停止录制(默认) 2查询录制状态 */if (Objects.equal(trtcCommonReqDto.getFunctionType(), "2")) {// 实例化一个请求对象,每个接口都会对应一个request对象DescribeCloudRecordingRequest req = new DescribeCloudRecordingRequest();req.setSdkAppId(sdkAppId);req.setTaskId(taskId);// 返回的resp是一个DescribeCloudRecordingResponse的实例,与请求对象对应DescribeCloudRecordingResponse resp = client.DescribeCloudRecording(req);log.info("===> 查询TRTC云端录制任务状态-响应信息: {}" + AbstractModel.toJsonString(resp));return resp;}throw new ServiceException("抱歉,类型不存在,请重试呦~");}/*** 3. vod云点播地址获取 通过roomId(暂不优化)*/@SneakyThrowspublic static SearchMediaResponse getVodAddressUrl(TrtcCommonReqDto trtcCommonReqDto) {Credential cred = new Credential(secretId, secretKey);// 实例化一个http选项,可选的,没有特殊需求可以跳过HttpProfile httpProfile = new HttpProfile();httpProfile.setEndpoint(vodEndPoint);// 实例化一个client选项,可选的,没有特殊需求可以跳过ClientProfile clientProfile = new ClientProfile();clientProfile.setHttpProfile(httpProfile);// 实例化要请求产品的client对象,clientProfile是可选的VodClient client = new VodClient(cred, "ap-guangzhou", clientProfile);// 实例化一个请求对象,每个接口都会对应一个request对象SearchMediaRequest req = new SearchMediaRequest();req.setSubAppId(vodSubAppId);List<String> roomIds = trtcCommonReqDto.getRoomIds();if (CollectionUtils.isEmpty(roomIds)) {return new SearchMediaResponse();}String[] trtcRoomIds1 = roomIds.toArray(new String[0]);req.setTrtcRoomIds(trtcRoomIds1);// 返回的resp是一个SearchMediaResponse的实例,与请求对象对应SearchMediaResponse resp = client.SearchMedia(req);// 输出json格式的字符串回包log.info("===> 查询Vod云端视频信息: {}", AbstractModel.toJsonString(resp));return resp;}/*** 查询vod云点播地址并封装对象 (根据订单和房间号存入)* <p>* ps: 失败也存,最好异步或者延时调用, 不是立即生成的* -> 优化: 增加重试机制,现在默认好用*/public static List<OrderTrtcVideo> getVodUrlByRoomInOrder(TrtcCommonReqDto trtcCommonReqDto) {String orderRegisterId = trtcCommonReqDto.getOrderRegisterId();SearchMediaResponse searchMediaResponse = TrtcUtils.getVodAddressUrl(trtcCommonReqDto);//处理数据List<OrderTrtcVideo> orderTrtcVideoList = Lists.newArrayList();/*校验: totalCounts是0 则查询失败*/MediaInfo[] mediaInfoSet = searchMediaResponse.getMediaInfoSet();if (Objects.equal(searchMediaResponse.getTotalCount(), 0L) || mediaInfoSet.length <= 0) {log.error("===> 云点播数据查询失败,获取失败~~~");//失败了也存记录trtcCommonReqDto.getRoomIds().forEach(roomId ->orderTrtcVideoList.add(new OrderTrtcVideo(orderRegisterId, roomId, trtcCommonReqDto.getTaskId(), null, "0")));} else {log.error("===> 云点播数据查询成功,获取成功~~~");for (MediaInfo mediaInfo : mediaInfoSet) {MediaBasicInfo basicInfo = mediaInfo.getBasicInfo();String mediaUrl = basicInfo.getMediaUrl();MediaSourceData sourceInfo = basicInfo.getSourceInfo();TrtcRecordInfo trtcRecordInfo = sourceInfo.getTrtcRecordInfo();orderTrtcVideoList.add(new OrderTrtcVideo(orderRegisterId,trtcRecordInfo.getRoomId(), trtcRecordInfo.getTaskId(), mediaUrl));}}return orderTrtcVideoList;}public static void main(String[] args) {List<String> list = Lists.newArrayList();list.add("2807212226");getVodAddressUrl(new TrtcCommonReqDto().setRoomIds(list));}
}
2.2.2 TrtcReqDTO 录制请求dto
官方提供了请求对象 但是部分方法没有set方法, 调整如此
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import com.tencentcloudapi.trtc.v20190722.models.MixLayoutParams;
import com.tencentcloudapi.trtc.v20190722.models.MixTranscodeParams;
import com.tencentcloudapi.trtc.v20190722.models.RecordParams;
import com.tencentcloudapi.trtc.v20190722.models.StorageParams;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;/*** trtc请求dto* @author pzy*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class TrtcReqDTO {/*** TRTC的[SdkAppId](https://cloud.tencent.com/document/product/647/46351#sdkappid),和录制的房间所对应的SdkAppId相同。*/private Long SdkAppId;/*** TRTC的[RoomId](https://cloud.tencent.com/document/product/647/46351#roomid),录制的TRTC房间所对应的RoomId。注:房间号类型默认为整型,若房间号类型为字符串,请通过RoomIdType指定。*/private String RoomId;/*** 录制机器人的UserId,用于进房发起录制任务。【*注意】这个UserId不能与当前房间内的主播观众[UserId](https://cloud.tencent.com/document/product/647/46351#userid)重复。如果一个房间发起多个录制任务时,机器人的userid也不能相互重复,否则会中断前一个录制任务。建议可以把房间ID作为UserId的标识的一部分,即录制机器人UserId在房间内唯一。*/private String UserId;/*** 录制机器人UserId对应的校验签名,即UserId和UserSig相当于录制机器人进房的登录密码,具体计算方法请参考TRTC计算[UserSig](https://cloud.tencent.com/document/product/647/45910#UserSig)的方案。*/private String UserSig;/*** 云端录制控制参数。*/private RecordParams RecordParams;/*** 云端录制文件上传到云存储的参数(不支持同时设置云点播VOD和对象存储COS)*/private StorageParams StorageParams;/*** TRTC房间号的类型。【*注意】必须和录制的房间所对应的RoomId类型相同:0: 字符串类型的RoomId1: 32位整型的RoomId(默认)*/private Long RoomIdType;/*** 合流的转码参数,录制模式为合流的时候可以设置。*/private MixTranscodeParams MixTranscodeParams;/*** 合流的布局参数,录制模式为合流的时候可以设置。*/private MixLayoutParams MixLayoutParams;/*** 接口可以调用的时效性,从成功开启录制并获得任务ID后开始计算,超时后无法调用查询、更新和停止等接口,但是录制任务不会停止。 参数的单位是小时,默认72小时(3天),最大可设置720小时(30天),最小设置6小时。举例说明:如果不设置该参数,那么开始录制成功后,查询、更新和停止录制的调用时效为72个小时。*/private Long ResourceExpiredHour;/*** TRTC房间权限加密串,只有在TRTC控制台启用了高级权限控制的时候需要携带,在TRTC控制台如果开启高级权限控制后,TRTC 的后台服务系统会校验一个叫做 [PrivateMapKey] 的“权限票据”,权限票据中包含了一个加密后的 RoomId 和一个加密后的“权限位列表”。由于 PrivateMapKey 中包含 RoomId,所以只提供了 UserSig 没有提供 PrivateMapKey 时,并不能进入指定的房间。*/private String PrivateMapKey;}
2.2.3 TrtcCommonReqDto 请求dto
import com.google.common.collect.Lists;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;import java.util.List;/*** trtc停止请求dto* @author pzy* @version 0.1.1*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class TrtcCommonReqDto {/*** 录制任务的唯一Id,在启动录制成功后会返回。*/private String TaskId;/*** 功能类型 1 停止录制(默认) 2查询录制状态*/private String functionType = "1";/*** roomIds房间号*/private List<String> roomIds = Lists.newLinkedList();/** 挂号订单id */private String orderRegisterId;}
2.2.4 OrderTrtcVideo 数据库存储实体类
视频对应
订单号
对应房间号
对应taskId
进行存储
如果失败可以重试(也存数据库)
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;/*** 订单trtc视频对象 order_trtc_video** @author pzy*/
@Data
@NoArgsConstructor
@AllArgsConstructor
//@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@TableName("order_trtc_video")
@Schema(title = "订单trtc视频对象 order_trtc_video")
public class OrderTrtcVideo {private static final long serialVersionUID=1L;@Schema(description = "主键id")@TableId(value = "id")private Long id;@Schema(description = "订单id")private String orderRegisterId;@Schema(description = "房间id")private String roomId;@Schema(description = "任务id")private String taskId;@Schema(description = "云点播视频url")private String vodVideoUrl;@Schema(description = "云点播状态(0失败 1成功)")private String vodStatus;public OrderTrtcVideo(String orderRegisterId, String roomId, String taskId, String vodVideoUrl) {this.orderRegisterId = orderRegisterId;this.roomId = roomId;this.taskId = taskId;this.vodVideoUrl = vodVideoUrl;}public OrderTrtcVideo(String orderRegisterId, String roomId, String taskId, String vodVideoUrl, String vodStatus) {this.orderRegisterId = orderRegisterId;this.roomId = roomId;this.taskId = taskId;this.vodVideoUrl = vodVideoUrl;this.vodStatus = vodStatus;}
}
2.2.5 获取用户usersig(旧版)
:> 依赖如下
<dependency><groupId>com.github.tencentyun</groupId><artifactId>tls-sig-api-v2</artifactId><version>1.1</version></dependency>
import com.tencentyun.TLSSigAPIv2;
public static String getUserSig(Long userId){
TLSSigAPIv2 api = new TLSSigAPIv2(sdkAppId, secretKey);return api.genSig(userId, expire);
}
2.3 业务使用方式
2.3.0 json传递数据
{"userId": "123456","userSig": "eJwtzF0LgjAYhuH-stNC5tpHCh0tsKgOIiM9nGzFS8xNE*mD-ntLPXyuG54PyvenqDctShGJMJoPG7SpO7jCwDFZUMan8tB35T1olMYcYyzIkvOxmKeH1gRnjJGQRu3A-k1QQgRNsJhe4BaOE36*OCurfrdWjUxw5qQtsk3JlXaMinxW*uL9OjT1cbtC3x*78zBl","roomId": "123","mixLayoutParams": {"backGroundColor": "#FF0000","backgroundImageRenderMode": 1,"maxResolutionUserId": "user_1","mediaId": 0,"mixLayoutList": [{"alpha": 100,"height": 100,"imageLayer": 2,"left": 100,"mediaId": 1,"renderMode": 1,"top": 100,"userId": "user_1","width": 100}],"mixLayoutMode": 3,"renderMode": 1},"recordParams": {"maxIdleTime": 60,"maxMediaFileDuration": 1440,"recordMode": 2,"streamType": 0},"storageParams": {"cloudVod": {"tencentVod": {"classId": 0,"mediaType": 0,"sessionContext": "任务流上下文,任务完成回调时透传","sourceContext": "上传上下文,上传完成回调时透传"}}}
}
2.3.1 创建service方法
R是
统一返回值
可根据自己业务自行修改
/*** trtc** @author pzy* @version 0.1.1*/
public interface TrtcService {R createCloudRecording(TrtcReqDTO trtcReqDTO);R functionCloudRecording(TrtcCommonReqDto trtcCommonReqDto);R getVodAddressUrl(TrtcCommonReqDto trtcCommonReqDto);
}
2.3.2 TrtcServiceImpl 实现类
依赖包没用特殊的 本地环境没有百度搜就行
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSON;
import com.google.common.base.Objects;
import com.google.common.collect.Lists;
import com.tencentcloudapi.trtc.v20190722.models.*;
import com.tencentcloudapi.vod.v20180717.models.*;import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;import java.util.List;@Slf4j
@Service
@RequiredArgsConstructor
public class TrtcServiceImpl implements TrtcService {@DubboReferenceprivate final A a;/*** 创建TRTC云录制功能(数据处理)*/@Overridepublic R createCloudRecording(TrtcReqDTO trtcReqDTO) {log.info("TRTC 前端入参请求数据===> {}", JSON.toJSONString(trtcReqDTO));//不得使用其他数据业务trtcReqDTO.setSdkAppId(Long.valueOf(TrtcUtils.SDKAppID));trtcReqDTO.setResourceExpiredHour(72L);/*如果是空 默认合流模式 使用默认数据*/RecordParams recordParams = trtcReqDTO.getRecordParams() != null ? trtcReqDTO.getRecordParams() : new RecordParams();recordParams.setRecordMode(2L);recordParams.setMaxIdleTime(30L);recordParams.setStreamType(0L);recordParams.setMaxMediaFileDuration(1440L);trtcReqDTO.setRecordParams(recordParams);//云点播 自动上传模板默认值-------------------->StorageParams storageParams = trtcReqDTO.getStorageParams() != null ? trtcReqDTO.getStorageParams() : new StorageParams();CloudVod cloudVod = storageParams.getCloudVod() != null ? storageParams.getCloudVod() : new CloudVod();TencentVod tencentVod = cloudVod.getTencentVod() != null ? cloudVod.getTencentVod() : new TencentVod();tencentVod.setSubAppId(TrtcUtils.vodSubAppId);tencentVod.setProcedure(TrtcUtils.vodTaskTemplateName);tencentVod.setExpireTime(0L);tencentVod.setClassId(0L);tencentVod.setMediaType(0L);cloudVod.setTencentVod(tencentVod);storageParams.setCloudVod(cloudVod);trtcReqDTO.setStorageParams(storageParams);//--------------------------------------------->log.info("TRTC 后端固定参数覆盖后请求入参数据===> {}", JSON.toJSONString(trtcReqDTO));//数据赋值CreateCloudRecordingRequest req = new CreateCloudRecordingRequest();BeanUtil.copyProperties(trtcReqDTO, req);log.info("TRTC 标准参数<官方要求>请求格式===> {}", JSON.toJSONString(req));return R.ok(TrtcUtils.sendTrtcRecord(req));}@Overridepublic R functionCloudRecording(TrtcCommonReqDto trtcCommonReqDto) {Object resp = TrtcUtils.functionCloudRecording(trtcCommonReqDto);// /*校验: 如果是停止调用*/if (Objects.equal(trtcCommonReqDto.getFunctionType(), "1")) {// 添加trtc云点播视频urladdOrderTrtcVodUrl(trtcCommonReqDto);}return R.ok(resp);}/*** 添加trtc云点播视频url*/@SneakyThrows@Asyncprotected void addOrderTrtcVodUrl(TrtcCommonReqDto trtcCommonReqDto) {Thread.sleep(15000);//模拟延时队列List<OrderTrtcVideo> orderTrtcVideoList = TrtcUtils.getVodUrlByRoomInOrder(trtcCommonReqDto);//添加Trtc视频log.info("===> 批量添加trtc视频记录中 =====> ");//TODO}@Overridepublic R getVodAddressUrl(TrtcCommonReqDto trtcCommonReqDto) {SearchMediaResponse resp = TrtcUtils.getVodAddressUrl(trtcCommonReqDto);return R.ok(resp);}
}
2.3.4 上传后视频效果
3. 文章的总结与预告
3.1 本文总结
trtc录制并上传到vod , 录制结束时根据房间号进行查询 存入数据库 设置重试机制
3.2 代码指正
如有遗漏, 代码错误,流程错误,更优方案等 欢迎评论区指正 谢谢
@author: pingzhuyan
@description: ok
@year: 2024
相关文章:
IM腾讯Trtc与vod云点播:实现合流录制并上传,根据参数返回视频地址
全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 文档传送门 2. java基础使用2.1 准备工作2.1.1 云控制台获取(密钥和密钥secret)2.1.2 找到trtc控制台2.1.3 vod云点播控制台 2.2 使用准备的数据进行操作2.2.0 引入依赖2.2.1 创建TrtcUtils工具类2.2.2 TrtcReqDTO 录制请求dt…...
HTTP协议手写服务器
目录 一、请求的是Web根目录 二、GET方法通过URL传参 三、根据资源类型对应出Content-Type值 四、Http代码 项目完整源代码:Http 周不才/cpp_linux study - 码云 - 开源中国 一、请求的是Web根目录 如果URL中请求的资源是Web根目录,则自动跳转到主…...
Uni-app入门到精通:subPackages节点为小程序的分包加载配置
subPackages节点用于为小程序的分包加载配置。因小程序有体积和资源加载限制,各小程序平台提供了分包方式,以加快小程序的下载和启动速度。主包用于放置默认启动页面、babBar页面,以及一些所有分包都会用到的公共资源或JS脚本;而分…...
DeepSeek本地部署(linux)
一、下载并安装Ollama 1.下载Ollama Ollama官网:Ollama 点击"Download",会跳转至下载页面。 1.1在线下载安装 可复制此命令到Linux服务器进行在线下载,如下载速度过慢,可选择离线下载安装。 curl -fsSL https://ollama.com/install.sh | sh1.2离线下载安装 …...
工具——(常用的软件)视频编辑器
软件工具 1、视频编辑器:filmora 9 2、图标无损放大:oCam 或者 Adobe Illustrator CS6 3、图片编辑:Photoshop CS6 4、截图置顶工具:Snipaste 或者 PixPin 5、抢票:Bypass 6、文本日志工具:N…...
Kafka 多线程开发消费者实例
目前,计算机的硬件条件已经大大改善,即使是在普通的笔记本电脑上,多核都已经是标配了,更不用说专业的服务器了。如果跑在强劲服务器机器上的应用程序依然是单线程架构,那实在是有点暴殄天物了。不过,Kafka …...
org.apache.maven.surefire:surefire-junit-platform:jar:2.22.2 Maven打包失败
org.apache.maven.surefire:surefire-junit-platform:jar:2.22.2 解决办法 勾上这个,打包时跳过测试代码...
在Ubuntu中固定USB设备的串口号
获取设备信息 lsusb # 记录设备的Vendor ID和Product ID(例如:ID 0403:6001)# 获取详细属性(替换X和Y为实际设备号) udevadm info -a /dev/ttyUSBX 结果一般如下 创建udev规则文件 sudo gedit /etc/udev/rules.d/us…...
Java后端开发: 如何安装搭建Java开发环境《安装JDK》和 检测JDK版本
文章目录 一、JDK的安装1、 打开 Oracle 官方网址2、点击产品 二、检测JDK是否安装成功以及JDK版本的查看1. 打开命令行窗口检测是否安装成功查看 JDK 版本 一、JDK的安装 1、 打开 Oracle 官方网址 Oracle官网地址:https://www.oracle.com/cn/ 2、点击产品 打开下载的JDK文件…...
AudioFlinger与AudioPoliceManager初始化流程
AF/APF启动流程 在启动AudioSeriver服务的过程中会对启动AF/APF。main_audioserver.cpp有如下代码: AudioFlinger::instantiate();AudioPolicyService::instantiate();AF初始化流程 1.AudioFlinger::instantiate() 1.1 AudioFlinger构造函数 void AudioFlinger:…...
Keepalive+LVS+Nginx+NFS高可用架构
KeepaliveLVSNginxNFS高可用架构 1. NFS 业务服务器(192.168.98.138)2. Web服务集群(搭建RS服务器)开机自启动自动挂载配置nginx(为了区分Web1与Web2访问的文件内容) 3. LVS主机(Keepalivedlvs&…...
SpringBoot分布式项目订单管理实战:Mybatis最佳实践全解
一、架构设计与技术选型 典型分布式订单系统架构: [网关层] → [订单服务] ←→ [分布式缓存]↑ ↓ [用户服务] [支付服务]↓ ↓ [MySQL集群] ← [分库分表中间件]技术栈组合: Spring Boot 3.xMybatis-Plus 3.5.xShardingSpher…...
ctfshow WEB web8
首先确定注入点,输入以下payload使SQL恒成立 ?id-1/**/or/**/true 再输入一下payload 使SQL恒不成立 ?id-1/**/or/**/false 由于SQL恒不成立, 数据库查询不到任何数据, 从而导致页面空显示 由以上返回结果可知,该页面存在SQL注入,注入点…...
当AI代写作业成为常态:重构智能时代的教育范式
2023年春季,某重点高中教师发现全班35%的作文呈现相似AI生成特征;同年国际数学竞赛中,参赛选手使用AI解题引发伦理争议。当GPT-4在SAT考试中取得1520分,当Claude3能撰写专业学术论文,教育领域正面临百年未有之大变革。这场技术革命倒逼我们重新思考:在AI能完成知识性任务…...
基于杜鹃鸟鲶鱼优化(Cuckoo Catfish Optimizer,CCO)算法的多个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码
一、杜鹃鸟鲶鱼优化算法 杜鹃鸟鲶鱼优化(Cuckoo Catfish Optimizer,CCO)算法模拟了杜鹃鸟鲶鱼的搜索、捕食和寄生慈鲷行为。该算法的早期迭代侧重于执行多维包络搜索策略和压缩空间策略,并结合辅助搜索策略来有效限制慈鳔的逃逸空…...
Ubuntu 22.04.5 LTS 设置时间同步 ntp
提示:文章为操作记录,以备下次使用 文章目录 前言一、设置ntp1.1替换国内源1.2 更新源&安装1.3 验证 前言 设置时间同步,环境版本 # cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.5 LTS" NAME"Ubuntu" VERSION_…...
搭建前端环境和后端环境
搭建前端环境 ①、安装vscode,并安装相应的插件工具 ②、安装node.js,可以选择当前版本,或者其他版本 ③、创建工作区 创建一个空文件夹,然后通过vscode工具打开,保存为后缀名为.code-workspace ④、从gitee…...
【VirtualBox 安装 Ubuntu 22.04】
网上教程良莠不齐,有一个CSDN的教程虽然很全面,但是截图冗余,看蒙了给我,这里记录一个整洁的教程链接。以备后患。 下载安装全流程 UP还在记录生活,看的我好羡慕,呜呜。 [VirtualBox网络配置超全详解]&am…...
好用的Markdown阅读编辑器Typora破解记录
Typora破解 一、下载Typora二、安装Typora三、破解Typora 😀 记录一下Typora破解记录,怕不常用忘记咯,感觉自己现在的脑子就像我的肠子一样,刚装进去就么得了。。。😔 Typroa算是用起来很舒服的Markdown阅读器了吧&am…...
系统与网络安全------Windows系统安全(1)
资料整理于网络资料、书本资料、AI,仅供个人学习参考。 用户账号基础 本地用户账号基础 用户账号概述 用户账号用来记录用户的用户名和口令、隶属的组等信息 每个用户账号包含唯一的登录名和对应的密码 不同的用户身份拥有不同的权限 操作系统根据SID识别不同…...
使用 Docker Compose 在单节点部署多容器
Docker Compose 是什么 Docker Compose 是一个用于运行多容器应用的工具, 通过一个docker-compose.yml文件, 配置应用的服务、网络和卷,然后使用简单的命令启动或停止所有服务 为什么需要 Docker Compose 当你有一个包含多个相互依赖的容器应用时,手动…...
CSS中的em,rem,vm,vh详解
一:em 和 rem 是两种相对单位,它们常用于 CSS 中来设置尺寸、字体大小、间距等,主要用于更灵活和响应式的布局设计。它们与像素(px)不同,不是固定的,而是相对于其他元素的尺寸来计算的。 1. em …...
MQTT之重复消息(5、TCP重连和MQTT重连)
目录 1. TCP 协议层的重传(原生机制) 2. 触发 TCP 重传的具体场景 3、TCP 重传的关键参数(了解) 第一、重传超时(RTO - Retransmission Timeout) 第二、重传次数 第三、累计时间 vs 本次 RTO 的区别 第四.常见问题解答 第…...
Ground Truth(真实标注数据):机器学习中的“真相”基准
Ground Truth:机器学习中的“真相”基准 文章目录 Ground Truth:机器学习中的“真相”基准引言什么是Ground Truth?Ground Truth的重要性1. 模型训练的基础2. 模型评估的标准3. 模型改进的指导 获取Ground Truth的方法1. 人工标注2. 众包标注…...
Android学习总结之通信篇
一、Binder跨进程通信的底层实现细节(挂科率35%) 高频问题:“Binder如何实现一次跨进程方法调用?” 候选人常见错误: 仅回答“通过Binder驱动传输数据”,缺乏对内存映射和线程调度的描述混淆Binde…...
自动化发布工具CI/CD实践Jenkins部署与配置教程
1. 前言背景 其实一直想把jenkins 的笔记整理下,介于公司这次升级jenkins2.0 ,根据自己部署的一些经验,我把它整理成笔记。 之前我们的jenkins1.0 时代 还一直停留在 free style 或者 maven 风格的项目,随着项目的日益增多&#x…...
kubernet在prometheus+alertmanager+grafana框架下新增部署loki模块
整个框架拓扑图 #mermaid-svg-OK7jgNZ2I7II8nJx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OK7jgNZ2I7II8nJx .error-icon{fill:#552222;}#mermaid-svg-OK7jgNZ2I7II8nJx .error-text{fill:#552222;stroke:#552…...
Ubuntu下UEFI安全启动安装Nvdia驱动
简介 众所周知,Ubuntu默认使用Nouveau开源驱动,其性能受限,因此我们需要安装Nvidia专用驱动。 安装专用驱动的一般方法非常简单,只需要sudo ubuntu-drivers devices && sudo ubuntu-drivers autoinstall即可,…...
Java多线程与高并发专题—— CyclicBarrier 和 CountDownLatch 有什么异同?
引入 上一篇我们了解CountDownLatch的原理和常见用法,在CountDownLatch的源码注释中,有提到: 另一种典型用法是将一个问题分解为 N 个部分,用一个Runnable描述每个部分,该Runnable执行相应部分的任务并对闭锁进行倒计…...
【深度学习】不管理论,入门从手写数字识别开始
1. 环境安装 学习深度学习,开发语言是Python。Python开发工具有很多。其中 anaconda vscode的Python开发环境很好用,建议使用这个组合。 编写手写数字识别测试代码,需要在使用Anaconda安装以下4个库: NumpyScipymatplotlibsci…...
Docker使用ubuntu
1. 更换源 sudo nano /etc/docker/daemon.json //daemon.conf查找最新可用的源1、2,手动查找会不断更新! 1.1 添加DNS sudo nano /etc/resolv.confnameserver 8.8.8.8 nameserver 8.8.4.4 2. 修改配置文件后重新加载 sudo systemctl daemon-relo…...
Windows 系统下多功能免费 PDF 编辑工具详解
IceCream PDF Editor是一款极为实用且操作简便的PDF文件编辑工具,它完美适配Windows操作系统。其用户界面设计得十分直观,哪怕是初次接触的用户也能快速上手。更为重要的是,该软件具备丰富多样的强大功能,能全方位满足各类PDF编辑…...
影响HTTP网络请求的因素
影响 HTTP 网络请求的因素 1. 带宽 2. 延迟 浏览器阻塞:浏览器会因为一些原因阻塞请求,浏览器对于同一个域名,同时只能有4个连接(这个根据浏览器内核不同可能会有所差异),超过浏览器最大连接数限制&…...
OpenGL —— 流媒体播放器 - ffmpeg解码rtsp流,opengl渲染yuv视频(附源码,glfw+glad)
🔔 OpenGL 相关技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 效果 说明 FFMpeg和OpenGL作为两大技术巨头,分别在视频解码和图形渲染领域发挥着举足轻重的作用。本文将综合两者实战视频播放器,大概技术流程为:ffmpeg拉取rtsp协议视频流,并…...
Java + LangChain 实战入门,开发大语言模型应用!
在 Baeldung 上看到了一篇介绍基于 Java LangChain 开发大语言模型应用的基础入门文章,写的非常不错,非常适合初学者。于是,我抽空翻译了一下。 原文地址:https://www.baeldung.com/java-langchain-basics翻译: Java…...
【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解
【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解前言YOLOV1的模型结构YOLOV1模型的基本执行流程YOLOV1模型的网络参数YOLOV1模型的训练方式 YOLOV1的核心思想前向传播阶段网格单元(grid cell)…...
软考《信息系统运行管理员》- 6.2 信息系统硬件的安全运维
硬件安全运行的概念 硬件安全运行的含义是保护支撑信息系统业务活动的信息系统硬件资产免遭自然灾害、人 为因素及各种计算机犯罪行为导致的破坏。硬件安全通常包括环境安全、设备安全和介质安全。 硬件安全运行的影响因素 硬件安全运行的影响因素主要有: (1)自然…...
SQL 视图
SQL 视图 引言 SQL(结构化查询语言)视图是数据库管理系统中的一种重要概念。它提供了一个虚拟的表,该表由一个或多个基本表的数据组成,用户可以通过视图查询数据,而不需要直接操作基本表。本文将详细介绍SQL视图的定…...
Chrome 开发环境快速屏蔽 CORS 跨域限制!
Chrome 开发环境快速屏蔽 CORS 跨域限制【详细教程】 ❓ 为什么需要临时屏蔽 CORS? 在前后端开发过程中,我们经常会遇到 跨域请求被浏览器拦截 的问题。例如,你在 http://localhost:3000 调用 https://api.example.com 时,可能会…...
数值稳定性 + 模型初始化和激活函数
数值稳定性 神经网络的梯度 考虑如下有 d 层的神经网络 h t f t ( h t − 1 ) and y ℓ ∘ f d ∘ … ∘ f 1 ( x ) \mathbf{h}^t f_t(\mathbf{h}^{t-1}) \quad \text{and} \quad y \ell \circ f_d \circ \ldots \circ f_1(\mathbf{x}) htft(ht−1)andyℓ∘fd∘…∘…...
【消息队列】几个mq组件的对比: redis stream/rabbitmq/rocketmq/kafka
1. 消息队列 几个组件: Redis Stream:适用于对性能要求高、可靠性要求不高的场景Rocket MQ:可靠性高,性能优秀,但官方对 go 不太友好,sdk 缺少很多功能支持Rabbit MQ:性能适中,使用…...
TCP协议与wireshark抓包分析
一、tcp协议格式 1. 源端口号 : 发送方使用的端口号 2. 目的端口号 : 接收方使用的端口号 3. 序号: 数据包编号 , tcp 协议为每个数据都设置编号,用于确认是否接收到相应的包 4. 确认序列号 : 使用 tcp 协议接收到数据包,…...
深度学习四大核心架构:神经网络(NN)、卷积神经网络(CNN)、循环神经网络(RNN)与Transformer全概述
目录 📂 深度学习四大核心架构 🌰 知识点概述 🧠 核心区别对比表 ⚡ 生活化案例理解 🔑 选型指南 📂 深度学习四大核心架构 第一篇: 神经网络基础(NN) 🌰 知识点概述…...
springcloud 整合 Redis_Redisson
springcloud 整合 Redis 、Redisson Redis-x64-5.0.14.1 版本 https://blog.csdn.net/wojiubugaosuni12/article/details/134452665 https://www.123pan.com/s/8EpMjv-MTjBv.html spring cloud 整合 redis Redis 5.0.14 Springcloud 2021.0.5 Redis启动 redis-server.exe 点击…...
Windows模仿Mac大小写切换, 中英文切换
CapsLock 功能优化脚本部署指南 部署步骤 第一步:安装 AutoHotkey v2 访问 AutoHotkey v2 官网下载并安装最新版本安装时勾选 "Add Compile Script to context menus" 第二步:部署脚本 直接运行 (调试推荐) 新建文本文件,粘贴…...
基于Spring Boot的木里风景文化管理平台的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
【银河麒麟系统常识】命令:uname -m(查看系统架构)
命令: uname -m 功能 常用的 Linux/Unix 终端命令,用于显示当前系统的硬件架构; 返回 返回系统的CPU架构类型,用于判断软件兼容性; 输出结果架构说明常见设备x86_64Intel/AMD 64位 CPU主流 PC、服务器aarch64ARM 64位 …...
网络原理-TCP/IP
网络原理学习笔记:TCP/IP 核心概念 本文是我在学习网络原理时整理的笔记,主要涵盖传输层、网络层和数据链路层的核心协议和概念,特别是 TCP, UDP, IP, 和以太网。 一、传输层 (Transport Layer) 传输层负责提供端到端(进程到进…...
【银河麒麟高级服务器操作系统 】虚拟机运行数据库存储异常现象分析及处理全流程
更多银河麒麟操作系统产品及技术讨论,欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer…...
AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务
环境: AI-Sphere-Butler WSL2 英伟达4070ti 12G Win10 Ubuntu22.04 腾讯云ASR 问题描述: AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务,本地硬件配置不高的情况,建议使用云服务商的ASR 解决方案: 1.登…...