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

android WebRtc 无法推流以及拉流有视频无声音问题

最近在开发使用WebRtc进行视频通话和语音通话,我使用的设备是MTK的手机,期间后台的技术人员几乎没法提供任何帮助,只有接口和测试的web端,有遇到不能推流。推流成功网页端有画面有声音,但是安卓端有画面,没有声音的情况

问题一:无法推流

一开始遇到问题是在进行推流前进行sdp的交换,一直返回返回code:400的情况,我们知道在 onCreateSuccess 方法回调中拿到offerSdp,用于向SRS服务进行网络请求,这时候一定注意其间的网络请求地址,token的拼接,peerConnection.addTransceiver添加的视频轨道和音频轨道一定要按照实际需求来,没有的就不要全部添加;全部中间步骤没错,这时候还是返回code:400的问题,后来在后台看到的错误日志是create session : create session : add publisher : publish negotiate : no found valid H.264 payload type,然后就是网上搜索下同样的问题,这里感谢

冬季穿短裤同学的知识帮助,就是接口请求里offer sdpm=videoH.264相关信息,即WebRTC在createOffer时,返回的sdp没有H.264相关信息;Android的使用WebRTC仅支持硬件上 H.264 解码和编码,并且仅支持部分芯片组。因此,如果设备不支持硬件 H.264 或具有不受支持的芯片组,您将只能使用 VP8、VP9。支持的芯片组仅有OMX.qcom.*OMX.Exynos.*,不支持的要自行添加。

解决方法:

VideoEncoderFactory创建

在创建PeerConnectionFactory,可以设VideoEncoderFactory

val encoderFactory = DefaultVideoEncoderFactory(eglBaseContext, true, true)
val peerConnectionFactory = PeerConnectionFactory.builder().setVideoEncoderFactory(encoderFactory).createPeerConnectionFactory()
public class DefaultVideoEncoderFactory implements VideoEncoderFactory {/*** 硬解件编码工厂*/private final VideoEncoderFactory hardwareVideoEncoderFactory;/*** 软件编码工厂*/private final VideoEncoderFactory softwareVideoEncoderFactory = new SoftwareVideoEncoderFactory();public DefaultVideoEncoderFactory(Context eglContext, boolean enableIntelVp8Encoder, boolean enableH264HighProfile) {//创建硬解编码工厂this.hardwareVideoEncoderFactory = new HardwareVideoEncoderFactory(eglContext, enableIntelVp8Encoder, enableH264HighProfile);}/*** 注意这个构造方法仅包可见*/DefaultVideoEncoderFactory(VideoEncoderFactory hardwareVideoEncoderFactory) {this.hardwareVideoEncoderFactory = hardwareVideoEncoderFactory;}...
}
/*** 用于创建视频编码器工厂*/
public interface VideoEncoderFactory {/** * 为给定的视频编解码器创建一个编码器。*/@Nullable@CalledByNativeVideoEncoder createEncoder(VideoCodecInfo var1);/*** 枚举支持的视频编解码器列表。这个方法只会被调用一次,结果将被缓存。*/@CalledByNativeVideoCodecInfo[] getSupportedCodecs();@CalledByNativedefault VideoCodecInfo[] getImplementations() {return this.getSupportedCodecs();}@CalledByNativedefault VideoEncoderFactory.VideoEncoderSelector getEncoderSelector() {return null;}
}

关键在于getSupportedCodecs() 在 HardwareVideoEncoderFactory中是如何实现的

@Override
public VideoCodecInfo[] getSupportedCodecs() {// Android19以下不支持硬解编码.if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {return new VideoCodecInfo[0];}List<VideoCodecInfo> supportedCodecInfos = new ArrayList<>();// 按优先顺序生成支持的编解码器列表:// VP8, VP9, H264 (high profile), and H264 (baseline profile).for (VideoCodecType type : new VideoCodecType[]{VideoCodecType.VP8, VideoCodecType.VP9, VideoCodecType.H264}) {//查找编解码器类型,这里是关键MediaCodecInfo codec = findCodecForType(type);if (codec != null) {String name = type.name();// supported by the decoder.if (type == VideoCodecType.H264 && isH264HighProfileSupported(codec)) {supportedCodecInfos.add(new VideoCodecInfo(name, MediaCodecUtils.getCodecProperties(type, /* highProfile= */ true)));}supportedCodecInfos.add(new VideoCodecInfo(name, MediaCodecUtils.getCodecProperties(type, /* highProfile= */ false)));}}return supportedCodecInfos.toArray(new VideoCodecInfo[0]);
}

findCodecForType(VideoCodecType),根据类型查找支持的编解码器

private MediaCodecInfo findCodecForType(VideoCodecType type) {for (int i = 0; i < MediaCodecList.getCodecCount(); ++i) {MediaCodecInfo info = null;try {info = MediaCodecList.getCodecInfoAt(i);} catch (IllegalArgumentException e) {//无法检索编码器编解码器信息Logging.e(TAG, "Cannot retrieve encoder codec info", e);}//编解器信息为null,或者不是编解码器不是编码器if (info == null || !info.isEncoder()) {continue;}//判断编解码器是否支持,这里就会去判断不同的芯片组是否支持if (isSupportedCodec(info, type)) {return info;}}return null; // 不支持的类型
}

isSupportedCodec(MediaCodecInfo, VideoCodecType):判断MediaCodecInfo和VideoCodecType结合设备芯片组信息是否支持

private boolean isSupportedCodec(MediaCodecInfo info, VideoCodecType type) {if (!MediaCodecUtils.codecSupportsType(info, type)) {return false;}// Check for a supported color format.if (MediaCodecUtils.selectColorFormat(MediaCodecUtils.ENCODER_COLOR_FORMATS, /*这一步其实就可以判断编解码器是否支持了给定的类型了,如果不抛异常的话*/info.getCapabilitiesForType(type.mimeType()))== null) {return false;}return isHardwareSupportedInCurrentSdk(info, type) && isMediaCodecAllowed(info);
}/*** 结合当前的sdk,再次判断是否支持*/
private boolean isHardwareSupportedInCurrentSdk(MediaCodecInfo info, VideoCodecType type) {switch (type) {case VP8:return isHardwareSupportedInCurrentSdkVp8(info);case VP9:return isHardwareSupportedInCurrentSdkVp9(info);case H264:return isHardwareSupportedInCurrentSdkH264(info);}return false;
}private boolean isHardwareSupportedInCurrentSdkH264(MediaCodecInfo info) {//H264 硬件在此类型设备上可能表现不佳。"SAMSUNG-SGH-I337", "Nexus 7", "Nexus 4"if (H264_HW_EXCEPTION_MODELS.contains(Build.MODEL)) {return false;} else {String name = info.getName();//问题就在这,写死的仅支持的硬件编码器解码器组件名称的前缀。//所以要在后面自行追加我们自己设备支持H264名称信息。return name.startsWith("OMX.qcom.") && VERSION.SDK_INT >= 19 || name.startsWith("OMX.Exynos.") && VERSION.SDK_INT >= 21;}
}
————————————————版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/csdn_shen0221/article/details/119982257

Github传送门

问题二:拉流成功出现没有声音

因为没有声音只有在mtk的设备上没有,在我其他的高通处理器手机是正常的,我们一开始想到的可能就是收到的流和编解码问题,还是比较相信webRtc的sdk没有问题的,事实证明打脸了

解决思路:

1、拦截拉流时的音频流,通过反射回调拿到PCM数据,对pcm进行播放

 audioDeviceModule = JavaAudioDeviceModule.builder(applicationContext).setSamplesReadyCallback {//音频输入数据,麦克风数据,原始pcm数据,可以直接录制成pcm文件,再转成mp3val audioFormat = it.audioFormatval channelCount = it.channelCountval sampleRate = it.sampleRate//pcm格式数据val data = it.data}.setAudioTrackStateCallback(object : JavaAudioDeviceModule.AudioTrackStateCallback {override fun onWebRtcAudioTrackStart() {audioDeviceModule.setAudioTrackSamplesReadyCallback {//音频输出数据,通话时对方数据,原始pcm数据,可以直接录制成pcm文件,再转成mp3val audioFormat = it.audioFormatval channelCount = it.channelCountval sampleRate = it.sampleRate//pcm格式数据val data = it.data} 
}override fun onWebRtcAudioTrackStop() {}}).createAudioDeviceModule()

回调数据拿到了pcm的信息audioFormat:2  channelCount:1  sampleRate:48000

a.直接使用AudioTrack播放 data,在高通手机可以,但是在mtk平台不行

b.生成.pcm文件,两设备都可以播放

2、替换播放器,使用编译openSL ES播放文件流,可以播放,但是集成到项目里就不行了,这时候可以想到,应该时webrtc内部做了处理,在拉流播放的时候会关闭其他所有的声道播放

3、使用蓝牙进行播放, mtk设备使用蓝牙进行语音通话有声音,这时候立马想到数据流声道的问题

解决方法:查资料发现webrtc播放音频流是在WebRtcAudioTrack中实现的,点击进去看到也是使用AudioTrack进行播放的,使用了AudioManager.STREAM_VOICE_CALL声道,我们类搜索将所有的Call声道换成AudioManager.STREAM_MUSIC声道,以及AudioAttributes.USAGE_VOICE_COMMUNICATION改成AudioAttributes.USAGE_MEDIA

打开通话测试,冒得问题了

一定不要遗漏了AudioAttributes.USAGE_VOICE_COMMUNICATION

相关文章:

android WebRtc 无法推流以及拉流有视频无声音问题

最近在开发使用WebRtc进行视频通话和语音通话&#xff0c;我使用的设备是MTK的手机&#xff0c;期间后台的技术人员几乎没法提供任何帮助&#xff0c;只有接口和测试的web端&#xff0c;有遇到不能推流。推流成功网页端有画面有声音&#xff0c;但是安卓端有画面&#xff0c;没…...

Socket编程TCP

【Linux】TCP编程 实验&#xff1a;通过TCP通信—在客户端输入要执行的指令&#xff0c;接收执行结果&#xff0c;另服务端接收指令并执行&#xff0c;向客户端发送执行结果 //主函数 #include<iostream> #include<string> #include"log.hpp" #include…...

《以 C++为笔,绘就手势识别人机交互新画卷》

在科技浪潮汹涌澎湃的当下&#xff0c;人机交互领域正处于深刻变革的前沿阵地。从古老的命令行输入到图形化界面的鼠标点击&#xff0c;再到如今风靡全球的触摸操控&#xff0c;每一次交互方式的革新都重塑了我们与电子设备的沟通模式。而近年来&#xff0c;手势识别技术作为一…...

【CSS】小球旋转loading加载动画

效果 css小球旋转loading动画 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document<…...

Leetcode经典题6--买卖股票的最佳时机

买卖股票的最佳时机 题目描述&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。…...

BA是什么?

目录 1.EKF的步骤 一、问题定义与模型建立 二、线性化处理 三、应用卡尔曼滤波 四、迭代与收敛 五、结果评估与优化 注意事项 2.BA问题的步骤 一、问题定义与数据准备 二、构建优化模型 三、选择优化算法 四、执行优化过程 五、结果评估与优化 六、应用与验证 1.…...

【IDEA】报错:Try to run Maven import with -U flag (force update snapshots)

问题 IDEA运行项目报错&#xff1a;Try to run Maven import with -U flag (force update snapshots) 原因 IDEA 的项目运行绑定的maven有问题&#xff0c; 解决问题 检查项目绑定的maven配置...

MATLAB提供的窗函数

加窗法 为什么使用加窗法&#xff1f; 在数字滤波器设计和频谱估计中&#xff0c;加窗函数的选择对于整体结果的质量有重大影响。加窗的主要作用是减弱因无穷级数截断而产生的吉布斯现象的影响。 windowDesigner 六种常见的窗函数 根据离散时间傅里叶变换的乘法性质&a…...

git 使用配置

新拿到机器想配置git 获取代码权限&#xff0c;需要的配置方法 1. git 配置用户名和邮箱 git config --global user.name xxxgit config --global user.email xxemail.com 2. 生成ssh key ssh-keygen -t rsa -C "xxemail.com" 3. 获取ssh key cat ~/.ssh/id_rsa.…...

【深度学习】深入解析长短期记忆网络(LSTMs)

长短期记忆网络&#xff08;Long Short-Term Memory networks, LSTMs&#xff09;是一种特殊的递归神经网络&#xff08;RNN&#xff09;&#xff0c;专门设计用来解决标准 RNN 在处理长序列数据时的梯度消失和梯度爆炸问题。LSTMs 在许多序列数据任务中表现出色&#xff0c;如…...

vue watch和computed的区别,computed和method的区别

发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 在 Vue 中&#xff0c;watch、computed 和 methods 都是常用的响应式功能&#xff0c;它们的用途和工作方式有所不同。下面分别解…...

搭建高可用负载均衡系统:Nginx 与云服务的最佳实践

搭建高可用负载均衡系统&#xff1a;Nginx 与云服务的最佳实践 引言 在项目开发过程中&#xff0c;我们通常在开发和测试阶段采用单机架构进行开发和测试。这是因为在这个阶段&#xff0c;系统的主要目的是功能实现和验证&#xff0c;单机架构足以满足开发人员的日常需求&…...

FFmpeg 4.3 音视频-多路H265监控录放C++开发十九,ffmpeg复用

封装就是将 一个h264&#xff0c;和一个aac文件重新封装成一个mp4文件。 这里我们的h264 和 aac都是来源于另一个mp4文件&#xff0c;也就是说&#xff0c;我们会将 in.mp4文件解封装成一路videoavstream 和 一路 audioavstream&#xff0c;然后 将这两路的 avstream 合并成一…...

Node.js JWT认证教程

Node.js JWT认证教程 1. 项目介绍 JSON Web Token (JWT) 是一种安全的跨域身份验证解决方案&#xff0c;在现代Web应用中广泛使用。本教程将详细讲解如何在Node.js中实现JWT认证。 2. 项目准备 2.1 初始化项目 # 创建项目目录 mkdir nodejs-jwt-auth cd nodejs-jwt-auth# …...

nn.utils.clip_grad_value_

nn.utils.clip_grad_value_ 是 PyTorch 中的一个函数&#xff0c;用于在训练过程中对模型的梯度进行裁剪&#xff0c;以防止梯度爆炸&#xff08;gradient explosion&#xff09;问题。该函数对梯度的每个元素进行裁剪&#xff0c;将其限制在一个指定的最大绝对值范围内。裁剪后…...

Java后端面试模板(技术面)

1、自我介绍模板 面试官您好&#xff01;我是来自----大学计算机学院的一名大三学生&#xff0c;我的名字叫—。 在大学期间&#xff0c;我主要自学了一些主流的Java技术栈&#xff0c;其中主要包括&#xff1a;Java主流的框架&#xff1a;Spring MVC Spring Boot Spring Clou…...

【大语言模型】ACL2024论文-24 图像化歧义:Winograd Schema 挑战的视觉转变

【大语言模型】ACL2024论文-24 图像化歧义&#xff1a;Winograd Schema 挑战的视觉转变 目录 文章目录 【大语言模型】ACL2024论文-24 图像化歧义&#xff1a;Winograd Schema 挑战的视觉转变目录摘要研究背景问题与挑战如何解决核心创新点算法模型实验效果&#xff08;包含重要…...

Docker 安装和使用

#Docker 安装和使用 文章目录 1. 安装2. 干掉讨厌的 sudo3. 使用镜像源3.1. 使用 upstart 的系统3.2. 使用 systemd 的系统 4. 基本使用4.1. 容器操作4.2. 镜像操作 5. 网络模式说明5.1. bridge 模式5.2. host 模式5.3. container 模式5.4. none 模式 6. 查看 Docker run 启动参…...

nginx网站服务

nginx介绍&#xff1a; 1、高并发&#xff0c;轻量级的web服务软件 2、稳定性高&#xff0c;系统资源消耗率低 对http的高并发处理能力高&#xff0c;单台物理服务器可以支持30000-50000个并发。 一般来说在工作中&#xff0c;单台的并发一般在20000. nginx的功能介绍&…...

MATLAB 手写判断点在多边形内外的2种方法(87)

MATLAB 手写判断点在多边形内外-方法1(87) 一、算法介绍二、算法实现1.方法1(代码+测试)2.方法2(代码+测试)三、结果一、算法介绍 手动实现两种方法,判断点在多边形的内部还是外部, 具体实现和测试代码如下,使用前请自行验证。(代码复制粘贴即可使用) 二、算法实现…...

Android SurfaceFlinger layer层级

壁纸作为显示的最底层窗口它是怎么显示的 1. SurfaceFlinger layer层级 锁屏状态dump SurfaceFlinger &#xff0c;adb shell dumpsys SurfaceFlinger Display 0 (active) HWC layers: -----------------------------------------------------------------------------------…...

零基础快速掌握——【c语言基础】数组的操作,冒泡排序,选择排序

1.数组 内存空间连续&#xff1a; 2.定义格式 数组的定义格式&#xff1a; 数组分为一维数组、二维数组、以及多维数组&#xff0c;不同类型的数组定义格式时不一样 2.1 一维数组的定义 数据类型 数组名 [数组长度]&#xff1b; 解释&#xff1a; 数据类型&#xff1…...

个人IP建设:简易指南

许多个体创业者面临的一个关键挑战是如何为其企业创造稳定的需求。 作为个体创业者&#xff0c;您无法使用营销团队&#xff0c;因此许多人通过推荐和他们的网络来产生需求。因此&#xff0c;扩大您的网络是发展您的业务和产生持续需求的最佳策略。 这就是个人IP和品牌发挥作…...

【Unity高级】如何获取着色器(Shader)的关键词

在动态设置Shader时&#xff0c;会需要通过EnableKeyword, DisableKeyword来完成。但一个Shader有哪些关键词呢&#xff1f;Unity的文档中并没有列出来&#xff0c;但我们可以通过遍历Shader的KeywordSpace来查看。 1. 代码如下 using UnityEngine;public class KeywordExamp…...

OSS文件上传

1、我们这个系统对接的阿里云OSS需要先对接小鹏OSS系统获取accessKeyId、accessKeySecret&#xff0c;这个可以忽略 aliyun:oss:endpoint: https://oss-cn-hangzhou.aliyuncs.combucketName: xp-xpd-experiencedomain: https://xp-xpd-experience.oss-cn-hangzhou.aliyuncs.co…...

时序预测算法TimeXer代码解析

在时序预测领域&#xff0c;如何有效地利用外部变量&#xff08;exogenous variables&#xff09;来提升内部变量&#xff08;endogenous variables&#xff09;的预测性能一直是一个挑战。 在上一篇文章中&#xff0c;我结合论文为大家解读了TimeXer框架&#xff0c;今天&…...

【无标题】建议用坚果云直接同步zotero,其他方法已经过时,容易出现bug

created: 2024-12-06T16:07:45 (UTC 08:00) tags: [] source: https://zotero-chinese.com/user-guide/sync author: 数据与文件的同步 | Zotero 中文社区 Excerpt Zotero 中文社区&#xff0c;Zotero 中文维护小组&#xff0c;Zotero 插件&#xff0c;Zotero 中文 CSL 样式 数…...

Hive 分桶表的创建与填充操作详解

Hive 分桶表的创建与填充操作详解 在 Hive 数据处理中&#xff0c;分桶表是一个极具实用价值的功能&#xff0c;它相较于非分桶表能够实现更高效的采样&#xff0c;并且后续还可能支持诸如 Map 端连接等节省时间的操作。不过&#xff0c;值得注意的是&#xff0c;在向表写入数…...

docker怎么commit tag push?

在 Docker 中&#xff0c;commit、tag 和 push 是用于创建和推送自定义镜像到仓库的三个不同步骤。以下是每个命令的详细说明和使用方法&#xff1a; ### 1. docker commit 当你对一个运行中的容器做了修改&#xff0c;并希望将这些修改保存为一个新的镜像时&#xff0c;可以使…...

全面替换VMware,南昌大学一卡通的硬核智慧

将一昼夜分为十二时辰 是古人的博大智慧 晨光熹微&#xff0c;门扉轻启&#xff0c;负笈而行 智慧校园的“十二时辰”启幕新章 一、数字南大&#xff1a;一卡通打卡校园十二时辰 时辰轮转&#xff0c;一时有一时的使命师生们是如何高效、便捷地度过每个时辰&#xff1f;一张充…...

SpringMVC ,ioc和aop

IOC和AOP IOC 控制反转&#xff0c;将应用程序的控制权交给spring容器管理&#xff0c;而不是应用程序本身 1.创建一个mapper&#xff0c;测试用&#xff0c; 就写个普通方法 public class UserMapper {public void addUser(){System.out.println("dao层新增");} …...

3GPP R18 LTM(L1/L2 Triggered Mobility)是什么鬼?(三) RACH-less LTM cell switch

这篇看下RACH-less LTM cell switch。 相比于RACH-based LTM,RACH-less LTM在进行LTM cell switch之前就要先知道target cell的TA信息,进而才能进行RACH-less过程,这里一般可以通过UE自行测量或者通过RA过程获取,而这里的RA一般是通过PDCCH order过程触发。根据38.300中的描…...

Ansys Maxwell:Qi 无线充电组件

Qi 无线充电采用感应充电技术&#xff0c;无需物理连接器或电缆&#xff0c;即可将电力从充电站传输到兼容设备。由 WPC 管理的 Qi 标准确保了不同无线充电产品之间的互操作性。以下是 Qi v1.3 标准的核心功能&#xff1a; Qi v1.3 标准的主要特点 身份验证&#xff1a;确保充…...

Neo4j 图数据库安装与操作指南(以mac为例)

目录 一、安装前提条件 1.1 Java环境 1.2 Homebrew&#xff08;可选&#xff09; 二、下载并安装Neo4j 2.1 从官方网站下载 2.1.1 访问Neo4j的官方网站 2.1.2 使用Homebrew安装 三、配置Neo4j 3.1 设置环境变量(可选) 3.2 打开配置文件(bash_profile) 3.2.1 打开终端…...

基于MFC绘制门电路

MFC绘制门电路 1. 设计内容、方法与难点 本课题设计的内容包括了基本门电路中与门和非门的绘制、选中以及它们之间的连接。具体采用的方法是在OnDraw函数里面进行绘制&#xff0c;并设计元器件基类&#xff0c;派生出与门和非门&#xff0c;并组合了一个引脚类&#xff0c;在…...

Gitee上获取renren-fast-vue install并run dev错误处理

目的&#xff1a;获取一个手脚架、越简约越好、越干净越好、于是看上了renren-fast-vue… 前端&#xff1a;vue2 后端&#xff1a;jdk1.8 mysql 5.7 SpringBoot单体架构 一开始只是下载前后端项目到本地&#xff0c;一堆乱七八糟的错误&#xff0c;网上找的资料也参差不齐… …...

sdk项目的git 标记新tag的版本号

在 Git 中&#xff0c;tag 是用来标记某个特定的提交点&#xff08;通常是发布版本或重要的里程碑&#xff09;的工具。通过 git tag&#xff0c;你可以为版本号创建标记&#xff0c;帮助团队跟踪不同版本的代码。 如果你想创建一个新的版本号标签&#xff0c;可以按照以下步骤…...

学习日志022 -- python事件机制

作业&#xff1a; 1】思维导图 2】完成闹钟 main.py import sysfrom PySide6.QtCore import QTimerEvent, QTime,Qt from PySide6.QtGui import QMovie,QMouseEvent from PySide6.QtWidgets import QApplication, QWidget from Form import Ui_Formclass MyWidget(Ui_Form,Q…...

JAVA八股文-运行篇-创建项目运行(1)

前置环境搭建:jdk、maven、idea、linux环境 一、创建一个java项目 File->New->Project 二、填写基本信息 三、完成&#xff0c;写了一段代码 四、打包 五、本地运行&#xff0c;运行和debug二选一 六、上传至linux环境 七、linux环境下命令执行 7.1 指定Main方法类 …...

Vue Web开发(二)

1. 项目搭建 1.1. 首页架子搭建 使用Element ui中的Container布局容器&#xff0c;选择倒数第二个样式&#xff0c;将代码复制到Home.vue。 1.1.1.下载less &#xff08;1&#xff09;下载less样式 npm i less   &#xff08;2&#xff09;下载less编辑解析器 npm i less…...

Midjourney Describe API 的对接和使用

Midjourney Describe API 的对接和使用 Midjourney Describe API 的主要功能是通过上传图片&#xff0c;获取对图片的描述。使用该 API&#xff0c;只需要传递图片文件地址&#xff0c;API 会返回图片的详细描述。无需繁琐的参数设置&#xff0c;即可获得高质量的图片描述。 …...

MySQL是怎么加锁的

1. 全局锁 1.1 什么是全局锁&#xff1f; 全局锁是一种一次性锁住整个数据库的锁定机制。一旦加上全局锁&#xff0c;整个数据库的所有表都会处于只读状态&#xff0c;这意味着所有修改操作&#xff08;如INSERT、UPDATE、DELETE&#xff09;都会被阻塞。 常用的SQL命令&…...

burp suite 5

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…...

硬件和自驾功能

1 硬件 指令集架构 (ISA)&#xff1a; ARM v6, v7, v8&#xff1a;这些是 ARM 公司设计的不同版本的指令集架构 (ISA)。ARM v6 和 v7 属于 32 位架构&#xff0c;而 ARM v8 则引入了 64 位支持&#xff08;即 ARMv8-A&#xff09;和 32 位向后兼容模式。需要强调的是&#xff…...

uviewplus中的时间单选框up-datetime-picker的在uni-app+vue3的使用方法

uviewplus中的时间单选框up-datetime-picker的使用方法 前言 在实际开发中,我们经常需要使用时间选择器来让用户选择特定的时间。本文将详细介绍uviewplus中up-datetime-picker组件的使用方法,特别是在处理年月选择时的一些关键实现&#xff0c;因为官方有很多相关的功能和方法…...

车联网安全学习之TBOX

Telematics BOX&#xff0c;简称 T-BOX&#xff0c;也称远程信息处理控制单元&#xff08;Telematics Control Unit, TCU&#xff09;&#xff0c;集成GPS、外部通信接口、电子处理单元、微控制器、移动通信单元和存储器等功能模块。 TBOX 提供的功能有网络接入、OTA、远程控制…...

【教程】创建NVIDIA Docker共享使用主机的GPU

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 这套是我跑完整理的。直接上干货&#xff0c;复制粘贴即可&#xff01; # 先安装toolkit sudo apt-get update sudo apt-get install -y ca-certifica…...

tomcat 运行加载机制解析

tomcat 运行加载机制 从tomcat jar包的加载顺序&#xff1a; tomcat的具体运行加载 可以从 start、setclasspath、catalina文件中看出来&#xff1a; start.bat执行 去找bin目录下的catalina.bat,catalina 或去找 bin\setenv.bat以获取标准环境变量&#xff0c;然后去找bin\…...

基于JWT跨语言开发分布式业务系统的挑战与实践:多语言协作的最佳方案

在现代分布式架构下&#xff0c;开发团队往往由来自不同技术栈和开发语言的工程师组成。如何有效地管理这些开发人员的协作&#xff0c;尤其是在实现跨语言的认证与授权机制时&#xff0c;成为了开发者面临的一个重大挑战。JSON Web Token&#xff08;JWT&#xff09;作为一种轻…...

Unity在运行状态下,当物体Mesh网格发生变化时,如何让MeshCollider碰撞体也随之实时同步变化?

旧版源代码地址&#xff1a;https://download.csdn.net/download/qq_41603955/90087225?spm1001.2014.3001.5501 旧版效果展示&#xff1a; 新版加上MeshCollider后的效果&#xff1a; 注意&#xff1a;在Unity中&#xff0c;当你动态地更改物体的Mesh时&#xff0c;通常期望…...