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

Android14 系统左右声音通道设置代码

Android14 系统左右声音通道设置代码

文章目录

  • Android14 系统左右声音通道设置代码
    • 一、前言
    • 二、系统级设置左右声音通道分析
      • 1、各方案设置左右声音通道的主要代码
        • (1)3588 Android13 方案的实现
        • (2)9679 Android14 方案的实现
        • (3)311D2 Android13 方案的实现
      • 2、串口验证左右声道平衡设置
      • 3、AudioService.java 监听并设置左右声音通道平衡
      • 4、AudioSystem.java 上层设置左右声音通道平衡的主要代码
    • 三、其他
      • 1、Android设置左右声音通道代码小结
        • (1)串口设置左右平衡声音通道:
      • 2、为啥不用方案需要调用不同的声音通道接口实现?

一、前言

Android 系统左右声音通道设置在有些场景下会有用,信源或者多音箱的条件下可能需要设置,
还有些需求比如:用户偏好设置、将声音定位到特定方向,提升沉浸感。

最简单的理解:

比如耳机接入Android设备后,设置声音通道左平衡,只有左边的耳机出声;
设置声音通道右平衡,只有右边的耳机出声;

上面这样就可以简单验证系统左右声音通道是否有效。

网上基本找不到系统级的设置左右声音通道的代码,即使使用AI工具也搜不到。
网上设置左右声音通道都是针对某个播放媒体对象进行设置,并不是全局的。
网上设置左右声音通道关键部分代码如下:

    // 1、应用左右声道平衡,audioTrack 设置for (int i = 0; i < audioData.length; i += 2) {audioData[i] = (short) (audioData[i] * leftVolume); // 左声道audioData[i + 1] = (short) (audioData[i + 1] * rightVolume); // 右声道}audioTrack.write(audioData, 0, audioData.length);// 2、应用左右声道平衡,MediaPlayer 设置mediaPlayer = MediaPlayer.create(this, R.raw.your_audio_file);if (mediaPlayer != null) {// 设置左声道音量为 0.2,右声道音量为 0.8mediaPlayer.setVolume(0.2f, 0.8f);mediaPlayer.start();}

上面的两种方法都是针对某个音频流对象,并不针对系统的。

那么系统有接口方法吗?

其实是有设置左右声音通道接口的,本文记录总结一下。

二、系统级设置左右声音通道分析

目前接触的系统芯片方案主要有:RK、MTK、AML;他们的设置左右声音通道代码居然都不一样。

1、各方案设置左右声音通道的主要代码

(1)3588 Android13 方案的实现
    @Overridepublic int getBalance() throws RemoteException {float result = 0.0f;int value_int = 0;String value = "";try {result = Settings.System.getFloatForUser(mContext.getContentResolver(),Settings.System.MASTER_BALANCE, UserHandle.USER_CURRENT);value_int = (int) Math.round(result);Log.d(TAG,"getBalance result == " + result+",value_int:"+value_int);} catch (Exception e) {e.printStackTrace();}return value_int;}@Overridepublic void setBalance(int balance) throws RemoteException {synchronized (lock) {Settings.System.putFloatForUser(mContext.getContentResolver(),Settings.System.MASTER_BALANCE, uiValue2parameterValue(balance), UserHandle.USER_CURRENT);}}//将UI 输入值 [-50, 50] 映射到 参数范围 [-1.0, 1.0]public  float uiValue2parameterValue(int value) {float y = ((float)(value + 50) / 50) - 1.0f;return y;}

上面看起来是比较原生的设置代码;
通过读取和设置 Settings.System.MASTER_BALANCE 的值设置左右声音平衡
系统中的 System.MASTER_BALANCE 的是值-1f ~ 1f,需要转换成-50 ~ 50
用户获取和设置的左右平衡值范围是-50 ~ 50。

(2)9679 Android14 方案的实现
import com.mediatek.tv.oneworld.tvapi.audio.TvAudioManager; //mtk apiprivate TvAudioManager mTvAudioManager;mTvAudioManager = new TvAudioManager(mContext);@Overridepublic int getBalance() throws RemoteException {int result = mTvAudioManager.get(mContext, TvAudioManager.CFG_AUD_AUD_BALANCE, 0);DebugLog.debug("getBalance result == " + result);return result;}@Overridepublic void setBalance(int balance) throws RemoteException {// balance : (-50 ~ 50)mTvAudioManager.set(mContext, TvAudioManager.CFG_AUD_AUD_BALANCE, String.valueOf(balance));DebugLog.debug("setBalance: balance == " + balance);}
(3)311D2 Android13 方案的实现
        import com.droidlogic.app.AudioEffectManager; //AML方案private AudioEffectManager mAudioEffectManager;public SkgVoiceService(Context applicationContext) {mContext = applicationContext;mAudioEffectManager = AudioEffectManager.getInstance(applicationContext);DebugLog.debug("");}@Overridepublic int getBalance() throws RemoteException {int result = mAudioEffectManager.getBalanceStatus();DebugLog.debug("getBalance result == " + result);return result;}@Overridepublic void setBalance(int balance) throws RemoteException {mAudioEffectManager.setBalance(balance);DebugLog.debug("setBalance and no return balance == " + balance);}

后面的MTK 和AML 方案上,实现都不一样,都是供应商封装的接口;
通过Settings属性查看并没有修改上层的 System.MASTER_BALANCE 属性值;
可能是直接控制底层接口完成的左右声音通道平衡设置,这里不进行深入研究。

从上面的代码看,RK实现左右声音通道平衡设置的代码可以移植使用。

那么其他方案也可以用Settings属性值设置的方式吗?

2、串口验证左右声道平衡设置

属性:Settings.System.MASTER_BALANCE 的设置和读取:
settings 属性名称都是纯小写的。

settings get  system master_balance //获取当前左右声音通道平衡值,默认 nullsettings put system master_balance -1 //设置左平衡,左边音箱出声
settings put system master_balance 1 //设置右平衡,右边音箱出声
settings put system master_balance 0 //设置左右平衡,左右音箱都出声,默认情况

通过串口命令验证了下确实可用。MTK方案上试了有用。

为啥会有用呢,应该是系统某个地方监听了settings属性变化,
最后调用某个接口,实现了调用逻辑。

查看了系统代码,确实有监听的地方,就在 AudioService.java

3、AudioService.java 监听并设置左右声音通道平衡

framework\base\services\core\java\com\android\server\audio\AudioService.java

下面是主要代码:

private class SettingsObserver extends ContentObserver {SettingsObserver() {super(new Handler());
... //十几个Settings 属性状态的监听mContentResolver.registerContentObserver(Settings.Global.getUriFor(Settings.Global.DOCK_AUDIO_MEDIA_ENABLED), false, this);mContentResolver.registerContentObserver(Settings.System.getUriFor(Settings.System.MASTER_MONO), false, this);//这个有注册监听 Settings.System.MASTER_BALANCE 的变化mContentResolver.registerContentObserver(Settings.System.getUriFor(Settings.System.MASTER_BALANCE), false, this);}@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);synchronized (mSettingsLock) {readDockAudioSettings(mContentResolver); //读取停靠音频设置updateMasterMono(mContentResolver); //更新主声道单声道updateMasterBalance(mContentResolver); //更新主声道平衡,左右声音通道平衡设置updateEncodedSurroundOutput(); //更新编码环绕声输出sendEnabledSurroundFormats(mContentResolver, mSurroundModeChanged); //发送启用的环绕声格式updateAssistantUIdLocked(/* forceUpdate= */ false); //并更新助手UID(不强制更新)}}...}//继续追踪左右声道平衡的代码逻辑private void updateMasterBalance(ContentResolver cr) {//或者左右声音通道平衡的具体值final float masterBalance = System.getFloatForUser(cr, System.MASTER_BALANCE, 0.f /* default */, UserHandle.USER_CURRENT);if (DEBUG_VOL) { // DEBUG_VOL 默认trueLog.d(TAG, String.format("Master balance %f", masterBalance));}//调用 AudioSystem.setMasterBalance 方法设置左右声音通道if (AudioSystem.setMasterBalance(masterBalance) != 0) {Log.e(TAG, String.format("setMasterBalance failed for %f", masterBalance));}}

上面可以看到左右声音通道平衡的设置最终是调用了 AudioSystem 的接口方法。

import android.media.AudioSystem;
AudioSystem.setMasterBalance(masterBalance); //设置值范围:-1f ~ 1f

AudioSystem 接口和方法默认是隐藏的,系统framework中可以调用到。
系统签名应用也是无法调用到,需要导入系统的framework jar包就可能调用到AudioSystem 的类。

4、AudioSystem.java 上层设置左右声音通道平衡的主要代码

framework\base\media\java\android\media\AudioSystem.java

/*** @hide*/
@TestApi
public class AudioSystem
{private static final boolean DEBUG_VOLUME = false;private static final String TAG = "AudioSystem";// private constructor to prevent instantiating AudioSystemprivate AudioSystem() { //不能 newthrow new UnsupportedOperationException("Trying to instantiate AudioSystem");}//暴露的都是静态方法,所以不用new。/** @hide returns master balance value in range -1.f -> 1.f, where 0.f is dead center. */@TestApi@RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS)public static native float getMasterBalance();/** @hide Changes the audio balance of the device. */@TestApi@RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_SETTINGS)public static native int setMasterBalance(float balance);}

上面已有提示 左右声音通道的值范围是:-1.f -> 1.f

声音通道平衡的具体实现是nativie的调用,后续不做进一步分析。
有兴趣的自行查阅:framework\base\core\jni\android_media_AudioSystem.cpp

三、其他

1、Android设置左右声音通道代码小结

(1)串口设置左右平衡声音通道:
settings get  system master_balance //获取当前左右声音通道平衡值,默认 nullsettings put system master_balance -1 //设置左平衡,左边音箱出声
settings put system master_balance 1 //设置右平衡,右边音箱出声
settings put system master_balance 0 //设置左右平衡,左右音箱都出声,默认情况

Android 原生设置左右声音通道代码:

//1、Settings属性设置,AudioService.java 有监听变化和调用接口Settings.System.putFloat(mContext.getContentResolver(),Settings.System.MASTER_BALANCE, balance);//2、AudioSystem 的静态方法
AudioSystem.setMasterBalance(masterBalance)

如果是系统签名应用,但是又没有导入framework的jar包,
是无法识别AudioSystem的,并且System.MASTER_BALANCE 也是无法识别的;

可以使用代码直接设置具体属性就行:

 Settings.System.putFloat(mContext.getContentResolver(), "master_balance", balance);

2、为啥不用方案需要调用不同的声音通道接口实现?

这里不去看他们的具体实现,直接简单分析一下。

对比了不同的Android版本的系统代码:

Android 9或者更旧的代码 AudioSystem.java 里面是没有setMasterBalance方法的;
Android11 的系统代码中是有AudioSystem.setMasterBalance 方法的。

所以之前Android9之前的版本,不得不使用自定义的接口调用底层声音设置。
所以不同供应商提供的调用接口是有差异的。
这个只是我的一个猜测哈。

测试了一下MTK方案:

使用供应商提供的设置声音接口或者使用Settings属性都是可以设置左右声音通道平衡的;
但是有个小问题:Settings属性设置左声道后,再次调用供应商的接口设置左声道或者右声道,会导致设备没有声音;
重新用供应商的接口设置左右声音通道值为0 ,设备就有声音了。

估计是底层兼容有问题!同时设置可能标志位会错乱。
如果能只用Google接口实现是最好的。毕竟Google考虑的应该比较全一点。

最近也是发现一个供应商的蓝牙音箱左右声音通道问题:
连接耳机设置左右声音通道都是没有问题的。

AML 和MTK 的方案都是存在的:
连接多音箱的蓝牙设备,设置左右声音通道没有用!
RK 的方案是没有问题的,因为它是使用的Google原生接口设置的左右声音通道实现。

这种情况有可能就是 AML 和MTK 的方案 没有考虑蓝牙连接下的左右声音通道平衡导致 。

相关文章:

Android14 系统左右声音通道设置代码

Android14 系统左右声音通道设置代码 文章目录 Android14 系统左右声音通道设置代码一、前言二、系统级设置左右声音通道分析1、各方案设置左右声音通道的主要代码&#xff08;1&#xff09;3588 Android13 方案的实现&#xff08;2&#xff09;9679 Android14 方案的实现&…...

【Golang】go如何通过atomic原子操作来确保数据一致性

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

2025年汽车加气站操作工考试精选题库

汽车加气站操作工题库中题目及答案&#xff1a; 单项选择题 1、按压力容器的设计压力分为&#xff08; &#xff09;个压力等级。 A. 3 B. 4 C. 5 答案&#xff1a;B 2、缓冲罐的安装位置在天然气压缩机&#xff08; &#xff09;。 A. 前 B. 后 C. 中间 答案&#…...

LLVM学习--外部项目

不包含于核心LLVM和Clang存储库的项目需要单独下载。在本章中&#xff0c;我们将介绍各种其他官方LLVM项目&#xff0c;并介绍如何构建和安装它们。仅仅对核心LLVM工具感兴趣的读者可以跳过本章&#xff0c;或者在需要的时候翻阅。 在本章中&#xff0c;我们将介绍以下项目安装…...

AUTOSAR_DoIP_Detailed

AUTOSAR DoIP模块详解 基于AUTOSAR标准的诊断通信协议实现 目录 架构概述通信流程消息格式配置结构详细序列总结1. 架构概述 1.1 模块架构 DoIP模块是AUTOSAR基础软件中负责诊断通信的核心组件。它通过TCP/IP网络实现诊断工具与ECU之间的通信。主要功能包括: 基础功能 基于UD…...

C语言:(大数相加版)数字阶梯求和

题目&#xff1a; 给定a和n&#xff0c;计算aaaaaaa...a(n个a)的和。 输入 测试数据有多组&#xff0c;输入a&#xff0c;n&#xff08;1<a<9,1<n<100&#xff09;。 输出 对于每组输入,请输出结果。 分析&#xff1a; 1. 方式和规定&#xff1a;大数相加必然越界…...

Echarts 折线图

功能 每月记录值&#xff0c;当数据大于600画红线&#xff0c;小于300画蓝线&#xff0c;其他在中间值为黑线。鼠标移动上去后&#xff0c;现在数据值。 option {tooltip: {trigger: axis, // 触发类型&#xff1a;坐标轴触发show: true, // 显示提示框formatter: function …...

element-plus中Dropdown下拉菜单组件的使用

1、基本使用 复制下面的代码&#xff1a; <!-- 选择查询类型 --> <el-dropdown trigger"click"><span class"el-dropdown-link"><span style"width:60px;color:#404040">查询类型</span><el-icon class"e…...

Kafka详解——介绍与部署

1. 什么是 Kafka&#xff1f; Kafka 是一个分布式的消息队列系统&#xff0c;最初由 LinkedIn 开发&#xff0c;后来成为 Apache 开源项目。它的主要用途包括实时数据处理、日志收集、数据流管道构建等。Kafka 具备高吞吐量、可扩展性、持久性和容错性&#xff0c;广泛应用于大…...

ngx_http_core_srv_conf_t

定义在 src\http\ngx_http_core_module.h typedef struct {/* array of the ngx_http_server_name_t, "server_name" directive */ngx_array_t server_names;/* server ctx */ngx_http_conf_ctx_t *ctx;u_char *file_…...

4.angular 服务

服务是在controller里面引入的服务&#xff1a; 最好是内部服务在前面&#xff0c;自定义服务在后面 内部服务 $scope $scope.$watch(‘属性名’, function(newVal, oldVal) {}, true) true是深度监听,对象函数等$scope.$apply 触发页面更新,里面传入回调函数,比如说之前那个…...

[动手学习深度学习]26. 网络中的网络 NiN

前面的LeNet、AlexNet、VGG在设计上的共同之处在于&#xff1a;先以卷积层构成的模块充分抽取空间特征&#xff0c;再以全连接层构成的模块来输出分类结果 其中AlexNet和VGG对LeNet的改进主要在于如何对这两个模块价款&#xff08;增加通道数&#xff09;和加深 这一节的NiN提出…...

【设计模式】原型模式

三、原型模式 3.2 原型模式 同工厂模式一样&#xff0c;原型(Prototype) 模式也是一种创建型模式。原型模式通过一个对象 (原型对象)克隆出多个一模一样的对象。实际上&#xff0c;该模式与其说是一种设计模式&#xff0c;不如说是 一种创建对象的方法(对象克隆),尤其是创建给…...

力扣题目汇总 使用贪心算法解决问题

贪心算法是一种通过局部最优解来获得全局最优解的算法。它的核心思想是&#xff1a;在每一步中选择当前看起来最优的解&#xff0c;并希望通过一系列局部最优选择最终得到全局最优解。 121.买卖股票的最佳时机 分析&#xff1a; 在每一天求出当前最优的利润&#xff0c;也就…...

Mac下Ollama安装全攻略:开启本地大模型之旅

文章目录 Mac下Ollama安装全攻略&#xff1a;开启本地大模型之旅一、Ollama 是什么功能特点优势应用场景 二、安装前准备&#xff08;一&#xff09;系统要求&#xff08;二&#xff09;硬件要求 三、下载安装包&#xff08;一&#xff09;官网下载&#xff08;二&#xff09;其…...

[HelloCTF]PHPinclude-labs超详细WP-Level 1-FILE协议

源码分析 <?php include("get_flag.php");isset($_GET[wrappers]) ? include("file://".$_GET[wrappers]) : ;highlight_file(__FILE__); ?>第一句 include("get_flag.php");, 使代码包含了 get_flag.php 的内容 大概是生成 Flag 之类的…...

Skia 图形引擎介绍

文章目录 一、Skia 的基本概念1. 定位与作用2. 历史背景 二、Skia 的核心架构1. 模块化设计2. 渲染流程3. 跨平台适配 三、Skia 在 Flutter 中的角色1. 自绘 UI 的核心依赖2. 跨平台一致性3. 性能优化 四、Skia 的性能优势1. 高效的图形处理2. 与原生渲染的对比3. 性能瓶颈 五、…...

构建高可靠NFS存储:自动化挂载保障机制的设计与优势

一、背景与需求场景 在分布式系统或集群架构中&#xff0c;NFS&#xff08;Network File System&#xff09;是跨节点共享存储的经典方案。然而&#xff0c;传统/etc/fstab配置的静态挂载方式存在明显缺陷&#xff1a; 服务启动顺序不可控&#xff0c;网络未就绪时挂载失败临…...

Spring Boot对接twilio发送邮件信息

要在Spring Boot应用程序中对接Twilio发送邮件信息&#xff0c;您可以使用Twilio的SendGrid API。以下是一个简单的步骤指南&#xff0c;帮助您完成这一过程&#xff1a; 1. 创建Twilio账户并获取API密钥 注册一个Twilio账户&#xff08;如果您还没有的话&#xff09;。在Twi…...

如何创建并保存HTML文件?零基础入门教程

原文&#xff1a;如何创建并保存HTML文件&#xff1f;零基础入门教程 | w3cschool笔记 本文将以Windows系统为例&#xff0c;教你用最简单的记事本创建并保存第一个HTML网页。 &#x1f4dd; 第一步&#xff1a;准备工具 文本编辑器&#xff1a;使用系统自带的记事本&#xff…...

vue3 + css 列表无限循环滚动+鼠标移入停止滚动+移出继续滚动

1.动画文件.vue <template><div class"dashboard" click"setFullScreen"><div class"warp-box"><el-scrollbar ref"scrollRef" height"100%" scroll"handelScroll"><div class"…...

C#的简单工厂模式、工厂方法模式、抽象工厂模式

工厂模式是一种创建型设计模式&#xff0c;主要将对象的创建和使用分离&#xff0c;使得系统更加灵活和可维护。常见的工厂模式有简单工厂模式、工厂方法模式和抽象工厂模式&#xff0c;以下是 C# 实现的三个案例&#xff1a; 简单工厂模式 简单工厂模式通过一个工厂类来创建…...

Vue:Vue2和Vue3创建项目的几种常用方式以及区别

前言 Vue.js 和 Element UI 都是用 JavaScript 编写的。 1、Vue.js 是一个渐进式 JavaScript 框架。2、Element UI 是基于 Vue.js 的组件库。3、JavaScript 是这两个项目的主要编程语言。 而Element Plus是基于TypeScript开发的。 一、Vue2 1、基于vuecli工具创建 vue2 …...

C++ list类

C list类 目录 C list类引言1.list的使用1.1 list的构造1.2 list的iterator的使用1.3 list capacity1.4 list element acess1.5 list modifiers 2. list的迭代器失效3. list的模拟实现3.1 List.h文件3.2 List的反向迭代器 4.list与vector的对比 引言 在C标准库中&#xff0c;l…...

LeetCode 热题 100_跳跃游戏(78_55_中等_C++)(贪心算法)

LeetCode 热题 100_跳跃游戏&#xff08;78_55&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;贪心算法&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;贪心算法&#xff09;&am…...

【Redis】Redis的数据删除(过期)策略,数据淘汰策略。

如果问到&#xff1a;假如Redis的key过期之后&#xff0c;会立即删除吗&#xff1f; 其实就是想问数据删除(过期)策略。 如果面试官问到&#xff1a;如果缓存过多&#xff0c;内存是有限的&#xff0c;内存被占满了怎么办&#xff1f; 其实就是问&#xff1a;数据的淘汰策略。…...

C++和标准库速成(八)——指针、动态数组、const、constexpr和consteval

目录 1. 指针和动态数组1.1 栈和自由存储区1.2 使用指针1.3 动态分配的数组1.4 空指针常量 2. const2.1 const修饰类型2.2 const与指针2.3 使用const保护参数2.4 const方法(建议&#xff09; 3. constexpr4. consteval参考 1. 指针和动态数组 动态内存允许所创建的程序具有在编…...

深入解析 Spring Boot 中的 FailureAnalyzer

深入解析 Spring Boot 中的 FailureAnalyzer 在 Spring Boot 应用中&#xff0c;我们难免会遇到启动失败的情况&#xff0c;而默认的异常信息往往过于复杂&#xff0c;导致排查问题变得困难。Spring Boot 提供了一套强大的 FailureAnalyzer 机制&#xff0c;能够捕获常见的异常…...

20. Excel 自动化:Excel 对象模型

一 Excel 对象模型是什么 Excel对象模型是Excel图形用户界面的层次结构表示&#xff0c;它允许开发者通过编程来操作Excel的各种组件&#xff0c;如工作簿、工作表、单元格等。 xlwings 是一个Python库&#xff0c;它允许Python脚本与Excel进行交互。与一些其他Python库&#x…...

【Matlab GUI】封装matlab GUI为exe文件

注&#xff1a;封装后的exe还是需要有matlab环境才能运行 &#xff08;1&#xff09;安装MCRinstaller.exe文件&#xff0c;在matlab安装目录下的toolbox/compiler/deploy/win64文件夹里 &#xff08;2&#xff09;安装完MCRinstaller.exe&#xff0c;字命令窗口输入&#x…...

ModBus TCP/RTU互转(主)(从)|| Modbus主动轮询下发的工业应用 || 基于智能网关的串口服务器进行Modbus数据收发的工业应用

目录 前言 一、ModBus TCP/RTU互转&#xff08;从&#xff09;及应用|| 1.1 举栗子 二、ModBus TCP/RTU互转&#xff08;主&#xff09; 2.1 举栗子 三、ModBus 主动轮询 3.1 Modbus主动轮询原理 3.2 Modbus格式上传与下发 3.2.1.设置Modbus主动轮询指令 3.2.2 设…...

Linux top 命令详解:从入门到高级用法

Linux top 命令详解&#xff1a;从入门到高级用法 在 Linux 系统中&#xff0c;top 是一个强大的实时监控工具&#xff0c;用于查看系统资源使用情况和进程状态。它可以帮助你快速了解 CPU、内存、负载等信息&#xff0c;是系统管理员和开发者的日常利器。本文将从基本用法开始…...

【网络协议】基于UDP的可靠协议:KCP

TCP是为流量设计的&#xff08;每秒内可以传输多少KB的数据&#xff09;&#xff0c;讲究的是充分利用带宽。而 KCP是为流速设计的&#xff08;单个数据包从一端发送到一端需要多少时间&#xff09;&#xff0c;以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的传输速度。TCP信…...

【Docker入门】构建推送第一个Docker映像

【Docker入门】构建推送第一个Docker映像 Build and Push the First Docker Image By JacksonML Docker的容器(Container)映像是轻量级的可执行独立包&#xff0c;包含代码、运行时、库、环境变量以及配置文件&#xff0c;它对于运行软件至关重要。注册表可在团队间分享映像。…...

Python----计算机视觉处理(Opencv:图像颜色替换)

一、开运算 开运算就是对图像先进行腐蚀操作&#xff0c; 然后进行膨胀操作。开运算可以去除二值化图中的小的噪点&#xff0c;并分离相连的物体。 其主要目的就是消除那些小白点 在开运算组件中&#xff0c;有一个叫做kernel的参数&#xff0c;指的是核的大小&#xff0c;通常…...

搭建自己的OCR服务

网上看到相关文章&#xff0c;这里整理记录一下&#xff0c;仅供学习。 搭建自己的OCR服务&#xff0c;第一步&#xff1a;选择合适的开源OCR项目 - PandaCode辉 - 博客园 一、OCR是什么&#xff1f; 光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09…...

vue:组件的使用

Vue&#xff1a;组件的使用 1、什么是组件 1.1、传统方式开发的应用 一个网页通常包括三部分&#xff1a;结构&#xff08;HTML&#xff09;、样式&#xff08;CSS&#xff09;、交互&#xff08;JavaScript&#xff09;。在传统开发模式下&#xff0c;随着项目规模的增大&a…...

leetcode日记(105)买卖股票的最佳时机Ⅱ

原本以为是一个很难想的动态规划&#xff0c;没想到是最简单的贪心…… 如果实在想不出就画个折线图&#xff0c;只买上涨的就行了&#xff0c;所有上涨的段都取到。 真的没想到会这么简单…… class Solution { public:int maxProfit(vector<int>& prices) {int …...

7种数据结构

7种数据结构 顺序表sqlite.hseqlite.c 单链表linklist.clinklist.h 双链表doulinklist.cdoulinklist.h 链式栈linkstack.clinkstack.h 队列SeqQueue.cSeqQueue.h 树tree.c 哈希表hash.c 顺序表 sqlite.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ typedef struct person…...

论文阅读:Deep Hybrid Camera Deblurring for Smartphone Cameras

今天介绍一篇 ACM SIGGRAPH 2024 的文章&#xff0c;关于手机影像中的去模糊的文章。 Deep Hybrid Camera Deblurring for Smartphone Cameras Abstract 手机摄像头尽管取得了显著的进步&#xff0c;但由于传感器和镜头较为紧凑&#xff0c;在低光环境下的成像仍存在困难&am…...

Redis 三主三从集群部署的完整方案

一、架构设计原理‌ 分布式数据分片 哈希槽机制‌&#xff1a;Redis Cluster 将数据划分为 16384 个槽位&#xff0c;每个主节点负责部分槽位&#xff08;如主节点1管理槽0-5460&#xff0c;主节点2管理5461-10922等&#xff09;。 自动负载均衡‌&#xff1a;数据按哈希值分配…...

C++项目:高并发内存池_上

目录 1. 项目介绍 2. 内存池概念 2.1 池化技术 2.2 内存池和内存碎片 2.3 细看malloc 3. 定长内存池的实现 ObjectPool.hpp 4. 高并发内存池框架 5. thread cache测试 5.1 thread cache框架 5.2 ConcurrentAlloc.hpp 6. central cache测试 6.1 central cache框架 …...

『Plotly实战指南』--折线图绘制基础篇

在数据分析的世界中&#xff0c;折线图是一种不可或缺的可视化工具。 它能够清晰地展示数据随时间或其他变量的变化趋势&#xff0c;帮助我们快速发现数据中的模式、趋势和异常。 无论是金融市场分析、气象数据监测&#xff0c;还是业务增长趋势预测&#xff0c;折线图都能以直…...

【css酷炫效果】纯CSS实现波浪形分割线

【css酷炫效果】纯CSS实现波浪形分割线 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492023 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚看到csdn出活动了&…...

【资料分享】全志科技T113-i全国产(1.2GHz双核A7 RISC-V)工业核心板规格书

核心板简介 创龙科技SOM-TLT113 是一款基于全志科技T113-i 双核ARM Cortex-A7 玄铁C906 RISC-V HiFi4 DSP 异构多核处理器设计的全国产工业核心板&#xff0c;ARM Cortex-A7 处理单元主频高达1.2GHz。核心板 CPU、ROM、RAM、电源、晶振等所有元器件均采用国产工业级方案&…...

Coco AI 智能检索 Hugo Blog 集成指南

在此前的文章中&#xff0c;我们介绍了如何使用 Coco Server 连接 Notion&#xff0c;实现智能内容检索。本次&#xff0c;我们将进一步探索如何在 Coco Server 最新版本 中集成 Hugo Site&#xff0c;以便对 Hugo 站点 进行高效检索。 Coco Server 部署方式 要在本地或服务器…...

【MySQL数据库】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法

在DQL的基础查询中&#xff0c;我们已经学过了多表查询的一种&#xff1a;联合查询&#xff08;union&#xff09;。本文我们将系统的讲解多表查询。 笛卡尔积现象 首先&#xff0c;我们想要查询emp表和stu表两个表&#xff0c;按照我们之前的知识栈&#xff0c;我们直接使用…...

jmeter将返回的数据写入csv文件

举例说明&#xff0c;我需要接口返回体中的exampleid与todoid的数据信息&#xff08;使用边界提取器先将其提取&#xff09;&#xff0c;并将其写入csv文件进行保存 使用后置处理器BeanShell 脚本实例如下 import java.io.*;// 设置要写入的文件路径 String filePath "…...

AI如何在财务工作中提升效率的一些看法

文章目录 1. 自动化重复性任务2. 财务预测与分析3. 欺诈检测与风险管理4. 智能报表与决策支持5. 税务管理优化6. 提升团队协作与客户体验未来的趋势与挑战结论 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;其正全方位地革新各行各业的运作模式&#xff0…...

OpenCV入门指南:从安装到基本操作

引言 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它包含了数百种计算机视觉算法&#xff0c;广泛应用于图像处理、视频分析、物体检测、人脸识别等领域。本文将带你从安装OpenCV开始&#xff0c;逐步了解其基…...