Android Audio基础(13)——audiomixer
在 Android 平台上,音频混合器 AudioMixer 主要用在 AudioFlinger 里,将多路音频源数据混音(包括混音、音量处理、重采样及处理声道等)。位于 framework 的音频处理模库 libaudioprocessing(frameworks/av/media/libaudioprocessing)中。
一、音频混合器
混音器(AudioMixer)是在混音回放线程类(MixerThread)中的构造函数内创建。
1、混合器创建
源码位置:/frameworks/av/services/audioflinger/Threads.cpp
AudioFlinger::MixerThread::MixerThread(……)
{……// 往hal层一次写数据的大小。hal层设备的采样率。mAudioMixer = new AudioMixer(mNormalFrameCount, mSampleRate);……
}
这说明了一个 MixerThread 对应一个 AudioMixer,而且 MixerThread 传了两个参数给AudioMixer:
mNormalFrameCount:一次输送数据的长度,把源 buffer 的音频数据写入目的 buffer。
mSampleRate:音频数据输出的采样率。
2、功能接口
AudioMixer源码位置:/frameworks/av/media/libaudioprocessing/AudioMixer.cpp
void AudioMixer::setBufferProvider(int name, AudioBufferProvider* bufferProvider)
此方法允许用户根据给定的索引设置一个音频缓冲区提供者,name 作为索引,bufferProvider由 mActiveTracks 取出来的 Track 对象提供。这样audiomixer混音时就从track对应的IFFO取数据。
void AudioMixer::setParameter(int name, int target, int param, void *value)
该函数主要用于设置特定参数值,涉及到了音频处理中多种参数的设置,包括通道掩码、缓冲区指针、格式、重采样、音量衰减、时间拉伸等。
这里我们主要看一下 target 和 param 的不同参数所对应实现的相关功能:
标注基类是直接透传调用 AudioMixerBase.cpp 中的对应函数。AudioMixer 继承自 AudioMixerBase,同时基类中也有几个比较重要的函数。这里我们需要关注的是参数MAIN_BUFFER。audiomixer会将从track获取的FIFO数据和MAIN_BUFFER混音后存入MAIN_BUFFER。
AudioMixerBase
源码位置:/frameworks/av/media/libaudioprocessing/AudioMixerBase.cpp
// 启用指定的音频轨道
void AudioMixerBase::enable(int name)
// 禁用指定的音频轨道
void AudioMixerBase::disable(int name)
// 销毁指定的音频轨道
void AudioMixerBase::destroy(int name)
这几个函数主要是用于音频轨道的控制功能,确保了轨道能够在不同状态下正确工作。
刷新函数
上面的接口中大量调用 invalidate() 函数,该函数的主要作用就是刷新 Track。源码位置:/frameworks/av/media/libaudioprocessing/include/media/AudioMixerBase.h
// 当轨道信息改变,需要确定一个新的进程钩子时调用下面的函数
void invalidate() {mHook = &AudioMixerBase::process__validate;
}
可以看到该函数用于当轨道信息发生变化时,重新确定一个新的进程钩子。这个钩子通常用于验证和处理轨道信息的变化,调用 AudioMixerBase 中的 process__validate() 函数。
void AudioMixerBase::process__validate()
{……// 遍历轨道for (const auto &pair : mTracks) {const int name = pair.first;const std::shared_ptr<TrackBase> &t = pair.second;// 判断该track是否需要混音if (!t->enabled) continue;// 将启用的轨道添加到 mEnabled 和 mGroups 中mEnabled.emplace_back(name);mGroups[t->mainBuffer].emplace_back(name);// 计算每个轨道的需求 (needs) 并设置相应的处理钩子 (hook)uint32_t n = 0;// 可以溢出(掩码只有3位)n |= NEEDS_CHANNEL_1 + t->channelCount - 1;// 设置重采样 NEEDS_RESAMPLE 标志位if (t->doesResample()) {n |= NEEDS_RESAMPLE;}// 设置辅助通道 NEEDS_AUX 标志位if (t->auxLevel != 0 && t->auxBuffer != NULL) {n |= NEEDS_AUX;}if (t->volumeInc[0]|t->volumeInc[1]) {// 增益正在变化volumeRamp = true;} else if (!t->doesResample() && t->volumeRL == 0) {// 不需要重采样且增益为零n |= NEEDS_MUTE;}// 将所有设置好的标志位保存到 t->needs 中t->needs = n;if (n & NEEDS_MUTE) { // 需要静音t->hook = &TrackBase::track__nop;} else {if (n & NEEDS_AUX) { // 处理辅助通道all16BitsStereoNoResample = false;}if (n & NEEDS_RESAMPLE) { // 处理重采样all16BitsStereoNoResample = false;resampling = true;if ((n & NEEDS_CHANNEL_COUNT__MASK) == NEEDS_CHANNEL_1&& t->channelMask == AUDIO_CHANNEL_OUT_MONO // MONO_HACK&& isAudioChannelPositionMask(t->mMixerChannelMask)) { // 重采样单声道t->hook = TrackBase::getTrackHook(TRACKTYPE_RESAMPLEMONO, t->mMixerChannelCount,t->mMixerInFormat, t->mMixerFormat);} else if ((n & NEEDS_CHANNEL_COUNT__MASK) >= NEEDS_CHANNEL_2&& t->useStereoVolume()) { // 重采样立体声t->hook = TrackBase::getTrackHook(TRACKTYPE_RESAMPLESTEREO, t->mMixerChannelCount, t->mMixerInFormat, t->mMixerFormat);} else { // 其他情况t->hook = TrackBase::getTrackHook(TRACKTYPE_RESAMPLE, t->mMixerChannelCount,t->mMixerInFormat, t->mMixerFormat);}ALOGV_IF((n & NEEDS_CHANNEL_COUNT__MASK) > NEEDS_CHANNEL_2,"Track %d needs downmix + resample", name);} else { // 处理无需重采样的情况……}}}// 根据条件选择合适的处理钩子mHook = &AudioMixerBase::process__nop;if (mEnabled.size() > 0) {if (resampling) {if (mOutputTemp.get() == nullptr) {mOutputTemp.reset(new int32_t[MAX_NUM_CHANNELS * mFrameCount]);}if (mResampleTemp.get() == nullptr) {mResampleTemp.reset(new int32_t[MAX_NUM_CHANNELS * mFrameCount]);}mHook = &AudioMixerBase::process__genericResampling;} else {mHook = &AudioMixerBase::process__genericNoResampling;if (all16BitsStereoNoResample && !volumeRamp) {if (mEnabled.size() == 1) {const std::shared_ptr<TrackBase> &t = mTracks[mEnabled[0]];if ((t->needs & NEEDS_MUTE) == 0) {mHook = getProcessHook(PROCESSTYPE_NORESAMPLEONETRACK, t->mMixerChannelCount, t->mMixerInFormat, t->mMixerFormat, t->useStereoVolume());}}}}}……process();// 处理音量渐变,设置最优状态和轨道处理钩子if (mEnabled.size() > 0) {bool allMuted = true;for (const int name : mEnabled) {const std::shared_ptr<TrackBase> &t = mTracks[name];if (!t->doesResample() && t->volumeRL == 0) {t->needs |= NEEDS_MUTE;t->hook = &TrackBase::track__nop;} else {allMuted = false;}}if (allMuted) {mHook = &AudioMixerBase::process__nop;} else if (all16BitsStereoNoResample) {if (mEnabled.size() == 1) {const std::shared_ptr<TrackBase> &t = mTracks[mEnabled[0]];mHook = getProcessHook(PROCESSTYPE_NORESAMPLEONETRACK, t->mMixerChannelCount, t->mMixerInFormat, t->mMixerFormat, t->useStereoVolume());}}}
}
这些步骤确保了音频轨道信息变化时能够正确选择合理的钩子函数处理各种情况,包括重采样、音量渐变等。
二、AudioMixer混音
关于混音,我们已经知道:混音以 track 为源,mainBuffer 为目标,frameCount 为一次混音长度。AudioMixer 最多能维护 32 个 track。track 可以对应不同 mainBuffer,尽管一般情况下他们的 mainBuffer 都是同一个。
调用 AudioMixer 的 process 方法进行混音的,实际上混音的方法是调用 AudioMixerBase 内的 process_xxx 方法,各个 process 方法大同小异。下面来分析 process__genericResampling 这个方法。
1、AudioMixerBase.cppp
rocess__genericResampling
void AudioMixerBase::process__genericResampling()
{ALOGVV("process__genericResampling\n");// 初始化 outTemp 指针int32_t * const outTemp = mOutputTemp.get(); // 获取当前帧数 numFramessize_t numFrames = mFrameCount;// 遍历每个音频组 mGroupsfor (const auto &pair : mGroups) {const auto &group = pair.second;// 获取第一个轨道 t1const std::shared_ptr<TrackBase> &t1 = mTracks[group[0]];// 清除了临时缓冲区 outTempmemset(outTemp, 0, sizeof(*outTemp) * t1->mMixerChannelCount * mFrameCount);// 处理每个轨道for (const int name : group) {const std::shared_ptr<TrackBase> &t = mTracks[name];int32_t *aux = NULL;if (CC_UNLIKELY(t->needs & NEEDS_AUX)) {aux = t->auxBuffer;}// 如果轨道需要重采样,则直接调用重采样钩子if (t->needs & NEEDS_RESAMPLE) {(t.get()->*t->hook)(outTemp, numFrames, mResampleTemp.get() /* naked ptr */, aux);} else { // 逐帧获取数据并调用处理钩子// 清除临时缓冲区size_t outFrames = 0;// 获取每个轨道的数据并调用相应的处理钩子while (outFrames < numFrames) {t->buffer.frameCount = numFrames - outFrames;t->bufferProvider->getNextBuffer(&t->buffer);t->mIn = t->buffer.raw;// t->mIn == nullptr:启用混音后刚刚刷新音轨if (t->mIn == nullptr) break;(t.get()->*t->hook)(outTemp + outFrames * t->mMixerChannelCount, t->buffer.frameCount,mResampleTemp.get() /* naked ptr */, aux != nullptr ? aux + outFrames : nullptr);outFrames += t->buffer.frameCount;t->bufferProvider->releaseBuffer(&t->buffer);}}}// 将处理后的数据转换为混音器所需的格式convertMixerFormat(t1->mainBuffer, t1->mMixerFormat,outTemp, t1->mMixerInFormat, numFrames * t1->mMixerChannelCount);}
}
这些步骤确保了在需要重采样的情况下,能够正确处理每个轨道的数据,并将其转换为所需的格式。
相关文章:
Android Audio基础(13)——audiomixer
在 Android 平台上,音频混合器 AudioMixer 主要用在 AudioFlinger 里,将多路音频源数据混音(包括混音、音量处理、重采样及处理声道等)。位于 framework 的音频处理模库 libaudioprocessing(frameworks/av/media/libau…...
vivo 湖仓架构的性能提升之旅
作者:郭小龙 vivo互联网 大数据高级研发工程师 导读:本文整理自 vivo互联网 大数据高级研发工程师 郭小龙 在 StarRocks 年度峰会上的分享,聚焦 vivo 大数据多维分析面临的挑战、StarRocks 落地方案及应用收益。 在 即席分析 场景,…...
常见中间件漏洞攻略-Tomcat篇
一、 CVE-2017-12615-Tomcat put方法任意文件写入漏洞 第一步:开启靶场 第二步:在首页抓取数据包,并发送到重放器 第三步:先上传尝试一个1.txt进行测试 第四步:上传后门程序 第五步:使用哥斯拉连接 二、后…...
基于linuxC结合epoll + TCP 服务器客户端 + 数据库实现一个注册登录功能
1. 整体功能概述 实现了一个简单的用户注册和登录系统,采用客户端 - 服务器(C/S)架构。 客户端可以选择注册或登录操作,将用户名和密码发送给服务器,服务器接收请求后处理并返回相应的结果给客户端。 服务器使用 SQLit…...
redis7.4.2单机配置
解压源码包 将从官网下载的redis源码压缩包上传到服务器的相关目录下。 [roothcss-ecs-2851 ~]# cd /opt/soft/redis/ [roothcss-ecs-2851 redis]# ls redis-stable.tar.gz解压并进入解压后的目录中。 [roothcss-ecs-2851 redis]# tar -zxvf redis-stable.tar.gz [roothcss-…...
Unity代码热更新和资源热更新
知识点来源:人间自有韬哥在,hybridclr,豆包 目录 一、代码热更新1.代码热更新概述2.HybridCLR 二、资源热更新1.资源热更新概述2.AB包2.1.AB包的加载2.2.卸载AB包2.3.加载AB包依赖包2.4.获取MD52.5.生成对比文件2.6.更新AB包 3.Addressable3.1.AssetRef…...
【MySQL篇】DEPENDENT SUBQUERY(依赖性子查询)优化:从百秒到秒级响应的四种优化办法
💫《博主介绍》:✨又是一天没白过,我是奈斯,从事IT领域✨ 💫《擅长领域》:✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(…...
腾讯四面面经
说明 是的,没听错,确实是腾讯四面,而且是技术面。先声明下,这个面经是帮朋友整理的,都是真实的面经,不得不说,四面确实是有强的的,接下来让我们一起看下 面试部门:s3&a…...
【mysql】唯一性约束unique
文章目录 唯一性约束 1. 作用2. 关键字3. 特点4. 添加唯一约束5. 关于复合唯一约束 唯一性约束 1. 作用 用来限制某个字段/某列的值不能重复。 2. 关键字 UNIQUE3. 特点 同一个表可以有多个唯一约束。唯一约束可以是某一个列的值唯一,也可以多个列组合的值唯…...
如何理解前端工程化
前端工程化详解 一、 定义二、特点1. 模块化2. 组件化3. 自动化4. 规范化 三、涉及环节1. 项目架构2. 版本控制:3.自动化构建4.任务自动化5. 部署与CI/CD 五、 前端工程化的实际应用六、前端工程化的优势:七、总结 一、 定义 前端工程化是指将前端开发…...
嵌入式八股RTOS与Linux---进程间的通信与同步篇
前言 同步异步、阻塞/非阻塞是什么? 同步:在执行某个操作时,调用者必须等待该操作完成并返回结果后,才能继续执行后续的操作异步:在执行某个操作时,调用者发起操作后不必等待其完成,可以立即继续执行后续的操作。操作完成后&am…...
this.centerDialogVisible = true this.$nextTick(()=>{ this.resetForm(); })
这段代码的作用是 打开一个对话框,并在对话框打开后 重置表单。下面是对这段代码的详细解析: 1. 代码作用 this.centerDialogVisible true:控制对话框的显示。this.$nextTick(() > { ... }):在 DOM 更新后执行回调函数&#…...
datawhale组队学习--大语言模型—task4:Transformer架构及详细配置
第五章 模型架构 在前述章节中已经对预训练数据的准备流程(第 4 章)进行了介绍。本章主 要讨论大语言模型的模型架构选择,主要围绕 Transformer 模型(第 5.1 节)、详细 配置(第 5.2 节)、主流架…...
专业级 AI 提示生成工具清单
1. 引言 近年来,随着 GPT-3、GPT-4 等大规模预训练语言模型的广泛应用,提示(Prompt)工程作为驱动模型输出质量的重要环节,受到了各界的高度关注。精心设计、管理与优化提示,不仅能够大幅提高生成文本的准确…...
Web前端考核 JavaScript知识点详解
一、JavaScript 基础语法 1.1 变量声明 关键字作用域提升重复声明暂时性死区var函数级✅✅❌let块级❌❌✅const块级❌❌✅ 1.1.1变量提升的例子 在 JavaScript 中,var 声明的变量会存在变量提升的现象,而 let 和 const 则不会。变量提升是指变量的声…...
23种设计模式-生成器(Builder)设计模式
工厂方法设计模式 🚩什么是生成器设计模式?🚩生成器设计模式的特点🚩生成器设计模式的结构🚩生成器设计模式的优缺点🚩生成器设计模式的Java实现🚩代码总结🚩总结 🚩什么…...
Thinkphp(TP)框架漏洞攻略
1.环境搭建 vulhub/thinkphp/5-rce docker-compose up -d 2.访问靶场 远程命令执行: ? sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1] []whoami 远程代码执行: ? s/Index/\think\app/invokefunc…...
HTTP/HTTPS 中 GET 请求和 POST 请求的区别与联系
一、基础概念 HTTP (HyperText Transfer Protocol, 超文本传输协议) 是一种用于浏览器与服务器之间进行数据交互的协议。HTTPS (加密的 HTTP) 则通过 SSL/TLS 协议实现通信加密与数据安全性。 二、GET 和 POST 概述 GET 请求: 用于从服务器获取资源。 POST 请求: 用于将数据…...
2021年蓝桥杯第十二届CC++大学B组真题及代码
目录 1A:空间(填空5分_单位转换) 2B:卡片(填空5分_模拟) 3C:直线(填空10分_数学排序) 4D:货物摆放(填空10分_质因数) 5E…...
解锁 AWX+Ansible 自动化运维新体验:快速部署实战
Ansible 和 AWX 是自动化运维领域的强大工具组合。Ansible 是一个简单高效的 IT 自动化工具,而 AWX 则是 Ansible 的开源 Web 管理平台,提供图形化界面来管理 Ansible 任务。本指南将带你一步步在 Ubuntu 22.04 上安装 Ansible 和 AWX,使用 M…...
简洁、实用、无插件和更安全为特点的WordPress主题
简站WordPress主题是一款以简洁、实用、无插件和更安全为特点的WordPress主题,自2013年创立以来,凭借其设计理念和功能优势,深受用户喜爱。以下是对简站WordPress主题的详细介绍: 1. 设计理念 简站WordPress主题的核心理念是“崇…...
区块链学习总结
Hardhat 是一个用于 Ethereum 智能合约开发 的开发环境,专为 Solidity 语言编写的智能合约提供工具支持。它能够帮助开发者 编译、部署、测试和调试 智能合约,并提供一个本地的以太坊测试网络。 Hardhat 的核心功能 本地开发网络(Hardhat Ne…...
可发1区的超级创新思路(python\matlab实现):基于周期注意力机制的TCN-Informer时间序列预测模型
首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 一、应用场景 该模型主要用于时间序列数据预测问题,包含功率预测、电池寿命预测、电机故障检测等等 二、模型整体介绍(本文以光伏功率预测为例) 1.1 核心创新点 本模型通过三阶段…...
案例4:鸢尾花分类(pytorch)
一、引言 鸢尾花分类是机器学习领域的经典案例,常用于演示分类算法的基本原理和应用。本案例使用 PyTorch 构建一个简单的神经网络模型,对鸢尾花进行分类。通过该案例,我们可以学习如何使用 PyTorch 进行数据处理、模型构建、训练和评估&…...
本地部署Stable Diffusion生成爆火的AI图片
直接上代码 Mapping("/send") Post public Object send(Body String promptBody) { JSONObject postSend new JSONObject(); System.out.println(promptBody); JSONObject body JSONObject.parseObject(promptBody); List<S…...
CCF-CSP历年真题答案1,2
本文代码主要来自up主圣斗士-DS-ALGO对历年真题的讲解,在此特别感谢。 侵权则删。 10.1_分蛋糕_2017_03 #include <iostream> using namespace std;int main() {int a[1000], n, k; // 定义数组a用于存储蛋糕的重量,整数n表示蛋糕的数量…...
【MySQL】一篇讲懂什么是聚簇索引和非聚簇索引(二级索引)以及什么是回表?
1.聚簇索引: 叶子节点直接存储了完整的数据行。 每个表只能有一个聚簇索引,通常是主键(Primary Key)。如果没有定义主键,则MySQL会选择一个唯一且非空索引作为聚簇索引。 特点: 数据存储:叶子结点存储完整的数据行…...
炫酷的HTML5粒子动画特效实现详解
炫酷的HTML5粒子动画特效实现详解 这里写目录标题 炫酷的HTML5粒子动画特效实现详解项目介绍技术栈项目架构1. HTML结构2. 样式设计 核心实现1. 粒子类设计2. 动画效果实现星空效果烟花效果雨滴效果 3. 鼠标交互 性能优化效果展示总结 项目介绍 本文将详细介绍如何使用HTML5 C…...
go-zero学习笔记
内容不多,只有部分笔记,剩下的没有继续学下去,包括路由与处理器、日志中间件、请求上下文 文章目录 1、go-zero核心库1.1 路由与处理器1.2 日志中间件1.3 请求上下文 1、go-zero核心库 1.1 路由与处理器 package mainimport ("github…...
QuecPython 网络协议之TCP/UDP协议最祥解析
概述 IP 地址与域名 IP 地址是网络中的主机地址,用于两台网络主机能够互相找到彼此,这也是网络通信能够成功进行的基础。IP 地址一般以点分十进制的字符串来表示,如192.168.1.1。 我们日常访问的网站,其所在的服务器主机都有…...
FPGA_YOLO(二)
上述对cnn卷积神经网络进行介绍,接下来对YOLO进行总结,并研究下怎么在FPGA怎么实现的方案。 对于一个7*7*30的输出 拥有49个cell 每一个cell都有两个bbox两个框,并且两个框所包含的信息拥有30个 4个坐标信息和一个置信度5个,剩下就是20个类别。 FPGA关于YOLO的部署 1…...
Camera2 与 CameraX 闲谈
目录 📂 前言 1. 🔱 Camera2 2. 🔱 CameraX 3. 🔱 Camera2 与 CameraX 1)使用复杂度与开发效率 2)控制能力与应用场景 3)设备兼容性与稳定性 4)更新与维护 4. 💠…...
【零基础入门unity游戏开发——2D篇】2D物理系统 —— 2D刚体组件(Rigidbody 2d)
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...
【论文#目标检测】YOLO9000: Better, Faster, Stronger
目录 摘要1.引言2.更好(Better)3.更快(Faster)4.更健壮(Stronger)使用 WordTree 组合数据集联合分类和检测评估 YOLO9000 5.结论 Author: Joseph Redmon; Ali Farhadi Published in: 2017 IEEE Conference …...
C++异常处理时的异常类型抛出选择
在 C 中选择抛出哪种异常类型,主要取决于错误的性质以及希望传达的语义信息。以下是一些指导原则,帮助在可能发生异常的地方选择合适的异常类型进行抛出: 1. std::exception 适用场景:作为所有标准异常的基类,std::e…...
centos 7 搭建FTP user-list用户列表
在 CentOS 7 上搭建基于 user_list 的 FTP 用户列表,你可以按以下步骤操作: 1. 安装 vsftpd 服务 若还未安装 vsftpd,可以使用以下命令进行安装: bash yum install -y vsftpd2. 启动并设置开机自启 vsftpd 服务 bash systemctl…...
vulnhub-Tr0ll ssh爆破、wireshark流量分析,exp、寻找flag。思维导图带你清晰拿到所以flag
vulnhub-Tr0ll ssh爆破、wireshark流量分析,exp、寻找flag。思维导图带你清晰拿到所以flag 1、主机发现 arp-scan -l 2、端口扫描 nmap -sS -sV 192.168.66.185 nmap -sS -A -T4 -p- 192.168.66.185 nmap --scriptvuln 192.168.66.185经典扫描三件套,…...
k8s中service概述(二)NodePort
NodePort 是 Kubernetes 中一种用于对外暴露服务的 Service 类型。它通过在集群的每个节点上开放一个静态端口(NodePort),使得外部用户可以通过节点的 IP 地址和该端口访问集群内部的服务。以下是关于 NodePort Service 的详细说明࿱…...
搭建Redis哨兵集群
停掉现有的redis集群 因为这篇文章我是在 搭建完redis主从集群之后写的,如果要是没有搭建过这些,可以直接略过。要是从我上一篇 搭建redis主从集群过来的,可以执行下。 docker compose down 查找下redis相关进程 ps -ef | grep redis 可以看…...
.Net SSO 单点登录方式
SSO单点登录目的 之前一般来讲系统简单,登录后 本地 cookie 加服务器 session 存储用户身份信息,以此为依据来判断用户再次登录时免验证 但随着互联网发展,很多应用 部署在不同的服务器上,而用户体系是一套,那么按照原…...
SQL 基础 BETWEEN 的常见用法
在SQL中,BETWEEN是一个操作符,用于选取介于两个值之间的数据。 它包含这两个边界值。BETWEEN操作符常用于WHERE子句中,以便选取某个范围内的值。 以下是BETWEEN的一些常见用法: 选取介于两个值之间的值: 使用 BETWE…...
ngx_http_add_location
声明在 src\http\ngx_http_core_module.c ngx_int_t ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,ngx_http_core_loc_conf_t *clcf); 定义在 src\http\ngx_http.c ngx_int_t ngx_http_add_location(ngx_conf_t *cf, ngx_queue_t **locations,ngx_http…...
深入探索ArkUI中的@LocalBuilder装饰器:构建高效可维护的UI组件
在ArkUI框架中,组件化开发是提升代码复用性和维护性的关键手段。随着项目复杂度的增加,开发者常常面临如何在保持组件封装性的同时,灵活处理组件内部逻辑的问题。传统的Builder装饰器虽然提供了强大的自定义构建能力,但在某些场景…...
视频知识库初步设想
将视频字幕提取出来作为知识库来源定位,下一步设想:把视频上的图片信息也精简出来作为定位。 下面是测试例子: 入参: {"model":"deepseek-ai/DeepSeek-R1-Distill-Llama-8B","messages":[{"role":"system","cont…...
微信小程序中使用Less样式方法
在微信小程序中使用Less样式,可以通过以下步骤实现。主要原理是借助Visual Studio Code(VSCode)的插件将Less文件自动编译为小程序支持的.wxss文件,或通过微信开发者工具的扩展功能直接集成Less编译环境。以下是具体方法ÿ…...
2024年MathorCup数学建模A题移动通信网络中PCI规划问题解题全过程文档加程序
2024年第十四届MathorCup高校数学建模挑战赛 A题 移动通信网络中PCI规划问题 原题再现: 物理小区识别码(PCI)规划是移动通信网络中下行链路层上,对各覆盖小区编号进行合理配置,以避免PCI冲突、PCI混淆以及PCI模3干扰等现象。PCI规划对于减少…...
本周安全速报(2025.3.18~3.24)
合规速递 01 2025欧洲网络安全报告:DDoS攻击同比增长137%,企业应如何应对? 原文: https://hackread.com/european-cyber-report-2025-137-more-ddos-attacks/ 最新的Link11《欧洲网络安全报告》揭示了一个令人担忧的趋势:DDo…...
力扣刷题-热题100题-第23题(c++、python)
206. 反转链表 - 力扣(LeetCode)https://leetcode.cn/problems/reverse-linked-list/solutions/551596/fan-zhuan-lian-biao-by-leetcode-solution-d1k2/?envTypestudy-plan-v2&envIdtop-100-liked 常规法 记录前一个指针,当前指针&am…...
YAML是什么?
YAML(YAML Ain’t Markup Language)是一种以数据为中心、高度可读的序列化语言,广泛应用于配置文件、数据交换和自动化工具中。以下从多个维度对其进行全面解析: 1. 定义与历史演变 全称与定位: YAML的全称最初为“Yet…...
期权交易投资怎么操作?新手期权操作指南
期权就是股票,唯一区别标的物上证指数,会看大盘吧,新手做期权交易两个方向认购做多,认沽做空,双向t0交易没了,跟期货一样,对的,玩的也是合约,唯一区别没有保证金不会爆仓…...